Compare commits

...

3 Commits

Author SHA1 Message Date
github-actions[bot] c68e134951 v3 new release (#196) 2022-06-15 10:17:59 -04:00
github-actions[bot] 17f5181337 v3 new release (#192)
* Make pulling of images switchable (#178)

* Make namespace annotation switchable (#177)

* Bump tmpl from 1.0.4 to 1.0.5 (#152)

Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/daaku/nodejs-tmpl/releases)
- [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5)

---
updated-dependencies:
- dependency-name: tmpl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump ansi-regex from 5.0.0 to 5.0.1 (#166)

Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v5.0.0...v5.0.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump minimist from 1.2.5 to 1.2.6 (#175)

Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add directory functionality (#181)

* Modifying README to include instructions/examples for directory functionality (#183)

* Added some tests, not sure what else to try but gonna think of more examples

* forgot some files

* reverted package-lock.json

* Added empty dir test

* Cleaned up some extra spaces

* Add node modules and compiled JavaScript from main

* forgot to actually include functionality

* removed unnecessary files

* Update .gitignore

* Update .gitignore

* Update .gitignore

* thx david

* renamed searchFilesRec

* integrations test fix

* added examples to README

* added note about depth

* added additional note

* removed ticks

* changed version string

Co-authored-by: Jaiveer Katariya <jaiveerkatariya@Jaiveers-MacBook-Pro.local>
Co-authored-by: Oliver King <oking3@uncc.edu>

* Remove kubectl version example (#188)

* prefix for annotations (#191)

* Add node modules and compiled JavaScript from main

Co-authored-by: Jan Röhrich <roehrijn@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jaiveer Katariya <35347859+jaiveerk@users.noreply.github.com>
Co-authored-by: Jaiveer Katariya <jaiveerkatariya@Jaiveers-MacBook-Pro.local>
Co-authored-by: Oliver King <oking3@uncc.edu>
Co-authored-by: David Gamero <david340804@gmail.com>
2022-06-08 14:02:15 -04:00
github-actions[bot] e3c97bfc20 v3 new release (#182)
* Make pulling of images switchable (#178)

* Make namespace annotation switchable (#177)

* Bump tmpl from 1.0.4 to 1.0.5 (#152)

Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/daaku/nodejs-tmpl/releases)
- [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5)

---
updated-dependencies:
- dependency-name: tmpl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump ansi-regex from 5.0.0 to 5.0.1 (#166)

Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v5.0.0...v5.0.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump minimist from 1.2.5 to 1.2.6 (#175)

Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add directory functionality (#181)

* Add node modules and compiled JavaScript from main

Co-authored-by: Jan Röhrich <roehrijn@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jaiveer Katariya <35347859+jaiveerk@users.noreply.github.com>
Co-authored-by: Oliver King <oking3@uncc.edu>
2022-04-12 13:22:09 -04:00
190 changed files with 25530 additions and 19169 deletions
+6 -2
View File
@@ -21,11 +21,15 @@ jobs:
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Building latest changes - name: Install dependencies
run: | run: |
rm -rf node_modules/ rm -rf node_modules/
npm install npm install
npm run build
- name: Install ncc
run: npm i -g @vercel/ncc
- name: Build
run: ncc build src/run.ts -o lib
- name: Set name of ns - name: Set name of ns
run: echo "::set-output name=name::$(echo `date +%Y%m%d%H%M%S`)" run: echo "::set-output name=name::$(echo `date +%Y%m%d%H%M%S`)"
+2 -2
View File
@@ -2,11 +2,11 @@ name: "Run unit tests."
on: # rebuild any PRs and main branch changes on: # rebuild any PRs and main branch changes
pull_request: pull_request:
branches: branches:
- master - main
- "releases/*" - "releases/*"
push: push:
branches: branches:
- master - main
- "releases/*" - "releases/*"
jobs: jobs:
+24 -14
View File
@@ -42,7 +42,7 @@ Following are the key capabilities of this action:
</tr> </tr>
<tr> <tr>
<td>manifests </br></br>(Required)</td> <td>manifests </br></br>(Required)</td>
<td>Path to the manifest files to be used for deployment</td> <td>Path to the manifest files to be used for deployment. These can also be directories containing manifest files, in which case, all manifest files in the referenced directory at every depth will be deployed. Files not ending in .yml or .yaml will be ignored.</td>
</tr> </tr>
<tr> <tr>
<td>namespace </br></br>(Optional) <td>namespace </br></br>(Optional)
@@ -57,6 +57,10 @@ Following are the key capabilities of this action:
<tr> <tr>
<td>imagepullsecrets </br></br>(Optional)</td> <td>imagepullsecrets </br></br>(Optional)</td>
<td>Multiline input where each line contains the name of a docker-registry secret that has already been setup within the cluster. Each of these secret names are added under imagePullSecrets field for the workloads found in the input manifest files</td> <td>Multiline input where each line contains the name of a docker-registry secret that has already been setup within the cluster. Each of these secret names are added under imagePullSecrets field for the workloads found in the input manifest files</td>
</tr>
<tr>
<td>pull-images</br></br>(Optional)</td>
<td>Acceptable values: true/false</br>Default value: true</br>Switch whether to pull the images from the registry before deployment to find out Dockerfile's path in order to add it to the annotations</td>
</tr> </tr>
<tr> <tr>
<td>strategy </br></br>(Optional)</td> <td>strategy </br></br>(Optional)</td>
@@ -90,6 +94,10 @@ Following are the key capabilities of this action:
<td>force </br></br>(Optional)</td> <td>force </br></br>(Optional)</td>
<td>Deploy when a previous deployment already exists. If true then '--force' argument is added to the apply command. Using '--force' argument is not recommended in production.</td> <td>Deploy when a previous deployment already exists. If true then '--force' argument is added to the apply command. Using '--force' argument is not recommended in production.</td>
</tr> </tr>
<tr>
<td>annotate-namespace</br></br>(Optional)</td>
<td>Acceptable values: true/false</br>Default value: true</br>Switch whether to annotate the namespace resources object or not</td>
</tr>
</table> </table>
## Usage Examples ## Usage Examples
@@ -97,23 +105,21 @@ Following are the key capabilities of this action:
### Basic deployment (without any deployment strategy) ### Basic deployment (without any deployment strategy)
```yaml ```yaml
- uses: Azure/k8s-deploy@v1.4 - uses: Azure/k8s-deploy@v3.1
with: with:
namespace: "myapp" namespace: "myapp"
manifests: | manifests: |
deployment.yaml dir/manifestsDirectory
service.yaml
images: "contoso.azurecr.io/myapp:${{ event.run_id }}" images: "contoso.azurecr.io/myapp:${{ event.run_id }}"
imagepullsecrets: | imagepullsecrets: |
image-pull-secret1 image-pull-secret1
image-pull-secret2 image-pull-secret2
kubectl-version: "latest"
``` ```
### Canary deployment without service mesh ### Canary deployment without service mesh
```yaml ```yaml
- uses: Azure/k8s-deploy@v1.4 - uses: Azure/k8s-deploy@v3.1
with: with:
namespace: "myapp" namespace: "myapp"
images: "contoso.azurecr.io/myapp:${{ event.run_id }}" images: "contoso.azurecr.io/myapp:${{ event.run_id }}"
@@ -123,6 +129,7 @@ Following are the key capabilities of this action:
manifests: | manifests: |
deployment.yaml deployment.yaml
service.yaml service.yaml
dir/manifestsDirectory
strategy: canary strategy: canary
action: deploy action: deploy
percentage: 20 percentage: 20
@@ -131,7 +138,7 @@ Following are the key capabilities of this action:
To promote/reject the canary created by the above snippet, the following YAML snippet could be used: To promote/reject the canary created by the above snippet, the following YAML snippet could be used:
```yaml ```yaml
- uses: Azure/k8s-deploy@v1.4 - uses: Azure/k8s-deploy@v3.1
with: with:
namespace: "myapp" namespace: "myapp"
images: "contoso.azurecr.io/myapp:${{ event.run_id }}" images: "contoso.azurecr.io/myapp:${{ event.run_id }}"
@@ -141,6 +148,7 @@ To promote/reject the canary created by the above snippet, the following YAML sn
manifests: | manifests: |
deployment.yaml deployment.yaml
service.yaml service.yaml
dir/manifestsDirectory
strategy: canary strategy: canary
action: promote # substitute reject if you want to reject action: promote # substitute reject if you want to reject
``` ```
@@ -148,7 +156,7 @@ To promote/reject the canary created by the above snippet, the following YAML sn
### Canary deployment based on Service Mesh Interface ### Canary deployment based on Service Mesh Interface
```yaml ```yaml
- uses: Azure/k8s-deploy@v1.4 - uses: Azure/k8s-deploy@v3.1
with: with:
namespace: "myapp" namespace: "myapp"
images: "contoso.azurecr.io/myapp:${{ event.run_id }}" images: "contoso.azurecr.io/myapp:${{ event.run_id }}"
@@ -158,6 +166,7 @@ To promote/reject the canary created by the above snippet, the following YAML sn
manifests: | manifests: |
deployment.yaml deployment.yaml
service.yaml service.yaml
dir/manifestsDirectory
strategy: canary strategy: canary
action: deploy action: deploy
traffic-split-method: smi traffic-split-method: smi
@@ -168,7 +177,7 @@ To promote/reject the canary created by the above snippet, the following YAML sn
To promote/reject the canary created by the above snippet, the following YAML snippet could be used: To promote/reject the canary created by the above snippet, the following YAML snippet could be used:
```yaml ```yaml
- uses: Azure/k8s-deploy@v1.4 - uses: Azure/k8s-deploy@v3.1
with: with:
namespace: "myapp" namespace: "myapp"
images: "contoso.azurecr.io/myapp:${{ event.run_id }} " images: "contoso.azurecr.io/myapp:${{ event.run_id }} "
@@ -178,6 +187,7 @@ To promote/reject the canary created by the above snippet, the following YAML sn
manifests: | manifests: |
deployment.yaml deployment.yaml
service.yaml service.yaml
dir/manifestsDirectory
strategy: canary strategy: canary
traffic-split-method: smi traffic-split-method: smi
action: reject # substitute reject if you want to reject action: reject # substitute reject if you want to reject
@@ -186,7 +196,7 @@ To promote/reject the canary created by the above snippet, the following YAML sn
### Blue-Green deployment with different route methods ### Blue-Green deployment with different route methods
```yaml ```yaml
- uses: Azure/k8s-deploy@v1.4 - uses: Azure/k8s-deploy@v3.1
with: with:
namespace: "myapp" namespace: "myapp"
images: "contoso.azurecr.io/myapp:${{ event.run_id }}" images: "contoso.azurecr.io/myapp:${{ event.run_id }}"
@@ -206,7 +216,7 @@ To promote/reject the canary created by the above snippet, the following YAML sn
To promote/reject the green workload created by the above snippet, the following YAML snippet could be used: To promote/reject the green workload created by the above snippet, the following YAML snippet could be used:
```yaml ```yaml
- uses: Azure/k8s-deploy@v1.4 - uses: Azure/k8s-deploy@v3.1
with: with:
namespace: "myapp" namespace: "myapp"
images: "contoso.azurecr.io/myapp:${{ event.run_id }}" images: "contoso.azurecr.io/myapp:${{ event.run_id }}"
@@ -216,7 +226,7 @@ To promote/reject the green workload created by the above snippet, the following
manifests: | manifests: |
deployment.yaml deployment.yaml
service.yaml service.yaml
ingress-yml ingress.yml
strategy: blue-green strategy: blue-green
route-method: ingress # should be the same as the value when action was deploy route-method: ingress # should be the same as the value when action was deploy
action: promote # substitute reject if you want to reject action: promote # substitute reject if you want to reject
@@ -263,7 +273,7 @@ jobs:
container-registry-password: ${{ secrets.REGISTRY_PASSWORD }} container-registry-password: ${{ secrets.REGISTRY_PASSWORD }}
secret-name: demo-k8s-secret secret-name: demo-k8s-secret
- uses: Azure/k8s-deploy@v1.4 - uses: Azure/k8s-deploy@v3.1
with: with:
action: deploy action: deploy
manifests: | manifests: |
@@ -309,7 +319,7 @@ jobs:
container-registry-password: ${{ secrets.REGISTRY_PASSWORD }} container-registry-password: ${{ secrets.REGISTRY_PASSWORD }}
secret-name: demo-k8s-secret secret-name: demo-k8s-secret
- uses: Azure/k8s-deploy@v1.4 - uses: Azure/k8s-deploy@v3.1
with: with:
action: deploy action: deploy
manifests: | manifests: |
+8
View File
@@ -15,6 +15,10 @@ inputs:
imagepullsecrets: imagepullsecrets:
description: "Name of a docker-registry secret that has already been set up within the cluster. Each of these secret names are added under imagePullSecrets field for the workloads found in the input manifest files" description: "Name of a docker-registry secret that has already been set up within the cluster. Each of these secret names are added under imagePullSecrets field for the workloads found in the input manifest files"
required: false required: false
pull-images:
description: "Switch whether to pull the images from the registry before deployment to find out Dockerfile's path in order to add it to the annotations"
required: false
default: true
strategy: strategy:
description: "Deployment strategy to be used. Allowed values are none, canary and blue-green" description: "Deployment strategy to be used. Allowed values are none, canary and blue-green"
required: false required: false
@@ -51,6 +55,10 @@ inputs:
description: "Github token" description: "Github token"
default: ${{ github.token }} default: ${{ github.token }}
required: true required: true
annotate-namespace:
description: "Annotate the target namespace"
required: false
default: true
branding: branding:
color: "green" color: "green"
+74 -15
View File
@@ -18192,6 +18192,7 @@ const promote_1 = __nccwpck_require__(3604);
const reject_1 = __nccwpck_require__(7530); const reject_1 = __nccwpck_require__(7530);
const action_1 = __nccwpck_require__(2868); const action_1 = __nccwpck_require__(2868);
const deploymentStrategy_1 = __nccwpck_require__(7023); const deploymentStrategy_1 = __nccwpck_require__(7023);
const fileUtils_1 = __nccwpck_require__(7446);
function run() { function run() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
// verify kubeconfig is set // verify kubeconfig is set
@@ -18205,6 +18206,7 @@ function run() {
.split(/[\n,;]+/) // split into each individual manifest .split(/[\n,;]+/) // split into each individual manifest
.map((manifest) => manifest.trim()) // remove surrounding whitespace .map((manifest) => manifest.trim()) // remove surrounding whitespace
.filter((manifest) => manifest.length > 0); // remove any blanks .filter((manifest) => manifest.length > 0); // remove any blanks
const fullManifestFilePaths = fileUtils_1.getFilesFromDirectories(manifestFilePaths);
// create kubectl // create kubectl
const kubectlPath = yield kubectl_1.getKubectlPath(); const kubectlPath = yield kubectl_1.getKubectlPath();
const namespace = core.getInput("namespace") || "default"; const namespace = core.getInput("namespace") || "default";
@@ -18212,15 +18214,15 @@ function run() {
// run action // run action
switch (action) { switch (action) {
case action_1.Action.DEPLOY: { case action_1.Action.DEPLOY: {
yield deploy_1.deploy(kubectl, manifestFilePaths, strategy); yield deploy_1.deploy(kubectl, fullManifestFilePaths, strategy);
break; break;
} }
case action_1.Action.PROMOTE: { case action_1.Action.PROMOTE: {
yield promote_1.promote(kubectl, manifestFilePaths, strategy); yield promote_1.promote(kubectl, fullManifestFilePaths, strategy);
break; break;
} }
case action_1.Action.REJECT: { case action_1.Action.REJECT: {
yield reject_1.reject(kubectl, manifestFilePaths, strategy); yield reject_1.reject(kubectl, fullManifestFilePaths, strategy);
break; break;
} }
default: { default: {
@@ -19583,7 +19585,10 @@ function annotateResources(files, kubectl, resourceTypes, allPods, annotationKey
const namespace = core.getInput("namespace") || "default"; const namespace = core.getInput("namespace") || "default";
const lastSuccessSha = yield kubectlUtils_1.getLastSuccessfulRunSha(kubectl, namespace, annotationKey); const lastSuccessSha = yield kubectlUtils_1.getLastSuccessfulRunSha(kubectl, namespace, annotationKey);
const annotationKeyValStr = `${annotationKey}=${workflowAnnotationUtils_1.getWorkflowAnnotations(lastSuccessSha, workflowFilePath, deploymentConfig)}`; const annotationKeyValStr = `${annotationKey}=${workflowAnnotationUtils_1.getWorkflowAnnotations(lastSuccessSha, workflowFilePath, deploymentConfig)}`;
annotateResults.push(yield kubectl.annotate("namespace", namespace, annotationKeyValStr)); const annotateNamespace = !(core.getInput("annotate-namespace").toLowerCase() === "false");
if (annotateNamespace) {
annotateResults.push(yield kubectl.annotate("namespace", namespace, annotationKeyValStr));
}
annotateResults.push(yield kubectl.annotateFiles(files, annotationKeyValStr)); annotateResults.push(yield kubectl.annotateFiles(files, annotationKeyValStr));
for (const resource of resourceTypes) { for (const resource of resourceTypes) {
if (resource.type.toLowerCase() !== if (resource.type.toLowerCase() !==
@@ -19883,7 +19888,9 @@ class Kubectl {
if (this.ignoreSSLErrors) { if (this.ignoreSSLErrors) {
args.push("--insecure-skip-tls-verify"); args.push("--insecure-skip-tls-verify");
} }
args = args.concat(["--namespace", this.namespace]); if (this.namespace && this.namespace != "default") {
args = args.concat(["--namespace", this.namespace]);
}
core.debug(`Kubectl run with command: ${this.kubectlPath} ${args}`); core.debug(`Kubectl run with command: ${this.kubectlPath} ${args}`);
return yield exec_1.getExecOutput(this.kubectlPath, args, { silent }); return yield exec_1.getExecOutput(this.kubectlPath, args, { silent });
}); });
@@ -20082,13 +20089,16 @@ function getDeploymentConfig() {
} }
const imageNames = core.getInput("images").split("\n") || []; const imageNames = core.getInput("images").split("\n") || [];
const imageDockerfilePathMap = {}; const imageDockerfilePathMap = {};
//Fetching from image label if available const pullImages = !(core.getInput("pull-images").toLowerCase() === "false");
for (const image of imageNames) { if (pullImages) {
try { //Fetching from image label if available
imageDockerfilePathMap[image] = yield getDockerfilePath(image); for (const image of imageNames) {
} try {
catch (ex) { imageDockerfilePathMap[image] = yield getDockerfilePath(image);
core.warning(`Failed to get dockerfile path for image ${image.toString()}: ${ex} `); }
catch (ex) {
core.warning(`Failed to get dockerfile path for image ${image.toString()}: ${ex} `);
}
} }
} }
return Promise.resolve({ return Promise.resolve({
@@ -20135,7 +20145,7 @@ exports.checkDockerPath = checkDockerPath;
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.writeManifestToFile = exports.writeObjectsToFile = exports.getTempDirectory = void 0; exports.getFilesFromDirectories = exports.writeManifestToFile = exports.writeObjectsToFile = exports.getTempDirectory = void 0;
const fs = __nccwpck_require__(7147); const fs = __nccwpck_require__(7147);
const path = __nccwpck_require__(1017); const path = __nccwpck_require__(1017);
const core = __nccwpck_require__(6024); const core = __nccwpck_require__(6024);
@@ -20186,6 +20196,46 @@ function getManifestFileName(kind, name) {
const tempDirectory = getTempDirectory(); const tempDirectory = getTempDirectory();
return path.join(tempDirectory, path.basename(filePath)); return path.join(tempDirectory, path.basename(filePath));
} }
function getFilesFromDirectories(filePaths) {
const fullPathSet = new Set();
filePaths.forEach((fileName => {
try {
if (fs.lstatSync(fileName).isDirectory()) {
recurisveManifestGetter(fileName).forEach((file) => { fullPathSet.add(file); });
}
else if (getFileExtension(fileName) === "yml" || getFileExtension(fileName) === "yaml") {
fullPathSet.add(fileName);
}
else {
core.debug(`Detected non-manifest file, ${fileName}, continuing... `);
}
}
catch (ex) {
throw Error(`Exception occurred while reading the file ${fileName}: ${ex}`);
}
}));
return Array.from(fullPathSet);
}
exports.getFilesFromDirectories = getFilesFromDirectories;
function recurisveManifestGetter(dirName) {
const toRet = [];
fs.readdirSync(dirName).forEach((fileName) => {
const fnwd = path.join(dirName, fileName);
if (fs.lstatSync(fnwd).isDirectory()) {
toRet.push(...recurisveManifestGetter(fnwd));
}
else if (getFileExtension(fileName) === "yml" || getFileExtension(fileName) === "yaml") {
toRet.push(path.join(dirName, fileName));
}
else {
core.debug(`Detected non-manifest file, ${fileName}, continuing... `);
}
});
return toRet;
}
function getFileExtension(fileName) {
return fileName.slice((fileName.lastIndexOf(".") - 1 >>> 0) + 2);
}
/***/ }), /***/ }),
@@ -20931,7 +20981,15 @@ exports.getTrafficSplitAPIVersion = getTrafficSplitAPIVersion;
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getWorkflowAnnotationKeyLabel = exports.getWorkflowAnnotations = void 0; exports.getWorkflowAnnotationKeyLabel = exports.getWorkflowAnnotations = exports.prefixObjectKeys = void 0;
const ANNOTATION_PREFIX = "actions.github.com/";
function prefixObjectKeys(obj, prefix) {
return Object.keys(obj).reduce((newObj, key) => {
newObj[prefix + key] = obj[key];
return newObj;
}, {});
}
exports.prefixObjectKeys = prefixObjectKeys;
function getWorkflowAnnotations(lastSuccessRunSha, workflowFilePath, deploymentConfig) { function getWorkflowAnnotations(lastSuccessRunSha, workflowFilePath, deploymentConfig) {
const annotationObject = { const annotationObject = {
run: process.env.GITHUB_RUN_ID, run: process.env.GITHUB_RUN_ID,
@@ -20950,7 +21008,8 @@ function getWorkflowAnnotations(lastSuccessRunSha, workflowFilePath, deploymentC
helmChartPaths: deploymentConfig.helmChartFilePaths, helmChartPaths: deploymentConfig.helmChartFilePaths,
provider: "GitHub", provider: "GitHub",
}; };
return JSON.stringify(annotationObject); const prefixedAnnotationObject = prefixObjectKeys(annotationObject, ANNOTATION_PREFIX);
return JSON.stringify(prefixedAnnotationObject);
} }
exports.getWorkflowAnnotations = getWorkflowAnnotations; exports.getWorkflowAnnotations = getWorkflowAnnotations;
function getWorkflowAnnotationKeyLabel(workflowFilePath) { function getWorkflowAnnotationKeyLabel(workflowFilePath) {
+6093 -6075
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -2,7 +2,7 @@
module.exports = ({onlyFirst = false} = {}) => { module.exports = ({onlyFirst = false} = {}) => {
const pattern = [ const pattern = [
'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
].join('|'); ].join('|');
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "ansi-regex", "name": "ansi-regex",
"version": "5.0.0", "version": "5.0.1",
"description": "Regular expression for matching ANSI escape codes", "description": "Regular expression for matching ANSI escape codes",
"license": "MIT", "license": "MIT",
"repository": "chalk/ansi-regex", "repository": "chalk/ansi-regex",
+1 -1
View File
@@ -1,4 +1,4 @@
# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex) # ansi-regex
> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) > Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code)
-47
View File
@@ -1,47 +0,0 @@
Copyright jQuery Foundation and other contributors <https://jquery.org/>
Based on Underscore.js, copyright Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/lodash/lodash
The following license applies to all parts of this software except as
documented below:
====
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.
CC0: http://creativecommons.org/publicdomain/zero/1.0/
====
Files located in the node_modules and vendor directories are externally
maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.
-18
View File
@@ -1,18 +0,0 @@
# lodash.memoize v4.1.2
The [lodash](https://lodash.com/) method `_.memoize` exported as a [Node.js](https://nodejs.org/) module.
## Installation
Using npm:
```bash
$ {sudo -H} npm i -g npm
$ npm i --save lodash.memoize
```
In Node.js:
```js
var memoize = require('lodash.memoize');
```
See the [documentation](https://lodash.com/docs#memoize) or [package source](https://github.com/lodash/lodash/blob/4.1.2-npm-packages/lodash.memoize) for more details.
-676
View File
@@ -1,676 +0,0 @@
/**
* lodash (Custom Build) <https://lodash.com/>
* Build: `lodash modularize exports="npm" -o ./`
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
* Released under MIT license <https://lodash.com/license>
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';
/** `Object#toString` result references. */
var funcTag = '[object Function]',
genTag = '[object GeneratorFunction]';
/**
* Used to match `RegExp`
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
*/
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
/** Used to detect host constructors (Safari). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;
/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();
/**
* Gets the value at `key` of `object`.
*
* @private
* @param {Object} [object] The object to query.
* @param {string} key The key of the property to get.
* @returns {*} Returns the property value.
*/
function getValue(object, key) {
return object == null ? undefined : object[key];
}
/**
* Checks if `value` is a host object in IE < 9.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a host object, else `false`.
*/
function isHostObject(value) {
// Many host objects are `Object` objects that can coerce to strings
// despite having improperly defined `toString` methods.
var result = false;
if (value != null && typeof value.toString != 'function') {
try {
result = !!(value + '');
} catch (e) {}
}
return result;
}
/** Used for built-in method references. */
var arrayProto = Array.prototype,
funcProto = Function.prototype,
objectProto = Object.prototype;
/** Used to detect overreaching core-js shims. */
var coreJsData = root['__core-js_shared__'];
/** Used to detect methods masquerading as native. */
var maskSrcKey = (function() {
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
return uid ? ('Symbol(src)_1.' + uid) : '';
}());
/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var objectToString = objectProto.toString;
/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);
/** Built-in value references. */
var splice = arrayProto.splice;
/* Built-in method references that are verified to be native. */
var Map = getNative(root, 'Map'),
nativeCreate = getNative(Object, 'create');
/**
* Creates a hash object.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function Hash(entries) {
var index = -1,
length = entries ? entries.length : 0;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
/**
* Removes all key-value entries from the hash.
*
* @private
* @name clear
* @memberOf Hash
*/
function hashClear() {
this.__data__ = nativeCreate ? nativeCreate(null) : {};
}
/**
* Removes `key` and its value from the hash.
*
* @private
* @name delete
* @memberOf Hash
* @param {Object} hash The hash to modify.
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function hashDelete(key) {
return this.has(key) && delete this.__data__[key];
}
/**
* Gets the hash value for `key`.
*
* @private
* @name get
* @memberOf Hash
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function hashGet(key) {
var data = this.__data__;
if (nativeCreate) {
var result = data[key];
return result === HASH_UNDEFINED ? undefined : result;
}
return hasOwnProperty.call(data, key) ? data[key] : undefined;
}
/**
* Checks if a hash value for `key` exists.
*
* @private
* @name has
* @memberOf Hash
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function hashHas(key) {
var data = this.__data__;
return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
}
/**
* Sets the hash `key` to `value`.
*
* @private
* @name set
* @memberOf Hash
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the hash instance.
*/
function hashSet(key, value) {
var data = this.__data__;
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
return this;
}
// Add methods to `Hash`.
Hash.prototype.clear = hashClear;
Hash.prototype['delete'] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;
/**
* Creates an list cache object.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function ListCache(entries) {
var index = -1,
length = entries ? entries.length : 0;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
/**
* Removes all key-value entries from the list cache.
*
* @private
* @name clear
* @memberOf ListCache
*/
function listCacheClear() {
this.__data__ = [];
}
/**
* Removes `key` and its value from the list cache.
*
* @private
* @name delete
* @memberOf ListCache
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function listCacheDelete(key) {
var data = this.__data__,
index = assocIndexOf(data, key);
if (index < 0) {
return false;
}
var lastIndex = data.length - 1;
if (index == lastIndex) {
data.pop();
} else {
splice.call(data, index, 1);
}
return true;
}
/**
* Gets the list cache value for `key`.
*
* @private
* @name get
* @memberOf ListCache
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function listCacheGet(key) {
var data = this.__data__,
index = assocIndexOf(data, key);
return index < 0 ? undefined : data[index][1];
}
/**
* Checks if a list cache value for `key` exists.
*
* @private
* @name has
* @memberOf ListCache
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function listCacheHas(key) {
return assocIndexOf(this.__data__, key) > -1;
}
/**
* Sets the list cache `key` to `value`.
*
* @private
* @name set
* @memberOf ListCache
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the list cache instance.
*/
function listCacheSet(key, value) {
var data = this.__data__,
index = assocIndexOf(data, key);
if (index < 0) {
data.push([key, value]);
} else {
data[index][1] = value;
}
return this;
}
// Add methods to `ListCache`.
ListCache.prototype.clear = listCacheClear;
ListCache.prototype['delete'] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;
/**
* Creates a map cache object to store key-value pairs.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function MapCache(entries) {
var index = -1,
length = entries ? entries.length : 0;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
/**
* Removes all key-value entries from the map.
*
* @private
* @name clear
* @memberOf MapCache
*/
function mapCacheClear() {
this.__data__ = {
'hash': new Hash,
'map': new (Map || ListCache),
'string': new Hash
};
}
/**
* Removes `key` and its value from the map.
*
* @private
* @name delete
* @memberOf MapCache
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function mapCacheDelete(key) {
return getMapData(this, key)['delete'](key);
}
/**
* Gets the map value for `key`.
*
* @private
* @name get
* @memberOf MapCache
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function mapCacheGet(key) {
return getMapData(this, key).get(key);
}
/**
* Checks if a map value for `key` exists.
*
* @private
* @name has
* @memberOf MapCache
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function mapCacheHas(key) {
return getMapData(this, key).has(key);
}
/**
* Sets the map `key` to `value`.
*
* @private
* @name set
* @memberOf MapCache
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the map cache instance.
*/
function mapCacheSet(key, value) {
getMapData(this, key).set(key, value);
return this;
}
// Add methods to `MapCache`.
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype['delete'] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;
/**
* Gets the index at which the `key` is found in `array` of key-value pairs.
*
* @private
* @param {Array} array The array to inspect.
* @param {*} key The key to search for.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function assocIndexOf(array, key) {
var length = array.length;
while (length--) {
if (eq(array[length][0], key)) {
return length;
}
}
return -1;
}
/**
* The base implementation of `_.isNative` without bad shim checks.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a native function,
* else `false`.
*/
function baseIsNative(value) {
if (!isObject(value) || isMasked(value)) {
return false;
}
var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
return pattern.test(toSource(value));
}
/**
* Gets the data for `map`.
*
* @private
* @param {Object} map The map to query.
* @param {string} key The reference key.
* @returns {*} Returns the map data.
*/
function getMapData(map, key) {
var data = map.__data__;
return isKeyable(key)
? data[typeof key == 'string' ? 'string' : 'hash']
: data.map;
}
/**
* Gets the native function at `key` of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {string} key The key of the method to get.
* @returns {*} Returns the function if it's native, else `undefined`.
*/
function getNative(object, key) {
var value = getValue(object, key);
return baseIsNative(value) ? value : undefined;
}
/**
* Checks if `value` is suitable for use as unique object key.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
*/
function isKeyable(value) {
var type = typeof value;
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
? (value !== '__proto__')
: (value === null);
}
/**
* Checks if `func` has its source masked.
*
* @private
* @param {Function} func The function to check.
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
*/
function isMasked(func) {
return !!maskSrcKey && (maskSrcKey in func);
}
/**
* Converts `func` to its source code.
*
* @private
* @param {Function} func The function to process.
* @returns {string} Returns the source code.
*/
function toSource(func) {
if (func != null) {
try {
return funcToString.call(func);
} catch (e) {}
try {
return (func + '');
} catch (e) {}
}
return '';
}
/**
* Creates a function that memoizes the result of `func`. If `resolver` is
* provided, it determines the cache key for storing the result based on the
* arguments provided to the memoized function. By default, the first argument
* provided to the memoized function is used as the map cache key. The `func`
* is invoked with the `this` binding of the memoized function.
*
* **Note:** The cache is exposed as the `cache` property on the memoized
* function. Its creation may be customized by replacing the `_.memoize.Cache`
* constructor with one whose instances implement the
* [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
* method interface of `delete`, `get`, `has`, and `set`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Function
* @param {Function} func The function to have its output memoized.
* @param {Function} [resolver] The function to resolve the cache key.
* @returns {Function} Returns the new memoized function.
* @example
*
* var object = { 'a': 1, 'b': 2 };
* var other = { 'c': 3, 'd': 4 };
*
* var values = _.memoize(_.values);
* values(object);
* // => [1, 2]
*
* values(other);
* // => [3, 4]
*
* object.a = 2;
* values(object);
* // => [1, 2]
*
* // Modify the result cache.
* values.cache.set(object, ['a', 'b']);
* values(object);
* // => ['a', 'b']
*
* // Replace `_.memoize.Cache`.
* _.memoize.Cache = WeakMap;
*/
function memoize(func, resolver) {
if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
throw new TypeError(FUNC_ERROR_TEXT);
}
var memoized = function() {
var args = arguments,
key = resolver ? resolver.apply(this, args) : args[0],
cache = memoized.cache;
if (cache.has(key)) {
return cache.get(key);
}
var result = func.apply(this, args);
memoized.cache = cache.set(key, result);
return result;
};
memoized.cache = new (memoize.Cache || MapCache);
return memoized;
}
// Assign cache to `_.memoize`.
memoize.Cache = MapCache;
/**
* Performs a
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
* comparison between two values to determine if they are equivalent.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
* @example
*
* var object = { 'a': 1 };
* var other = { 'a': 1 };
*
* _.eq(object, object);
* // => true
*
* _.eq(object, other);
* // => false
*
* _.eq('a', 'a');
* // => true
*
* _.eq('a', Object('a'));
* // => false
*
* _.eq(NaN, NaN);
* // => true
*/
function eq(value, other) {
return value === other || (value !== value && other !== other);
}
/**
* Checks if `value` is classified as a `Function` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
* @example
*
* _.isFunction(_);
* // => true
*
* _.isFunction(/abc/);
* // => false
*/
function isFunction(value) {
// The use of `Object#toString` avoids issues with the `typeof` operator
// in Safari 8-9 which returns 'object' for typed array and other constructors.
var tag = isObject(value) ? objectToString.call(value) : '';
return tag == funcTag || tag == genTag;
}
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject(value) {
var type = typeof value;
return !!value && (type == 'object' || type == 'function');
}
module.exports = memoize;
-17
View File
@@ -1,17 +0,0 @@
{
"name": "lodash.memoize",
"version": "4.1.2",
"description": "The lodash method `_.memoize` exported as a module.",
"homepage": "https://lodash.com/",
"icon": "https://lodash.com/icon.svg",
"license": "MIT",
"keywords": "lodash-modularized, memoize",
"author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
"contributors": [
"John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
"Blaine Bublitz <blaine.bublitz@gmail.com> (https://github.com/phated)",
"Mathias Bynens <mathias@qiwi.be> (https://mathiasbynens.be/)"
],
"repository": "lodash/lodash",
"scripts": { "test": "echo \"See https://travis-ci.org/lodash/lodash-cli for testing details.\"" }
}
+6 -2
View File
@@ -70,7 +70,7 @@ module.exports = function (args, opts) {
var o = obj; var o = obj;
for (var i = 0; i < keys.length-1; i++) { for (var i = 0; i < keys.length-1; i++) {
var key = keys[i]; var key = keys[i];
if (key === '__proto__') return; if (isConstructorOrProto(o, key)) return;
if (o[key] === undefined) o[key] = {}; if (o[key] === undefined) o[key] = {};
if (o[key] === Object.prototype || o[key] === Number.prototype if (o[key] === Object.prototype || o[key] === Number.prototype
|| o[key] === String.prototype) o[key] = {}; || o[key] === String.prototype) o[key] = {};
@@ -79,7 +79,7 @@ module.exports = function (args, opts) {
} }
var key = keys[keys.length - 1]; var key = keys[keys.length - 1];
if (key === '__proto__') return; if (isConstructorOrProto(o, key)) return;
if (o === Object.prototype || o === Number.prototype if (o === Object.prototype || o === Number.prototype
|| o === String.prototype) o = {}; || o === String.prototype) o = {};
if (o === Array.prototype) o = []; if (o === Array.prototype) o = [];
@@ -243,3 +243,7 @@ function isNumber (x) {
return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
} }
function isConstructorOrProto (obj, key) {
return key === 'constructor' && typeof obj[key] === 'function' || key === '__proto__';
}
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "minimist", "name": "minimist",
"version": "1.2.5", "version": "1.2.6",
"description": "parse argument options", "description": "parse argument options",
"main": "index.js", "main": "index.js",
"devDependencies": { "devDependencies": {
+4 -1
View File
@@ -34,7 +34,10 @@ $ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
Previous versions had a prototype pollution bug that could cause privilege Previous versions had a prototype pollution bug that could cause privilege
escalation in some circumstances when handling untrusted user input. escalation in some circumstances when handling untrusted user input.
Please use version 1.2.3 or later: https://snyk.io/vuln/SNYK-JS-MINIMIST-559764 Please use version 1.2.6 or later:
* https://security.snyk.io/vuln/SNYK-JS-MINIMIST-2429795 (version <=1.2.5)
* https://snyk.io/vuln/SNYK-JS-MINIMIST-559764 (version <=1.2.3)
# methods # methods
+16
View File
@@ -42,3 +42,19 @@ test('proto pollution (constructor)', function (t) {
t.equal(argv.y, undefined); t.equal(argv.y, undefined);
t.end(); t.end();
}); });
test('proto pollution (constructor function)', function (t) {
var argv = parse(['--_.concat.constructor.prototype.y', '123']);
function fnToBeTested() {}
t.equal(fnToBeTested.y, undefined);
t.equal(argv.y, undefined);
t.end();
});
// powered by snyk - https://github.com/backstage/backstage/issues/10343
test('proto pollution (constructor function) snyk', function (t) {
var argv = parse('--_.constructor.constructor.prototype.foo bar'.split(' '));
t.equal((function(){}).foo, undefined);
t.equal(argv.y, undefined);
t.end();
})
+15
View File
@@ -0,0 +1,15 @@
# Changers Lorgs!
## 1.0
Full rewrite. Essentially a brand new module.
- Return a promise instead of taking a callback.
- Use native `fs.mkdir(path, { recursive: true })` when available.
- Drop support for outdated Node.js versions. (Technically still works on
Node.js v8, but only 10 and above are officially supported.)
## 0.x
Original and most widely used recursive directory creation implementation
in JavaScript, dating back to 2010.
+2 -2
View File
@@ -1,6 +1,6 @@
Copyright 2010 James Halliday (mail@substack.net) Copyright James Halliday (mail@substack.net) and Isaac Z. Schlueter (i@izs.me)
This project is free software released under the MIT/X11 license: This project is free software released under the MIT license:
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
+62 -27
View File
@@ -1,33 +1,68 @@
#!/usr/bin/env node #!/usr/bin/env node
var mkdirp = require('../'); const usage = () => `
var minimist = require('minimist'); usage: mkdirp [DIR1,DIR2..] {OPTIONS}
var fs = require('fs');
var argv = minimist(process.argv.slice(2), { Create each supplied directory including any necessary parent directories
alias: { m: 'mode', h: 'help' }, that don't yet exist.
string: [ 'mode' ]
}); If the directory already exists, do nothing.
if (argv.help) {
fs.createReadStream(__dirname + '/usage.txt').pipe(process.stdout); OPTIONS are:
return;
-m<mode> If a directory needs to be created, set the mode as an octal
--mode=<mode> permission string.
-v --version Print the mkdirp version number
-h --help Print this helpful banner
-p --print Print the first directories created for each path provided
--manual Use manual implementation, even if native is available
`
const dirs = []
const opts = {}
let print = false
let dashdash = false
let manual = false
for (const arg of process.argv.slice(2)) {
if (dashdash)
dirs.push(arg)
else if (arg === '--')
dashdash = true
else if (arg === '--manual')
manual = true
else if (/^-h/.test(arg) || /^--help/.test(arg)) {
console.log(usage())
process.exit(0)
} else if (arg === '-v' || arg === '--version') {
console.log(require('../package.json').version)
process.exit(0)
} else if (arg === '-p' || arg === '--print') {
print = true
} else if (/^-m/.test(arg) || /^--mode=/.test(arg)) {
const mode = parseInt(arg.replace(/^(-m|--mode=)/, ''), 8)
if (isNaN(mode)) {
console.error(`invalid mode argument: ${arg}\nMust be an octal number.`)
process.exit(1)
}
opts.mode = mode
} else
dirs.push(arg)
} }
var paths = argv._.slice(); const mkdirp = require('../')
var mode = argv.mode ? parseInt(argv.mode, 8) : undefined; const impl = manual ? mkdirp.manual : mkdirp
if (dirs.length === 0)
console.error(usage())
(function next () { Promise.all(dirs.map(dir => impl(dir, opts)))
if (paths.length === 0) return; .then(made => print ? made.forEach(m => m && console.log(m)) : null)
var p = paths.shift(); .catch(er => {
console.error(er.message)
if (mode === undefined) mkdirp(p, cb) if (er.code)
else mkdirp(p, mode, cb) console.error(' code: ' + er.code)
process.exit(1)
function cb (err) { })
if (err) {
console.error(err.message);
process.exit(1);
}
else next();
}
})();
-12
View File
@@ -1,12 +0,0 @@
usage: mkdirp [DIR1,DIR2..] {OPTIONS}
Create each supplied directory including any necessary parent directories that
don't yet exist.
If the directory already exists, do nothing.
OPTIONS are:
-m, --mode If a directory needs to be created, set the mode as an octal
permission string.
+24 -92
View File
@@ -1,99 +1,31 @@
var path = require('path'); const optsArg = require('./lib/opts-arg.js')
var fs = require('fs'); const pathArg = require('./lib/path-arg.js')
var _0777 = parseInt('0777', 8);
module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; const {mkdirpNative, mkdirpNativeSync} = require('./lib/mkdirp-native.js')
const {mkdirpManual, mkdirpManualSync} = require('./lib/mkdirp-manual.js')
const {useNative, useNativeSync} = require('./lib/use-native.js')
function mkdirP (p, opts, f, made) {
if (typeof opts === 'function') {
f = opts;
opts = {};
}
else if (!opts || typeof opts !== 'object') {
opts = { mode: opts };
}
var mode = opts.mode;
var xfs = opts.fs || fs;
if (mode === undefined) {
mode = _0777
}
if (!made) made = null;
var cb = f || function () {};
p = path.resolve(p);
xfs.mkdir(p, mode, function (er) {
if (!er) {
made = made || p;
return cb(null, made);
}
switch (er.code) {
case 'ENOENT':
if (path.dirname(p) === p) return cb(er);
mkdirP(path.dirname(p), opts, function (er, made) {
if (er) cb(er, made);
else mkdirP(p, opts, cb, made);
});
break;
// In the case of any other error, just see if there's a dir const mkdirp = (path, opts) => {
// there already. If so, then hooray! If not, then something path = pathArg(path)
// is borked. opts = optsArg(opts)
default: return useNative(opts)
xfs.stat(p, function (er2, stat) { ? mkdirpNative(path, opts)
// if the stat fails, then that's super weird. : mkdirpManual(path, opts)
// let the original error be the failure reason.
if (er2 || !stat.isDirectory()) cb(er, made)
else cb(null, made);
});
break;
}
});
} }
mkdirP.sync = function sync (p, opts, made) { const mkdirpSync = (path, opts) => {
if (!opts || typeof opts !== 'object') { path = pathArg(path)
opts = { mode: opts }; opts = optsArg(opts)
} return useNativeSync(opts)
? mkdirpNativeSync(path, opts)
var mode = opts.mode; : mkdirpManualSync(path, opts)
var xfs = opts.fs || fs; }
if (mode === undefined) {
mode = _0777
}
if (!made) made = null;
p = path.resolve(p); mkdirp.sync = mkdirpSync
mkdirp.native = (path, opts) => mkdirpNative(pathArg(path), optsArg(opts))
mkdirp.manual = (path, opts) => mkdirpManual(pathArg(path), optsArg(opts))
mkdirp.nativeSync = (path, opts) => mkdirpNativeSync(pathArg(path), optsArg(opts))
mkdirp.manualSync = (path, opts) => mkdirpManualSync(pathArg(path), optsArg(opts))
try { module.exports = mkdirp
xfs.mkdirSync(p, mode);
made = made || p;
}
catch (err0) {
switch (err0.code) {
case 'ENOENT' :
made = sync(path.dirname(p), opts, made);
sync(p, opts, made);
break;
// In the case of any other error, just see if there's a dir
// there already. If so, then hooray! If not, then something
// is borked.
default:
var stat;
try {
stat = xfs.statSync(p);
}
catch (err1) {
throw err0;
}
if (!stat.isDirectory()) throw err0;
break;
}
}
return made;
};
+29
View File
@@ -0,0 +1,29 @@
const {dirname} = require('path')
const findMade = (opts, parent, path = undefined) => {
// we never want the 'made' return value to be a root directory
if (path === parent)
return Promise.resolve()
return opts.statAsync(parent).then(
st => st.isDirectory() ? path : undefined, // will fail later
er => er.code === 'ENOENT'
? findMade(opts, dirname(parent), parent)
: undefined
)
}
const findMadeSync = (opts, parent, path = undefined) => {
if (path === parent)
return undefined
try {
return opts.statSync(parent).isDirectory() ? path : undefined
} catch (er) {
return er.code === 'ENOENT'
? findMadeSync(opts, dirname(parent), parent)
: undefined
}
}
module.exports = {findMade, findMadeSync}
+64
View File
@@ -0,0 +1,64 @@
const {dirname} = require('path')
const mkdirpManual = (path, opts, made) => {
opts.recursive = false
const parent = dirname(path)
if (parent === path) {
return opts.mkdirAsync(path, opts).catch(er => {
// swallowed by recursive implementation on posix systems
// any other error is a failure
if (er.code !== 'EISDIR')
throw er
})
}
return opts.mkdirAsync(path, opts).then(() => made || path, er => {
if (er.code === 'ENOENT')
return mkdirpManual(parent, opts)
.then(made => mkdirpManual(path, opts, made))
if (er.code !== 'EEXIST' && er.code !== 'EROFS')
throw er
return opts.statAsync(path).then(st => {
if (st.isDirectory())
return made
else
throw er
}, () => { throw er })
})
}
const mkdirpManualSync = (path, opts, made) => {
const parent = dirname(path)
opts.recursive = false
if (parent === path) {
try {
return opts.mkdirSync(path, opts)
} catch (er) {
// swallowed by recursive implementation on posix systems
// any other error is a failure
if (er.code !== 'EISDIR')
throw er
else
return
}
}
try {
opts.mkdirSync(path, opts)
return made || path
} catch (er) {
if (er.code === 'ENOENT')
return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))
if (er.code !== 'EEXIST' && er.code !== 'EROFS')
throw er
try {
if (!opts.statSync(path).isDirectory())
throw er
} catch (_) {
throw er
}
}
}
module.exports = {mkdirpManual, mkdirpManualSync}
+39
View File
@@ -0,0 +1,39 @@
const {dirname} = require('path')
const {findMade, findMadeSync} = require('./find-made.js')
const {mkdirpManual, mkdirpManualSync} = require('./mkdirp-manual.js')
const mkdirpNative = (path, opts) => {
opts.recursive = true
const parent = dirname(path)
if (parent === path)
return opts.mkdirAsync(path, opts)
return findMade(opts, path).then(made =>
opts.mkdirAsync(path, opts).then(() => made)
.catch(er => {
if (er.code === 'ENOENT')
return mkdirpManual(path, opts)
else
throw er
}))
}
const mkdirpNativeSync = (path, opts) => {
opts.recursive = true
const parent = dirname(path)
if (parent === path)
return opts.mkdirSync(path, opts)
const made = findMadeSync(opts, path)
try {
opts.mkdirSync(path, opts)
return made
} catch (er) {
if (er.code === 'ENOENT')
return mkdirpManualSync(path, opts)
else
throw er
}
}
module.exports = {mkdirpNative, mkdirpNativeSync}
+23
View File
@@ -0,0 +1,23 @@
const { promisify } = require('util')
const fs = require('fs')
const optsArg = opts => {
if (!opts)
opts = { mode: 0o777, fs }
else if (typeof opts === 'object')
opts = { mode: 0o777, fs, ...opts }
else if (typeof opts === 'number')
opts = { mode: opts, fs }
else if (typeof opts === 'string')
opts = { mode: parseInt(opts, 8), fs }
else
throw new TypeError('invalid options argument')
opts.mkdir = opts.mkdir || opts.fs.mkdir || fs.mkdir
opts.mkdirAsync = promisify(opts.mkdir)
opts.stat = opts.stat || opts.fs.stat || fs.stat
opts.statAsync = promisify(opts.stat)
opts.statSync = opts.statSync || opts.fs.statSync || fs.statSync
opts.mkdirSync = opts.mkdirSync || opts.fs.mkdirSync || fs.mkdirSync
return opts
}
module.exports = optsArg
+29
View File
@@ -0,0 +1,29 @@
const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform
const { resolve, parse } = require('path')
const pathArg = path => {
if (/\0/.test(path)) {
// simulate same failure that node raises
throw Object.assign(
new TypeError('path must be a string without null bytes'),
{
path,
code: 'ERR_INVALID_ARG_VALUE',
}
)
}
path = resolve(path)
if (platform === 'win32') {
const badWinChars = /[*|"<>?:]/
const {root} = parse(path)
if (badWinChars.test(path.substr(root.length))) {
throw Object.assign(new Error('Illegal characters in path.'), {
path,
code: 'EINVAL',
})
}
}
return path
}
module.exports = pathArg
+10
View File
@@ -0,0 +1,10 @@
const fs = require('fs')
const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version
const versArr = version.replace(/^v/, '').split('.')
const hasNative = +versArr[0] > 10 || +versArr[0] === 10 && +versArr[1] >= 12
const useNative = !hasNative ? () => false : opts => opts.mkdir === fs.mkdir
const useNativeSync = !hasNative ? () => false : opts => opts.mkdirSync === fs.mkdirSync
module.exports = {useNative, useNativeSync}
+22 -12
View File
@@ -1,34 +1,44 @@
{ {
"name": "mkdirp", "name": "mkdirp",
"description": "Recursively mkdir, like `mkdir -p`", "description": "Recursively mkdir, like `mkdir -p`",
"version": "0.5.5", "version": "1.0.4",
"publishConfig": {
"tag": "legacy"
},
"author": "James Halliday <mail@substack.net> (http://substack.net)",
"main": "index.js", "main": "index.js",
"keywords": [ "keywords": [
"mkdir", "mkdir",
"directory" "directory",
"make dir",
"make",
"dir",
"recursive",
"native"
], ],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/substack/node-mkdirp.git" "url": "https://github.com/isaacs/node-mkdirp.git"
}, },
"scripts": { "scripts": {
"test": "tap test/*.js" "test": "tap",
"snap": "tap",
"preversion": "npm test",
"postversion": "npm publish",
"postpublish": "git push origin --follow-tags"
}, },
"dependencies": { "tap": {
"minimist": "^1.2.5" "check-coverage": true,
"coverage-map": "map.js"
}, },
"devDependencies": { "devDependencies": {
"mock-fs": "^3.7.0", "require-inject": "^1.4.4",
"tap": "^5.4.2" "tap": "^14.10.7"
}, },
"bin": "bin/cmd.js", "bin": "bin/cmd.js",
"license": "MIT", "license": "MIT",
"engines": {
"node": ">=10"
},
"files": [ "files": [
"bin", "bin",
"lib",
"index.js" "index.js"
] ]
} }
+206 -40
View File
@@ -1,26 +1,37 @@
# mkdirp # mkdirp
Like `mkdir -p`, but in node.js! Like `mkdir -p`, but in Node.js!
[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp) Now with a modern API and no\* bugs!
<small>\* may contain some bugs</small>
# example # example
## pow.js ## pow.js
```js ```js
var mkdirp = require('mkdirp'); const mkdirp = require('mkdirp')
mkdirp('/tmp/foo/bar/baz', function (err) { // return value is a Promise resolving to the first directory created
if (err) console.error(err) mkdirp('/tmp/foo/bar/baz').then(made =>
else console.log('pow!') console.log(`made directories, starting with ${made}`))
});
``` ```
Output Output (where `/tmp/foo` already exists)
``` ```
pow! made directories, starting with /tmp/foo/bar
```
Or, if you don't have time to wait around for promises:
```js
const mkdirp = require('mkdirp')
// return value is the first directory created
const made = mkdirp.sync('/tmp/foo/bar/baz')
console.log(`made directories, starting with ${made}`)
``` ```
And now /tmp/foo/bar/baz exists, huzzah! And now /tmp/foo/bar/baz exists, huzzah!
@@ -28,55 +39,198 @@ And now /tmp/foo/bar/baz exists, huzzah!
# methods # methods
```js ```js
var mkdirp = require('mkdirp'); const mkdirp = require('mkdirp')
``` ```
## mkdirp(dir, opts, cb) ## mkdirp(dir, [opts]) -> Promise<String | undefined>
Create a new directory and any necessary subdirectories at `dir` with octal Create a new directory and any necessary subdirectories at `dir` with octal
permission string `opts.mode`. If `opts` is a non-object, it will be treated as permission string `opts.mode`. If `opts` is a string or number, it will be
the `opts.mode`.
If `opts.mode` isn't specified, it defaults to `0777`.
`cb(err, made)` fires with the error or the first directory `made`
that had to be created, if any.
You can optionally pass in an alternate `fs` implementation by passing in
`opts.fs`. Your implementation should have `opts.fs.mkdir(path, mode, cb)` and
`opts.fs.stat(path, cb)`.
## mkdirp.sync(dir, opts)
Synchronously create a new directory and any necessary subdirectories at `dir`
with octal permission string `opts.mode`. If `opts` is a non-object, it will be
treated as the `opts.mode`. treated as the `opts.mode`.
If `opts.mode` isn't specified, it defaults to `0777`. If `opts.mode` isn't specified, it defaults to `0o777 &
(~process.umask())`.
Returns the first directory that had to be created, if any. Promise resolves to first directory `made` that had to be created, or
`undefined` if everything already exists. Promise rejects if any errors
are encountered. Note that, in the case of promise rejection, some
directories _may_ have been created, as recursive directory creation is not
an atomic operation.
You can optionally pass in an alternate `fs` implementation by passing in You can optionally pass in an alternate `fs` implementation by passing in
`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)` and `opts.fs`. Your implementation should have `opts.fs.mkdir(path, opts, cb)`
`opts.fs.statSync(path)`. and `opts.fs.stat(path, cb)`.
# usage You can also override just one or the other of `mkdir` and `stat` by
passing in `opts.stat` or `opts.mkdir`, or providing an `fs` option that
only overrides one of these.
## mkdirp.sync(dir, opts) -> String|null
Synchronously create a new directory and any necessary subdirectories at
`dir` with octal permission string `opts.mode`. If `opts` is a string or
number, it will be treated as the `opts.mode`.
If `opts.mode` isn't specified, it defaults to `0o777 &
(~process.umask())`.
Returns the first directory that had to be created, or undefined if
everything already exists.
You can optionally pass in an alternate `fs` implementation by passing in
`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)`
and `opts.fs.statSync(path)`.
You can also override just one or the other of `mkdirSync` and `statSync`
by passing in `opts.statSync` or `opts.mkdirSync`, or providing an `fs`
option that only overrides one of these.
## mkdirp.manual, mkdirp.manualSync
Use the manual implementation (not the native one). This is the default
when the native implementation is not available or the stat/mkdir
implementation is overridden.
## mkdirp.native, mkdirp.nativeSync
Use the native implementation (not the manual one). This is the default
when the native implementation is available and stat/mkdir are not
overridden.
# implementation
On Node.js v10.12.0 and above, use the native `fs.mkdir(p,
{recursive:true})` option, unless `fs.mkdir`/`fs.mkdirSync` has been
overridden by an option.
## native implementation
- If the path is a root directory, then pass it to the underlying
implementation and return the result/error. (In this case, it'll either
succeed or fail, but we aren't actually creating any dirs.)
- Walk up the path statting each directory, to find the first path that
will be created, `made`.
- Call `fs.mkdir(path, { recursive: true })` (or `fs.mkdirSync`)
- If error, raise it to the caller.
- Return `made`.
## manual implementation
- Call underlying `fs.mkdir` implementation, with `recursive: false`
- If error:
- If path is a root directory, raise to the caller and do not handle it
- If ENOENT, mkdirp parent dir, store result as `made`
- stat(path)
- If error, raise original `mkdir` error
- If directory, return `made`
- Else, raise original `mkdir` error
- else
- return `undefined` if a root dir, or `made` if set, or `path`
## windows vs unix caveat
On Windows file systems, attempts to create a root directory (ie, a drive
letter or root UNC path) will fail. If the root directory exists, then it
will fail with `EPERM`. If the root directory does not exist, then it will
fail with `ENOENT`.
On posix file systems, attempts to create a root directory (in recursive
mode) will succeed silently, as it is treated like just another directory
that already exists. (In non-recursive mode, of course, it fails with
`EEXIST`.)
In order to preserve this system-specific behavior (and because it's not as
if we can create the parent of a root directory anyway), attempts to create
a root directory are passed directly to the `fs` implementation, and any
errors encountered are not handled.
## native error caveat
The native implementation (as of at least Node.js v13.4.0) does not provide
appropriate errors in some cases (see
[nodejs/node#31481](https://github.com/nodejs/node/issues/31481) and
[nodejs/node#28015](https://github.com/nodejs/node/issues/28015)).
In order to work around this issue, the native implementation will fall
back to the manual implementation if an `ENOENT` error is encountered.
# choosing a recursive mkdir implementation
There are a few to choose from! Use the one that suits your needs best :D
## use `fs.mkdir(path, {recursive: true}, cb)` if:
- You wish to optimize performance even at the expense of other factors.
- You don't need to know the first dir created.
- You are ok with getting `ENOENT` as the error when some other problem is
the actual cause.
- You can limit your platforms to Node.js v10.12 and above.
- You're ok with using callbacks instead of promises.
- You don't need/want a CLI.
- You don't need to override the `fs` methods in use.
## use this module (mkdirp 1.x) if:
- You need to know the first directory that was created.
- You wish to use the native implementation if available, but fall back
when it's not.
- You prefer promise-returning APIs to callback-taking APIs.
- You want more useful error messages than the native recursive mkdir
provides (at least as of Node.js v13.4), and are ok with re-trying on
`ENOENT` to achieve this.
- You need (or at least, are ok with) a CLI.
- You need to override the `fs` methods in use.
## use [`make-dir`](http://npm.im/make-dir) if:
- You do not need to know the first dir created (and wish to save a few
`stat` calls when using the native implementation for this reason).
- You wish to use the native implementation if available, but fall back
when it's not.
- You prefer promise-returning APIs to callback-taking APIs.
- You are ok with occasionally getting `ENOENT` errors for failures that
are actually related to something other than a missing file system entry.
- You don't need/want a CLI.
- You need to override the `fs` methods in use.
## use mkdirp 0.x if:
- You need to know the first directory that was created.
- You need (or at least, are ok with) a CLI.
- You need to override the `fs` methods in use.
- You're ok with using callbacks instead of promises.
- You are not running on Windows, where the root-level ENOENT errors can
lead to infinite regress.
- You think vinyl just sounds warmer and richer for some weird reason.
- You are supporting truly ancient Node.js versions, before even the advent
of a `Promise` language primitive. (Please don't. You deserve better.)
# cli
This package also ships with a `mkdirp` command. This package also ships with a `mkdirp` command.
``` ```
$ mkdirp -h
usage: mkdirp [DIR1,DIR2..] {OPTIONS} usage: mkdirp [DIR1,DIR2..] {OPTIONS}
Create each supplied directory including any necessary parent directories that Create each supplied directory including any necessary parent directories
don't yet exist. that don't yet exist.
If the directory already exists, do nothing. If the directory already exists, do nothing.
OPTIONS are: OPTIONS are:
-m, --mode If a directory needs to be created, set the mode as an octal -m<mode> If a directory needs to be created, set the mode as an octal
permission string. --mode=<mode> permission string.
-v --version Print the mkdirp version number
-h --help Print this helpful banner
-p --print Print the first directories created for each path provided
--manual Use manual implementation, even if native is available
``` ```
# install # install
@@ -87,13 +241,25 @@ With [npm](http://npmjs.org) do:
npm install mkdirp npm install mkdirp
``` ```
to get the library, or to get the library locally, or
``` ```
npm install -g mkdirp npm install -g mkdirp
``` ```
to get the command. to get the command everywhere, or
```
npx mkdirp ...
```
to run the command without installing it globally.
# platform support
This module works on node v8, but only v10 and above are officially
supported, as Node v8 reached its LTS end of life 2020-01-01, which is in
the past, as of this writing.
# license # license
-3
View File
@@ -1,3 +0,0 @@
language: node_js
node_js:
- 0.6
+1 -1
View File
@@ -1,4 +1,4 @@
var INTERPOLATE = /{([\s\S]+?)}/g var INTERPOLATE = /{([^{]+?)}/g
module.exports = function(str, data) { module.exports = function(str, data) {
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' + var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
+6 -4
View File
@@ -1,17 +1,19 @@
{ {
"name": "tmpl", "name": "tmpl",
"description": "JavaScript micro templates.", "description": "JavaScript micro templates.",
"version": "1.0.4", "version": "1.0.5",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"homepage": "https://github.com/nshah/nodejs-tmpl", "homepage": "https://github.com/daaku/nodejs-tmpl",
"author": "Naitik Shah <n@daaku.org>", "author": "Naitik Shah <n@daaku.org>",
"main": "lib/tmpl", "main": "lib/tmpl",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/daaku/nodejs-tmpl" "url": "https://github.com/daaku/nodejs-tmpl"
}, },
"scripts": { "test": "NODE_PATH=./lib mocha --ui exports" }, "scripts": {
"test": "NODE_PATH=./lib mocha --ui exports"
},
"devDependencies": { "devDependencies": {
"mocha": "0.12.x" "mocha": "^9.1.1"
} }
} }
+1 -1
View File
@@ -1 +1 @@
d9672057404fee19f80db714ea000c61a1375776 23a45c3c610603c5fb7b5956ee7a94657fb32b21
+271
View File
@@ -1,3 +1,274 @@
## [26.5.6](https://github.com/kulshekhar/ts-jest/compare/v26.5.5...v26.5.6) (2021-05-05)
### Code Refactoring
* refactor(config): show warning message for `sourceMap: false` ([#2557](https://github.com/kulshekhar/ts-jest/pull/2557)) ([cf60990](https://github.com/kulshekhar/ts-jest/commit/cf609900e2c5937755123bd08ca2c5f2ff5e0651)).
## [26.5.5](https://github.com/kulshekhar/ts-jest/compare/v26.5.4...v26.5.5) (2021-04-15)
### Bug Fixes
* **compiler:** return file content on emitSkipped for non ts/tsx files ([#2515](https://github.com/kulshekhar/ts-jest/issues/2515)) ([0320fb3](https://github.com/kulshekhar/ts-jest/commit/0320fb3ac22056aafe4d7ae966eab84dbf23fda9)), closes [#2513](https://github.com/kulshekhar/ts-jest/issues/2513)
## [26.5.4](https://github.com/kulshekhar/ts-jest/compare/v26.5.3...v26.5.4) (2021-03-17)
### Bug Fixes
* **compiler:** initialize compiler with `.ts`/`.tsx`/`.d.ts` files only ([#2457](https://github.com/kulshekhar/ts-jest/issues/2457)) ([1dc731a](https://github.com/kulshekhar/ts-jest/commit/1dc731a5faf7cda59db1cc642eb99fae973b1246)), closes [#2445](https://github.com/kulshekhar/ts-jest/issues/2445)
## [26.5.3](https://github.com/kulshekhar/ts-jest/compare/v26.5.2...v26.5.3) (2021-03-03)
### Bug Fixes
* **config:** create fallback jest config when jest config is undefined ([#2421](https://github.com/kulshekhar/ts-jest/issues/2421)) ([0fb6b45](https://github.com/kulshekhar/ts-jest/commit/0fb6b45e7dc3dd7588d27f09ac9a8849dff470cb)), closes [#2085](https://github.com/kulshekhar/ts-jest/issues/2085)
* remove `@types/jest` from direct dep ([#2416](https://github.com/kulshekhar/ts-jest/issues/2416)) ([060302e](https://github.com/kulshekhar/ts-jest/commit/060302ed1eb8708df0acd7ab1d613ff06fc08cf3)), closes [#2406](https://github.com/kulshekhar/ts-jest/issues/2406) [#2411](https://github.com/kulshekhar/ts-jest/issues/2411)
* **compiler:** return original file content on emit skip ([#2408](https://github.com/kulshekhar/ts-jest/issues/2408)) ([cfba8f4](https://github.com/kulshekhar/ts-jest/commit/cfba8f423dd59536d8b1e1374ef2b20bff2ed857)), closes [#2407](https://github.com/kulshekhar/ts-jest/issues/2407)
## [26.5.2](https://github.com/kulshekhar/ts-jest/compare/v26.5.1...v26.5.2) (2021-02-21)
### Bug Fixes
* **compiler:** exclude files in `outDir` from compiler source files ([#2376](https://github.com/kulshekhar/ts-jest/issues/2376)) ([9034677](https://github.com/kulshekhar/ts-jest/commit/9034677f9ce0968339d3d942a70e888996fac532)), closes [#2350](https://github.com/kulshekhar/ts-jest/issues/2350) [#2374](https://github.com/kulshekhar/ts-jest/issues/2374)
* **config:** define `matchTestFilePath` before `setupTsJestCfg` ([#2373](https://github.com/kulshekhar/ts-jest/issues/2373)) ([c427fea](https://github.com/kulshekhar/ts-jest/commit/c427fea48a24b5ce6e8b9260d3c322583b062a77)), closes [#2371](https://github.com/kulshekhar/ts-jest/issues/2371)
* **config:** improve emit skipped error message and ensure `outDir` always `TS_JEST_OUT_DIR` ([#2357](https://github.com/kulshekhar/ts-jest/issues/2357)) ([f2808bb](https://github.com/kulshekhar/ts-jest/commit/f2808bb0b15231c67ccb9a97ed606741213c03e6))
* **typings:** set correct typing for `tsconfig`/`tsConfig` option ([#2377](https://github.com/kulshekhar/ts-jest/issues/2377)) ([d4f6aff](https://github.com/kulshekhar/ts-jest/commit/d4f6aff3f181761bf25c64ff1a97dd19a69196f9)), closes [#2368](https://github.com/kulshekhar/ts-jest/issues/2368)
## [26.5.1](https://github.com/kulshekhar/ts-jest/compare/v26.5.0...v26.5.1) (2021-02-09)
### Features
* **config:** support typed config options for jest config typescript ([#2336](https://github.com/kulshekhar/ts-jest/issues/2336)) ([f4f5d32](https://github.com/kulshekhar/ts-jest/commit/f4f5d3205d1c80e545a32c02c6a66e7e91386f7f))
* **presets:** add typing for `presets` entry point ([#2341](https://github.com/kulshekhar/ts-jest/issues/2341)) ([e12b004](https://github.com/kulshekhar/ts-jest/commit/e12b004dcc5848d5ae0638e885147c54e11cc72b)), closes [#2325](https://github.com/kulshekhar/ts-jest/issues/2325)
# [26.5.0](https://github.com/kulshekhar/ts-jest/compare/v26.5.0...v26.4.4) (2021-01-29)
### Bug Fixes
* reduce size of `node_modules` when adding `ts-jest` ([#2309](https://github.com/kulshekhar/ts-jest/issues/2309)) ([6bf2e8a](https://github.com/kulshekhar/ts-jest/commit/b8d5d2090567f23947d9efd87f5f869b16bf2e8a))
### Features
* introduce `exclude` to exclude files from diagnostics ([#2308](https://github.com/kulshekhar/ts-jest/issues/2308)) ([cd82fd3](https://github.com/kulshekhar/ts-jest/commit/0c555c250774a7fd9e356cf20a3d8b693cd82fd3))
### DEPRECATIONS
* **config**: deprecate `pathRegex` in favor of `exclude` ([#2308](https://github.com/kulshekhar/ts-jest/issues/2308)) ([cd82fd3](https://github.com/kulshekhar/ts-jest/commit/0c555c250774a7fd9e356cf20a3d8b693cd82fd3))
## [26.4.4](https://github.com/kulshekhar/ts-jest/compare/v26.4.3...v26.4.4) (2020-11-08)
### Bug Fixes
* revert usage of `@jest/create-cache-key-function` ([#2108](https://github.com/kulshekhar/ts-jest/issues/2108)) ([dee8231](https://github.com/kulshekhar/ts-jest/commit/dee823172ce1e8eb9e0b2dd3aeed1ab4033bd0d9)), closes [#2080](https://github.com/kulshekhar/ts-jest/issues/2080) [#2090](https://github.com/kulshekhar/ts-jest/issues/2090) [#2104](https://github.com/kulshekhar/ts-jest/issues/2104)
### Features
* **testing:** expose all types for util `mocked` ([#2096](https://github.com/kulshekhar/ts-jest/issues/2096)) ([b1d072b](https://github.com/kulshekhar/ts-jest/commit/b1d072b52b9a7665b3a6914b0895f84f6ee3f8c0)), closes [#2086](https://github.com/kulshekhar/ts-jest/issues/2086)
## [26.4.3](https://github.com/kulshekhar/ts-jest/compare/v26.4.2...v26.4.3) (2020-10-26)
### Bug Fixes
* **compiler:** only exclude test files when initializing compiler ([#2062](https://github.com/kulshekhar/ts-jest/issues/2062)) ([7264c13](https://github.com/kulshekhar/ts-jest/commit/7264c137114b6dd895624e3476dd7ec57b64ee13)), closes [#2061](https://github.com/kulshekhar/ts-jest/issues/2061), [#2068](https://github.com/kulshekhar/ts-jest/issues/2068), [#2072](https://github.com/kulshekhar/ts-jest/issues/2072), [#2073](https://github.com/kulshekhar/ts-jest/issues/2073)
* **config:** resolve `.babelrc` file path before attempting to read it ([#2071](https://github.com/kulshekhar/ts-jest/issues/2071)) ([681bfef](https://github.com/kulshekhar/ts-jest/commit/681bfef41744f09cd50b71072f4d001cb58da82e)), closes [#2064](https://github.com/kulshekhar/ts-jest/issues/2064)
### Features
* **config:** allow to override resolve tsconfig behavior ([#2063](https://github.com/kulshekhar/ts-jest/issues/2063)) ([9f46ace](https://github.com/kulshekhar/ts-jest/commit/9f46acefceb1fa71ee2e8b3b3c172ceb0544b4c4))
## [26.4.2](https://github.com/kulshekhar/ts-jest/compare/v26.4.1...v26.4.2) (2020-10-23)
### Features
* **config:** expose several typings as public apis ([#2054](https://github.com/kulshekhar/ts-jest/issues/2054)) ([3b6b705](https://github.com/kulshekhar/ts-jest/commit/3b6b7055e2b9c74e81fb91596c807ace02ab77a1))
### Performance Improvements
* **compiler:** speed up bootstrap time for `isolatedModules:false` ([#2055](https://github.com/kulshekhar/ts-jest/issues/2055)) ([230b5dd](https://github.com/kulshekhar/ts-jest/commit/230b5ddbee55357d25dd190cd45aa8a30d7f31e0))
### DEPRECATIONS
* **config**: deprecate `tsConfig` in favor of `tsconfig` ([#1997](https://github.com/kulshekhar/ts-jest/pull/1997))
* **config**: deprecate `packageJson` since internal codes don't use it anymore ([#2034](https://github.com/kulshekhar/ts-jest/pull/2034))
## [26.4.1](https://github.com/kulshekhar/ts-jest/compare/v26.4.0...v26.4.1) (2020-09-29)
### Bug Fixes
* **utils:** `MaybeMockedConstructor` returns T ([#1976](https://github.com/kulshekhar/ts-jest/issues/1976)) ([b7712b2](https://github.com/kulshekhar/ts-jest/commit/b7712b2055d8f32dd97999de1d94e8f3515d79e8))
* **utils:** revert `path.join` and add check on prefix ends with `/` ([#1989](https://github.com/kulshekhar/ts-jest/issues/1989)) ([3d9035b](https://github.com/kulshekhar/ts-jest/commit/3d9035bd70dc087d4c5a943bb2fe2af2d0822875)), closes [#1982](https://github.com/kulshekhar/ts-jest/issues/1982)
# [26.4.0](https://github.com/kulshekhar/ts-jest/compare/v26.3.0...v26.4.0) (2020-09-20)
### Bug Fixes
* **utils:** `pathsToModuleNameMapper` resolve path mapping with `path.join` ([#1969](https://github.com/kulshekhar/ts-jest/issues/1969)) ([81fce4c](https://github.com/kulshekhar/ts-jest/commit/81fce4c090811a1cc071579a99dc193fb976b117)), closes [#1968](https://github.com/kulshekhar/ts-jest/issues/1968)
* set minimum `jest-util` version at 26.1.0 ([#1914](https://github.com/kulshekhar/ts-jest/issues/1914)) ([f00414c](https://github.com/kulshekhar/ts-jest/commit/f00414c6fbf8fc5413fd33d0a271c4a164c50d45)), closes [#1913](https://github.com/kulshekhar/ts-jest/issues/1913)
### Features
* **config:** allow custom options in custom transformers ([#1966](https://github.com/kulshekhar/ts-jest/issues/1966)) ([1452ce4](https://github.com/kulshekhar/ts-jest/commit/1452ce4afcd36049cddd0db0861f1ac26b66f8c1)), closes [#1942](https://github.com/kulshekhar/ts-jest/issues/1942)
* **transformers:** support hoisting when using `@jest/globals` ([#1937](https://github.com/kulshekhar/ts-jest/issues/1937)) ([0e5be15](https://github.com/kulshekhar/ts-jest/commit/0e5be1597d755fed11869f67df05eeea54b3106f)), closes [#1593](https://github.com/kulshekhar/ts-jest/issues/1593)
* **transformers:** add `path-mapping` custom AST transformer ([#1927](https://github.com/kulshekhar/ts-jest/issues/1927)) ([3325186](https://github.com/kulshekhar/ts-jest/commit/3325186b6e55f41eb9bf7d81e092a358fc402b13))
### Performance Improvements
* **compiler:** remove `createProgram` for `isolatedModules: true` to boost startup speed ([#1941](https://github.com/kulshekhar/ts-jest/issues/1941)) ([dd84534](https://github.com/kulshekhar/ts-jest/commit/dd8453401840862186f991e2d514e0d328a67987))
# [26.3.0](https://github.com/kulshekhar/ts-jest/compare/v26.2.0...v26.3.0) (2020-08-25)
### Bug Fixes
* **config:** compute cache key without reading `package.json` ([#1893](https://github.com/kulshekhar/ts-jest/issues/1893)) ([4875a58](https://github.com/kulshekhar/ts-jest/commit/4875a58345666e0407f9f5b3f95049ae2c9d056d)), closes [#1892](https://github.com/kulshekhar/ts-jest/issues/1892)
### Features
* support TypeScript 4.0 ([#1889](https://github.com/kulshekhar/ts-jest/issues/1889)) ([f070e93](https://github.com/kulshekhar/ts-jest/commit/f070e9334a9cf31fa6f0d73b3f69d805be72601d))
# [26.2.0](https://github.com/kulshekhar/ts-jest/compare/v26.1.4...v26.2.0) (2020-08-11)
### Bug Fixes
* move `@types/jest` to dependencies to work well with yarn 2 ([#1859](https://github.com/kulshekhar/ts-jest/issues/1859)) ([5eb1389](https://github.com/kulshekhar/ts-jest/commit/5eb1389caaa0431e49ae6ca26b18e290208e0a0a)), closes [#1857](https://github.com/kulshekhar/ts-jest/issues/1857)
### Features
* **config:** support `after` and `afterDeclarations` AST transformers ([#1831](https://github.com/kulshekhar/ts-jest/issues/1831)) ([be20a7c](https://github.com/kulshekhar/ts-jest/commit/be20a7c78c97027b33aec178da0f533095790871))
* allow opt-out version warning message by environment variable `TS_JEST_DISABLE_VER_CHECKER` ([#1821](https://github.com/kulshekhar/ts-jest/issues/1821)) ([e6b42fc](https://github.com/kulshekhar/ts-jest/commit/e6b42fcd7a75c7b14e636a45cda04de18a46908b)), closes [#1774](https://github.com/kulshekhar/ts-jest/issues/1774)
## [26.1.4](https://github.com/kulshekhar/ts-jest/compare/v26.1.3...v26.1.4) (2020-07-28)
### Bug Fixes
* **compiler:** check if test file exists before doing type check ([#1827](https://github.com/kulshekhar/ts-jest/issues/1827)) ([cc89d5b](https://github.com/kulshekhar/ts-jest/commit/cc89d5b1f912975cd29114c5b3b0bf18426816da)), closes [#1506](https://github.com/kulshekhar/ts-jest/issues/1506)
## [26.1.3](https://github.com/kulshekhar/ts-jest/compare/v26.1.2...v26.1.3) (2020-07-16)
### Bug Fixes
* revert [#1793](https://github.com/kulshekhar/ts-jest/issues/1793) ([#1804](https://github.com/kulshekhar/ts-jest/issues/1804)) ([5095525](https://github.com/kulshekhar/ts-jest/commit/5095525333c8579c9c5e7f3149294b31f28d6774))
## [26.1.2](https://github.com/kulshekhar/ts-jest/compare/v26.1.1...v26.1.2) (2020-07-13)
### Bug Fixes
* **compiler:** use `resolveModuleNames` TypeScript API to get resolved modules for test files ([#1784](https://github.com/kulshekhar/ts-jest/issues/1784)) ([5f26054](https://github.com/kulshekhar/ts-jest/commit/5f2605457e94b548bd7b9b28fc968554f7eefa91)), closes [#1747](https://github.com/kulshekhar/ts-jest/issues/1747)
* **config:** invalidate cache when other options in `tsconfig` change ([#1788](https://github.com/kulshekhar/ts-jest/issues/1788)) ([6948855](https://github.com/kulshekhar/ts-jest/commit/69488552eca2846f3fc6ba86ab49d7893caaf521))
### Performance Improvements
* **compiler:** cache module resolution for `isolatedModules: false` ([#1786](https://github.com/kulshekhar/ts-jest/issues/1786)) ([7f731ed](https://github.com/kulshekhar/ts-jest/commit/7f731ed8a02755aeb41ecb27df4eaf16db2ddd95))
* **compiler:** use `globsToMatcher` from `jest-util` ([#1754](https://github.com/kulshekhar/ts-jest/issues/1754)) ([44f3913](https://github.com/kulshekhar/ts-jest/commit/44f3913c2a017734ed87346b1c5fbec639d02062))
<a name="26.1.1"></a>
## [26.1.1](https://github.com/kulshekhar/ts-jest/compare/v26.1.0...v26.1.1) (2020-06-21)
### Bug Fixes
* **compiler:** generate source map correctly when tsconfig `mapRoot` is set ([#1741](https://github.com/kulshekhar/ts-jest/issues/1741)) ([01ac417](https://github.com/kulshekhar/ts-jest/commit/01ac417)), closes [#1718](https://github.com/kulshekhar/ts-jest/issues/1718)
* **config:** show version warning when using ts-jest without babel ([#1729](https://github.com/kulshekhar/ts-jest/issues/1729)) ([e512bc0](https://github.com/kulshekhar/ts-jest/commit/e512bc0)), fixes [#1678-issuecomment-641930332](https://github.com//github.com/kulshekhar/ts-jest/pull/1678/issues/issuecomment-641930332), [#1678-issuecomment-639528993](https://github.com//github.com/kulshekhar/ts-jest/pull/1678/issues/issuecomment-639528993)
<a name="26.1.0"></a>
# [26.1.0](https://github.com/kulshekhar/ts-jest/compare/v26.0.0...v26.1.0) (2020-05-30)
### Bug Fixes
* **typing:** don't mark `BabelConfig` as internal type ([#1667](https://github.com/kulshekhar/ts-jest/issues/1667)) ([558c307](https://github.com/kulshekhar/ts-jest/commit/558c307)), closes [#1666](https://github.com/kulshekhar/ts-jest/issues/1666)
### Features
* **config:** show a warning message when TypeScript `target` version doesn't match with recommended NodeJs version ([#1678](https://github.com/kulshekhar/ts-jest/issues/1678)) ([085bdf5](https://github.com/kulshekhar/ts-jest/commit/085bdf5))
* **config:** support multiple paths for `pathsToModuleNameMapper` ([#1690](https://github.com/kulshekhar/ts-jest/issues/1690)) ([a727bd5](https://github.com/kulshekhar/ts-jest/commit/a727bd5))
* support TypeScript 3.9 ([#1653](https://github.com/kulshekhar/ts-jest/issues/1653)) ([fc3d5ad](https://github.com/kulshekhar/ts-jest/commit/fc3d5ad))
<a name="26.0.0"></a>
# [26.0.0](https://github.com/kulshekhar/ts-jest/compare/v25.5.1...v26.0.0) (2020-05-15)
### Bug Fixes
* **compiler:** return `undefined` for `getScriptVersion` when a file doesn't exist in memory cache ([#1641](https://github.com/kulshekhar/ts-jest/issues/1641)) ([6851b8e](https://github.com/kulshekhar/ts-jest/commit/6851b8e))
### Features
* support Jest v26 ([#1602](https://github.com/kulshekhar/ts-jest/issues/1602)) ([23b7741](https://github.com/kulshekhar/ts-jest/commit/23b7741))
### BREAKING CHANGES
* Requires a minimum of TypeScript v3.8
* Drop support for Node 8
<a name="25.5.1"></a> <a name="25.5.1"></a>
## [25.5.1](https://github.com/kulshekhar/ts-jest/compare/v25.5.0...v25.5.1) (2020-05-09) ## [25.5.1](https://github.com/kulshekhar/ts-jest/compare/v25.5.0...v25.5.1) (2020-05-09)
+12 -11
View File
@@ -1,18 +1,19 @@
# ts-jest <h1 align="center">ts-jest</h1>
[![npm version](https://badge.fury.io/js/ts-jest.svg)](https://badge.fury.io/js/ts-jest) <p align="center">A TypeScript preprocessor with source map support for Jest that lets you use Jest to test projects written in TypeScript.</p>
[![NPM downloads](https://img.shields.io/npm/dm/ts-jest.svg?style=flat)](https://npmjs.org/package/ts-jest)
[![Known Vulnerabilities](https://snyk.io/test/github/kulshekhar/ts-jest/badge.svg)](https://snyk.io/test/github/kulshekhar/ts-jest) <p align="center">
[![Coverage Status](https://coveralls.io/repos/github/kulshekhar/ts-jest/badge.svg?branch=master)](https://coveralls.io/github/kulshekhar/ts-jest?branch=master) <a href="https://www.npmjs.com/package/ts-jest"><img src="https://img.shields.io/npm/v/ts-jest/latest.svg?style=flat-square" alt="NPM version" /> </a>
[![Dependabot Status](https://api.dependabot.com/badges/status?host=github&repo=kulshekhar/ts-jest)](https://dependabot.com) <a href="https://www.npmjs.com/package/ts-jest"><img src="https://img.shields.io/npm/dm/ts-jest.svg?style=flat-square" alt="NPM downloads"/> </a>
[![Build Status](https://travis-ci.com/kulshekhar/ts-jest.svg?branch=master)](https://travis-ci.com/kulshekhar/ts-jest) <a href="https://snyk.io/test/github/kulshekhar/ts-jest"><img src="https://snyk.io/test/github/kulshekhar/ts-jest/badge.svg?style=flat-square" alt="Known vulnerabilities"/> </a>
[![doc-generator](https://github.com/kulshekhar/ts-jest/workflows/doc-generator/badge.svg)](https://github.com/kulshekhar/ts-jest/actions) <a href="https://coveralls.io/github/kulshekhar/ts-jest?branch=master"><img src="https://coveralls.io/repos/github/kulshekhar/ts-jest/badge.svg?branch=master" alt="Coverage status"/> </a>
[![release-and-publish](https://github.com/kulshekhar/ts-jest/workflows/release-and-publish/badge.svg)](https://github.com/kulshekhar/ts-jest/actions) <a href="https://travis-ci.com/kulshekhar/ts-jest"><img src="https://travis-ci.com/kulshekhar/ts-jest.svg?branch=master" alt="Build status"/> </a>
<a href="https://actions-badge.atrox.dev/kulshekhar/ts-jest/goto?ref=master"><img alt="GitHub actions" src="https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Fkulshekhar%2Fts-jest%2Fbadge%3Fref%3Dmaster&style=flat-square" /> </a>
<a href="https://github.com/kulshekhar/ts-jest/blob/master/LICENSE"><img src="https://img.shields.io/npm/l/ts-jest.svg?style=flat-square" alt="GitHub license"/> </a>
</p>
<img src="./icon.png" align="right" title="ts-jest Logo" width="128" height="128"> <img src="./icon.png" align="right" title="ts-jest Logo" width="128" height="128">
**`ts-jest`** is a TypeScript preprocessor with source map support for Jest that lets you use Jest to test projects written in TypeScript.
It supports all features of TypeScript including type-checking. [Read more about Babel7 + `preset-typescript` **vs** TypeScript (and `ts-jest`)](https://kulshekhar.github.io/ts-jest/user/babel7-or-ts). It supports all features of TypeScript including type-checking. [Read more about Babel7 + `preset-typescript` **vs** TypeScript (and `ts-jest`)](https://kulshekhar.github.io/ts-jest/user/babel7-or-ts).
--- ---
+4 -2
View File
@@ -47,14 +47,16 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
} }
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.help = exports.run = void 0;
var fs_1 = require("fs"); var fs_1 = require("fs");
var json5_1 = require("json5"); var json5_1 = require("json5");
var path_1 = require("path"); var path_1 = require("path");
var presets_1 = require("../helpers/presets"); var presets_1 = require("../helpers/presets");
exports.run = function (args) { return __awaiter(void 0, void 0, void 0, function () { exports.run = function (args) { return __awaiter(void 0, void 0, void 0, function () {
var file, filePath, name, isPackage, exists, pkgFile, hasPackage, _a, jestPreset, askedTsconfig, force, jsdom, tsconfig, pkgJson, jsFilesProcessor, shouldPostProcessWithBabel, preset, body, base, tsJestConf, content; var file, filePath, name, isPackage, exists, pkgFile, hasPackage, _a, jestPreset, askedTsconfig, force, jsdom, tsconfig, pkgJson, jsFilesProcessor, shouldPostProcessWithBabel, preset, body, base, tsJestConf, content;
return __generator(this, function (_b) { var _b, _c;
file = args._[0] || 'jest.config.js'; return __generator(this, function (_d) {
file = (_c = (_b = args._[0]) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : 'jest.config.js';
filePath = path_1.join(process.cwd(), file); filePath = path_1.join(process.cwd(), file);
name = path_1.basename(file); name = path_1.basename(file);
isPackage = name === 'package.json'; isPackage = name === 'package.json';
+5 -3
View File
@@ -56,18 +56,20 @@ var __spread = (this && this.__spread) || function () {
return ar; return ar;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.help = exports.run = void 0;
var bs_logger_1 = require("bs-logger"); var bs_logger_1 = require("bs-logger");
var stableStringify = require("fast-json-stable-stringify"); var stableStringify = require("fast-json-stable-stringify");
var fs_1 = require("fs"); var fs_1 = require("fs");
var json5_1 = require("json5"); var json5_1 = require("json5");
var path_1 = require("path"); var path_1 = require("path");
var backports_1 = require("../../util/backports"); var backports_1 = require("../../utils/backports");
var presets_1 = require("../helpers/presets"); var presets_1 = require("../helpers/presets");
exports.run = function (args) { return __awaiter(void 0, void 0, void 0, function () { exports.run = function (args) { return __awaiter(void 0, void 0, void 0, function () {
var nullLogger, file, filePath, footNotes, name, isPackage, actualConfig, migratedConfig, presetName, preset, jsTransformers, jsWithTs, jsWithBabel, presetValue, migratedValue, presetValue, migratedValue, before, after, stringify, prefix; var nullLogger, file, filePath, footNotes, name, isPackage, actualConfig, migratedConfig, presetName, preset, jsTransformers, jsWithTs, jsWithBabel, presetValue, migratedValue, presetValue, migratedValue, before, after, stringify, prefix;
return __generator(this, function (_a) { var _a;
return __generator(this, function (_b) {
nullLogger = bs_logger_1.createLogger({ targets: [] }); nullLogger = bs_logger_1.createLogger({ targets: [] });
file = args._[0]; file = (_a = args._[0]) === null || _a === void 0 ? void 0 : _a.toString();
filePath = path_1.resolve(process.cwd(), file); filePath = path_1.resolve(process.cwd(), file);
footNotes = []; footNotes = [];
if (!fs_1.existsSync(filePath)) { if (!fs_1.existsSync(filePath)) {
+1
View File
@@ -36,6 +36,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
} }
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.help = exports.run = void 0;
exports.run = function (_) { return __awaiter(void 0, void 0, void 0, function () { exports.run = function (_) { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) { return __generator(this, function (_a) {
process.stdout.write("\nUsage:\n ts-jest command [options] [...args]\n\nCommands:\n config:init Creates initial Jest configuration\n config:migrate Migrates a given Jest configuration\n help [command] Show this help, or help about a command\n\nExample:\n ts-jest help config:migrate\n"); process.stdout.write("\nUsage:\n ts-jest command [options] [...args]\n\nCommands:\n config:init Creates initial Jest configuration\n config:migrate Migrates a given Jest configuration\n help [command] Show this help, or help about a command\n\nExample:\n ts-jest help config:migrate\n");
+6 -4
View File
@@ -1,5 +1,6 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.jsWIthBabel = exports.jsWithTs = exports.defaults = exports.allPresets = void 0;
var definePreset = function (fullName) { return ({ var definePreset = function (fullName) { return ({
fullName: fullName, fullName: fullName,
get name() { get name() {
@@ -11,10 +12,11 @@ var definePreset = function (fullName) { return ({
get jsVarName() { get jsVarName() {
return this.isDefault return this.isDefault
? 'defaults' ? 'defaults'
: fullName :
.split('/') fullName
.pop() .split('/')
.replace(/\-([a-z])/g, function (_, l) { return l.toUpperCase(); }); .pop()
.replace(/\-([a-z])/g, function (_, l) { return l.toUpperCase(); });
}, },
get value() { get value() {
return require("../../../" + fullName.replace(/^ts-jest\//, '') + "/jest-preset"); return require("../../../" + fullName.replace(/^ts-jest\//, '') + "/jest-preset");
+7 -3
View File
@@ -35,18 +35,22 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
} }
}; };
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _a; var _a;
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.processArgv = void 0;
var bs_logger_1 = require("bs-logger"); var bs_logger_1 = require("bs-logger");
var yargsParser = require("yargs-parser"); var yargs_parser_1 = __importDefault(require("yargs-parser"));
var logger_1 = require("../util/logger"); var logger_1 = require("../utils/logger");
var VALID_COMMANDS = ['help', 'config:migrate', 'config:init']; var VALID_COMMANDS = ['help', 'config:migrate', 'config:init'];
var logger = logger_1.rootLogger.child((_a = {}, _a[bs_logger_1.LogContexts.namespace] = 'cli', _a[bs_logger_1.LogContexts.application] = 'ts-jest', _a)); var logger = logger_1.rootLogger.child((_a = {}, _a[bs_logger_1.LogContexts.namespace] = 'cli', _a[bs_logger_1.LogContexts.application] = 'ts-jest', _a));
function cli(args) { function cli(args) {
return __awaiter(this, void 0, void 0, function () { return __awaiter(this, void 0, void 0, function () {
var parsedArgv, command, isHelp, _a, run, help, cmd; var parsedArgv, command, isHelp, _a, run, help, cmd;
return __generator(this, function (_b) { return __generator(this, function (_b) {
parsedArgv = yargsParser(args, { parsedArgv = yargs_parser_1.default(args, {
boolean: ['dry-run', 'jest-preset', 'allow-js', 'diff', 'babel', 'force', 'jsdom'], boolean: ['dry-run', 'jest-preset', 'allow-js', 'diff', 'babel', 'force', 'jsdom'],
string: ['tsconfig', 'js'], string: ['tsconfig', 'js'],
count: ['verbose'], count: ['verbose'],
-1
View File
@@ -1 +0,0 @@
export {};
-33
View File
@@ -1,33 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var fs_1 = require("fs");
var micromatch = require("micromatch");
var path_1 = require("path");
var sha1_1 = require("../util/sha1");
function getResolvedModulesCache(cacheDir) {
return path_1.join(cacheDir, sha1_1.sha1('ts-jest-resolved-modules', '\x00'));
}
exports.getResolvedModulesCache = getResolvedModulesCache;
function cacheResolvedModules(fileName, fileContent, memoryCache, program, cacheDir, logger) {
var importReferences = program.getSourceFile(fileName).imports;
if (importReferences.length) {
logger.debug({ fileName: fileName }, 'cacheResolvedModules(): get resolved modules');
memoryCache.resolvedModules[fileName] = Object.create(null);
memoryCache.resolvedModules[fileName].modulePaths = importReferences
.filter(function (importReference) { var _a; return (_a = importReference.parent.parent.resolvedModules) === null || _a === void 0 ? void 0 : _a.get(importReference.text); })
.map(function (importReference) {
return path_1.normalize(importReference.parent.parent.resolvedModules.get(importReference.text)
.resolvedFileName);
})
.reduce(function (a, b) { return a.concat(b); }, []);
memoryCache.resolvedModules[fileName].testFileContent = fileContent;
fs_1.writeFileSync(getResolvedModulesCache(cacheDir), JSON.stringify(memoryCache.resolvedModules));
}
}
exports.cacheResolvedModules = cacheResolvedModules;
function isTestFile(testMatchPatterns, fileName) {
return testMatchPatterns.some(function (pattern) {
return typeof pattern === 'string' ? micromatch.isMatch(fileName, pattern) : pattern.test(fileName);
});
}
exports.isTestFile = isTestFile;
+2 -1
View File
@@ -1 +1,2 @@
export {}; export declare const SOURCE_MAPPING_PREFIX = "sourceMappingURL=";
export declare function updateOutput(outputText: string, normalizedFileName: string, sourceMap: string): string;
+15 -56
View File
@@ -1,15 +1,4 @@
"use strict"; "use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __read = (this && this.__read) || function (o, n) { var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator]; var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o; if (!m) return o;
@@ -27,70 +16,40 @@ var __read = (this && this.__read) || function (o, n) {
return ar; return ar;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var fs_1 = require("fs"); exports.createCompilerInstance = exports.updateOutput = exports.SOURCE_MAPPING_PREFIX = void 0;
var mkdirp = require("mkdirp");
var path_1 = require("path");
var compiler_utils_1 = require("./compiler-utils");
var language_service_1 = require("./language-service"); var language_service_1 = require("./language-service");
var transpiler_1 = require("./transpiler"); var transpiler_1 = require("./transpiler");
function updateOutput(outputText, normalizedFileName, sourceMap, getExtension) { var json_1 = require("../utils/json");
var base = path_1.basename(normalizedFileName); exports.SOURCE_MAPPING_PREFIX = 'sourceMappingURL=';
function updateOutput(outputText, normalizedFileName, sourceMap) {
var base64Map = Buffer.from(updateSourceMap(sourceMap, normalizedFileName), 'utf8').toString('base64'); var base64Map = Buffer.from(updateSourceMap(sourceMap, normalizedFileName), 'utf8').toString('base64');
var sourceMapContent = "data:application/json;charset=utf-8;base64," + base64Map; var sourceMapContent = "data:application/json;charset=utf-8;base64," + base64Map;
var sourceMapLength = (base + ".map").length + (getExtension(normalizedFileName).length - path_1.extname(normalizedFileName).length); return (outputText.slice(0, outputText.lastIndexOf(exports.SOURCE_MAPPING_PREFIX) + exports.SOURCE_MAPPING_PREFIX.length) + sourceMapContent);
return outputText.slice(0, -sourceMapLength) + sourceMapContent;
} }
exports.updateOutput = updateOutput;
var updateSourceMap = function (sourceMapText, normalizedFileName) { var updateSourceMap = function (sourceMapText, normalizedFileName) {
var sourceMap = JSON.parse(sourceMapText); var sourceMap = JSON.parse(sourceMapText);
sourceMap.file = normalizedFileName; sourceMap.file = normalizedFileName;
sourceMap.sources = [normalizedFileName]; sourceMap.sources = [normalizedFileName];
delete sourceMap.sourceRoot; delete sourceMap.sourceRoot;
return JSON.stringify(sourceMap); return json_1.stringify(sourceMap);
}; };
var compileAndCacheResult = function (memoryCache, compileFn, getExtension, logger) { return function (code, fileName, lineOffset) { var compileAndUpdateOutput = function (compileFn, logger) { return function (code, fileName, lineOffset) {
logger.debug({ fileName: fileName }, 'compileAndCacheResult(): get compile output'); logger.debug({ fileName: fileName }, 'compileAndUpdateOutput(): get compile output');
var _a = __read(compileFn(code, fileName, lineOffset), 2), value = _a[0], sourceMap = _a[1]; var _a = __read(compileFn(code, fileName, lineOffset), 2), value = _a[0], sourceMap = _a[1];
var output = updateOutput(value, fileName, sourceMap, getExtension); return updateOutput(value, fileName, sourceMap);
memoryCache.files.set(fileName, __assign(__assign({}, memoryCache.files.get(fileName)), { output: output }));
return output;
}; }; }; };
exports.createCompilerInstance = function (configs) { exports.createCompilerInstance = function (configs) {
var logger = configs.logger.child({ namespace: 'ts-compiler' }); var logger = configs.logger.child({ namespace: 'ts-compiler' });
var compilerOptions = configs.parsedTsConfig.options, tsJest = configs.tsJest; var compilerOptions = configs.parsedTsConfig.options;
var cacheDir = configs.tsCacheDir;
var ts = configs.compilerModule;
var extensions = ['.ts', '.tsx']; var extensions = ['.ts', '.tsx'];
var memoryCache = {
files: new Map(),
resolvedModules: Object.create(null),
};
if (compilerOptions.allowJs) { if (compilerOptions.allowJs) {
extensions.push('.js'); extensions.push('.js');
extensions.push('.jsx'); extensions.push('.jsx');
} }
if (cacheDir) { var compilerInstance = !configs.isolatedModules
mkdirp.sync(cacheDir); ? language_service_1.initializeLanguageServiceInstance(configs, logger)
try { : transpiler_1.initializeTranspilerInstance(configs, logger);
var fsMemoryCache = fs_1.readFileSync(compiler_utils_1.getResolvedModulesCache(cacheDir), 'utf-8'); var compile = compileAndUpdateOutput(compilerInstance.compileFn, logger);
memoryCache.resolvedModules = JSON.parse(fsMemoryCache);
}
catch (e) { }
}
configs.parsedTsConfig.fileNames.forEach(function (fileName) {
memoryCache.files.set(fileName, {
version: 0,
});
});
var getExtension = compilerOptions.jsx === ts.JsxEmit.Preserve
? function (path) { return (/\.[tj]sx$/.test(path) ? '.jsx' : '.js'); }
: function (_) { return '.js'; };
var compilerInstance;
if (!tsJest.isolatedModules) {
compilerInstance = language_service_1.initializeLanguageServiceInstance(configs, memoryCache, logger);
}
else {
compilerInstance = transpiler_1.initializeTranspilerInstance(configs, memoryCache, logger);
}
var compile = compileAndCacheResult(memoryCache, compilerInstance.compileFn, getExtension, logger);
return { cwd: configs.cwd, compile: compile, program: compilerInstance.program }; return { cwd: configs.cwd, compile: compile, program: compilerInstance.program };
}; };
+161 -30
View File
@@ -1,4 +1,40 @@
"use strict"; "use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __read = (this && this.__read) || function (o, n) { var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator]; var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o; if (!m) return o;
@@ -19,35 +55,100 @@ var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar; return ar;
}; };
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.initializeLanguageServiceInstance = void 0;
var bs_logger_1 = require("bs-logger"); var bs_logger_1 = require("bs-logger");
var fs_1 = require("fs");
var path_1 = require("path"); var path_1 = require("path");
var memoize = require("lodash/memoize");
var mkdirp = require("mkdirp");
var constants_1 = require("../constants"); var constants_1 = require("../constants");
var messages_1 = require("../util/messages"); var messages_1 = require("../utils/messages");
var compiler_utils_1 = require("./compiler-utils"); var json_1 = require("../utils/json");
var memoize = require("lodash.memoize"); var sha1_1 = require("../utils/sha1");
function doTypeChecking(configs, fileName, service, logger) { function doTypeChecking(configs, diagnosedFiles, fileName, service, logger) {
if (configs.shouldReportDiagnostic(fileName)) { if (configs.shouldReportDiagnostics(fileName)) {
var diagnostics = service.getSemanticDiagnostics(fileName).concat(service.getSyntacticDiagnostics(fileName)); var diagnostics = service.getSemanticDiagnostics(fileName).concat(service.getSyntacticDiagnostics(fileName));
diagnosedFiles.push(fileName);
configs.raiseDiagnostics(diagnostics, fileName, logger); configs.raiseDiagnostics(diagnostics, fileName, logger);
} }
} }
exports.initializeLanguageServiceInstance = function (configs, memoryCache, logger) { exports.initializeLanguageServiceInstance = function (configs, logger) {
var _a; var _a;
logger.debug('initializeLanguageServiceInstance(): create typescript compiler'); logger.debug('initializeLanguageServiceInstance(): create typescript compiler');
var ts = configs.compilerModule; var ts = configs.compilerModule;
var cwd = configs.cwd; var cwd = configs.cwd;
var cacheDir = configs.tsCacheDir; var cacheDir = configs.tsCacheDir;
var _b = configs.parsedTsConfig, options = _b.options, fileNames = _b.fileNames; var _b = configs.parsedTsConfig, options = _b.options, fileNames = _b.fileNames;
var diagnosedFiles = [];
var serviceHostTraceCtx = (_a = { var serviceHostTraceCtx = (_a = {
namespace: 'ts:serviceHost', namespace: 'ts:serviceHost',
call: null call: null
}, },
_a[bs_logger_1.LogContexts.logLevel] = bs_logger_1.LogLevels.trace, _a[bs_logger_1.LogContexts.logLevel] = bs_logger_1.LogLevels.trace,
_a); _a);
var memoryCache = {
files: new Map(),
resolvedModules: new Map(),
};
var tsResolvedModulesCachePath;
if (cacheDir) {
mkdirp.sync(cacheDir);
tsResolvedModulesCachePath = path_1.join(cacheDir, sha1_1.sha1('ts-jest-resolved-modules', '\x00'));
try {
var cachedTSResolvedModules = fs_1.readFileSync(tsResolvedModulesCachePath, 'utf-8');
memoryCache.resolvedModules = new Map(json_1.parse(cachedTSResolvedModules));
}
catch (e) { }
}
configs.parsedTsConfig.fileNames
.filter(function (fileName) { return constants_1.TS_TSX_REGEX.test(path_1.extname(fileName)) && !configs.isTestFile(fileName); })
.forEach(function (fileName) {
memoryCache.files.set(fileName, {
version: 0,
});
});
function isFileInCache(fileName) { function isFileInCache(fileName) {
return memoryCache.files.has(fileName) && memoryCache.files.get(fileName).version !== 0; return memoryCache.files.has(fileName) && memoryCache.files.get(fileName).version !== 0;
} }
var cacheReadFile = logger.wrap(serviceHostTraceCtx, 'readFile', memoize(ts.sys.readFile));
var moduleResolutionHost = {
fileExists: memoize(ts.sys.fileExists),
readFile: cacheReadFile,
directoryExists: memoize(ts.sys.directoryExists),
getCurrentDirectory: function () { return cwd; },
realpath: ts.sys.realpath && memoize(ts.sys.realpath),
getDirectories: memoize(ts.sys.getDirectories),
};
var moduleResolutionCache = ts.createModuleResolutionCache(cwd, function (x) { return x; }, options);
function resolveModuleNames(moduleNames, containingFile) {
var _a;
var normalizedContainingFile = path_1.normalize(containingFile);
var currentResolvedModules = (_a = memoryCache.resolvedModules.get(normalizedContainingFile)) !== null && _a !== void 0 ? _a : [];
return moduleNames.map(function (moduleName) {
var resolveModuleName = ts.resolveModuleName(moduleName, containingFile, options, moduleResolutionHost, moduleResolutionCache);
var resolvedModule = resolveModuleName.resolvedModule;
if (configs.isTestFile(normalizedContainingFile) && resolvedModule) {
var normalizedResolvedFileName = path_1.normalize(resolvedModule.resolvedFileName);
if (!currentResolvedModules.includes(normalizedResolvedFileName)) {
currentResolvedModules.push(normalizedResolvedFileName);
memoryCache.resolvedModules.set(normalizedContainingFile, currentResolvedModules);
}
}
return resolvedModule;
});
}
var projectVersion = 1; var projectVersion = 1;
var updateMemoryCache = function (contents, fileName) { var updateMemoryCache = function (contents, fileName) {
logger.debug({ fileName: fileName }, 'updateMemoryCache(): update memory cache for language service'); logger.debug({ fileName: fileName }, 'updateMemoryCache(): update memory cache for language service');
@@ -81,18 +182,19 @@ exports.initializeLanguageServiceInstance = function (configs, memoryCache, logg
getProjectVersion: function () { return String(projectVersion); }, getProjectVersion: function () { return String(projectVersion); },
getScriptFileNames: function () { return __spread(memoryCache.files.keys()); }, getScriptFileNames: function () { return __spread(memoryCache.files.keys()); },
getScriptVersion: function (fileName) { getScriptVersion: function (fileName) {
var _a;
var normalizedFileName = path_1.normalize(fileName); var normalizedFileName = path_1.normalize(fileName);
var version = memoryCache.files.get(normalizedFileName).version; var version = (_a = memoryCache.files.get(normalizedFileName)) === null || _a === void 0 ? void 0 : _a.version;
return version === undefined ? undefined : String(version); return version === undefined ? undefined : String(version);
}, },
getScriptSnapshot: function (fileName) { getScriptSnapshot: function (fileName) {
var _a; var _a;
var normalizedFileName = path_1.normalize(fileName); var normalizedFileName = path_1.normalize(fileName);
var hit = memoryCache.files.has(normalizedFileName) && memoryCache.files.get(normalizedFileName).version !== 0; var hit = isFileInCache(normalizedFileName);
logger.trace({ normalizedFileName: normalizedFileName, cacheHit: hit }, 'getScriptSnapshot():', 'cache', hit ? 'hit' : 'miss'); logger.trace({ normalizedFileName: normalizedFileName, cacheHit: hit }, 'getScriptSnapshot():', 'cache', hit ? 'hit' : 'miss');
if (!hit) { if (!hit) {
memoryCache.files.set(normalizedFileName, { memoryCache.files.set(normalizedFileName, {
text: ts.sys.readFile(normalizedFileName), text: cacheReadFile(normalizedFileName),
version: 1, version: 1,
}); });
} }
@@ -102,46 +204,75 @@ exports.initializeLanguageServiceInstance = function (configs, memoryCache, logg
return ts.ScriptSnapshot.fromString(contents); return ts.ScriptSnapshot.fromString(contents);
}, },
fileExists: memoize(ts.sys.fileExists), fileExists: memoize(ts.sys.fileExists),
readFile: logger.wrap(serviceHostTraceCtx, 'readFile', memoize(ts.sys.readFile)), readFile: cacheReadFile,
readDirectory: memoize(ts.sys.readDirectory), readDirectory: memoize(ts.sys.readDirectory),
getDirectories: memoize(ts.sys.getDirectories), getDirectories: memoize(ts.sys.getDirectories),
directoryExists: memoize(ts.sys.directoryExists), directoryExists: memoize(ts.sys.directoryExists),
realpath: memoize(ts.sys.realpath), realpath: ts.sys.realpath && memoize(ts.sys.realpath),
getNewLine: function () { return constants_1.LINE_FEED; }, getNewLine: function () { return constants_1.LINE_FEED; },
getCurrentDirectory: function () { return cwd; }, getCurrentDirectory: function () { return cwd; },
getCompilationSettings: function () { return options; }, getCompilationSettings: function () { return options; },
getDefaultLibFileName: function () { return ts.getDefaultLibFilePath(options); }, getDefaultLibFileName: function () { return ts.getDefaultLibFilePath(options); },
getCustomTransformers: function () { return configs.tsCustomTransformers; }, getCustomTransformers: function () { return configs.customTransformers; },
resolveModuleNames: resolveModuleNames,
}; };
logger.debug('initializeLanguageServiceInstance(): creating language service'); logger.debug('initializeLanguageServiceInstance(): creating language service');
var service = ts.createLanguageService(serviceHost, ts.createDocumentRegistry()); var service = ts.createLanguageService(serviceHost, ts.createDocumentRegistry());
return { return {
compileFn: function (code, fileName) { compileFn: function (code, fileName) {
var e_1, _a;
var _b;
logger.debug({ fileName: fileName }, 'compileFn(): compiling using language service'); logger.debug({ fileName: fileName }, 'compileFn(): compiling using language service');
updateMemoryCache(code, fileName); updateMemoryCache(code, fileName);
var output = service.getEmitOutput(fileName); var output = service.getEmitOutput(fileName);
logger.debug({ fileName: fileName }, 'compileFn(): computing diagnostics using language service'); if (tsResolvedModulesCachePath) {
doTypeChecking(configs, fileName, service, logger); void (function () { return __awaiter(void 0, void 0, void 0, function () {
if (cacheDir) { return __generator(this, function (_a) {
if (compiler_utils_1.isTestFile(configs.testMatchPatterns, fileName)) { switch (_a.label) {
compiler_utils_1.cacheResolvedModules(fileName, code, memoryCache, service.getProgram(), cacheDir, logger); case 0: return [4, fs_1.writeFile(tsResolvedModulesCachePath, json_1.stringify(__spread(memoryCache.resolvedModules)), function () { })];
} case 1:
else { _a.sent();
Object.entries(memoryCache.resolvedModules) return [2];
.filter(function (entry) { }
return entry[1].modulePaths.find(function (modulePath) { return modulePath === fileName; }) && !memoryCache.files.has(entry[0]);
})
.forEach(function (entry) {
var testFileName = entry[0];
var testFileContent = entry[1].testFileContent;
logger.debug({ fileName: fileName }, 'compileFn(): computing diagnostics for test file that imports this module using language service');
updateMemoryCache(testFileContent, testFileName);
doTypeChecking(configs, testFileName, service, logger);
}); });
}); })();
}
if (!diagnosedFiles.includes(fileName)) {
logger.debug({ fileName: fileName }, 'compileFn(): computing diagnostics using language service');
doTypeChecking(configs, diagnosedFiles, fileName, service, logger);
}
if (!configs.isTestFile(fileName)) {
try {
for (var _c = __values(memoryCache.resolvedModules.entries()), _d = _c.next(); !_d.done; _d = _c.next()) {
var _e = __read(_d.value, 2), testFileName = _e[0], resolvedModules = _e[1];
if (resolvedModules.includes(fileName) &&
!diagnosedFiles.includes(testFileName) &&
fs_1.existsSync(testFileName)) {
var testFileContent = (_b = memoryCache.files.get(testFileName)) === null || _b === void 0 ? void 0 : _b.text;
if (!testFileContent) {
updateMemoryCache(cacheReadFile(testFileName), testFileName);
}
logger.debug({ testFileName: testFileName }, 'compileFn(): computing diagnostics using language service for test file which uses the module');
doTypeChecking(configs, diagnosedFiles, testFileName, service, logger);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
}
finally { if (e_1) throw e_1.error; }
} }
} }
if (output.emitSkipped) { if (output.emitSkipped) {
throw new TypeError(path_1.relative(cwd, fileName) + ": Emit skipped for language service"); if (constants_1.TS_TSX_REGEX.test(fileName)) {
throw new Error(messages_1.interpolate("Unable to process '{{file}}', please make sure that `outDir` in your tsconfig is neither `''` or `'.'`. You can also configure Jest config option `transformIgnorePatterns` to inform `ts-jest` to transform {{file}}", { file: fileName }));
}
else {
logger.warn(messages_1.interpolate("Unable to process '{{file}}', falling back to original file content. You can also configure Jest config option `transformIgnorePatterns` to ignore {{file}} from transformation or make sure that `outDir` in your tsconfig is neither `''` or `'.'`", { file: fileName }));
return [code, '{}'];
}
} }
if (!output.outputFiles.length) { if (!output.outputFiles.length) {
throw new TypeError(messages_1.interpolate("Unable to require `.d.ts` file for file: {{file}}.\nThis is usually the result of a faulty configuration or import. Make sure there is a `.js`, `.json` or another executable extension available alongside `{{file}}`.", { throw new TypeError(messages_1.interpolate("Unable to require `.d.ts` file for file: {{file}}.\nThis is usually the result of a faulty configuration or import. Make sure there is a `.js`, `.json` or another executable extension available alongside `{{file}}`.", {
+7 -15
View File
@@ -1,32 +1,24 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.initializeTranspilerInstance = function (configs, memoryCache, logger) { exports.initializeTranspilerInstance = void 0;
exports.initializeTranspilerInstance = function (configs, logger) {
logger.debug('initializeTranspilerInstance(): create typescript compiler'); logger.debug('initializeTranspilerInstance(): create typescript compiler');
var _a = configs.parsedTsConfig, options = _a.options, fileNames = _a.fileNames; var options = configs.parsedTsConfig.options;
var ts = configs.compilerModule; var ts = configs.compilerModule;
var program = ts.createProgram(fileNames, options);
var updateFileInCache = function (contents, filePath) {
var file = memoryCache.files.get(filePath);
if (file && file.text !== contents) {
file.version++;
file.text = contents;
}
};
return { return {
compileFn: function (code, fileName) { compileFn: function (code, fileName) {
updateFileInCache(code, fileName);
logger.debug({ fileName: fileName }, 'compileFn(): compiling as isolated module'); logger.debug({ fileName: fileName }, 'compileFn(): compiling as isolated module');
var result = ts.transpileModule(code, { var result = ts.transpileModule(code, {
fileName: fileName, fileName: fileName,
transformers: configs.tsCustomTransformers, transformers: configs.customTransformers,
compilerOptions: options, compilerOptions: options,
reportDiagnostics: configs.shouldReportDiagnostic(fileName), reportDiagnostics: configs.shouldReportDiagnostics(fileName),
}); });
if (result.diagnostics && configs.shouldReportDiagnostic(fileName)) { if (result.diagnostics && configs.shouldReportDiagnostics(fileName)) {
configs.raiseDiagnostics(result.diagnostics, fileName, logger); configs.raiseDiagnostics(result.diagnostics, fileName, logger);
} }
return [result.outputText, result.sourceMapText]; return [result.outputText, result.sourceMapText];
}, },
program: program, program: undefined,
}; };
}; };
+24 -7
View File
@@ -1,11 +1,28 @@
import { Config } from '@jest/types'; import type { Config } from '@jest/types';
import { Logger } from 'bs-logger'; import { Logger } from 'bs-logger';
import { TsCompiler, TsJestGlobalOptions } from '../types'; import { CompilerOptions, CustomTransformers, Diagnostic, ParsedCommandLine } from 'typescript';
import type { TTypeScript } from '../types';
import type { RawCompilerOptions } from '../tsconfig-raw';
export declare class ConfigSet { export declare class ConfigSet {
readonly parentOptions?: TsJestGlobalOptions | undefined; private readonly parentLogger?;
get versions(): Record<string, string>;
get tsCompiler(): TsCompiler;
get tsJestDigest(): string;
readonly logger: Logger; readonly logger: Logger;
constructor(jestConfig: Config.ProjectConfig, parentOptions?: TsJestGlobalOptions | undefined, parentLogger?: Logger); readonly compilerModule: TTypeScript;
readonly isolatedModules: boolean;
readonly cwd: string;
tsCacheDir: string | undefined;
parsedTsConfig: ParsedCommandLine | Record<string, any>;
customTransformers: CustomTransformers;
readonly rootDir: string;
protected _overriddenCompilerOptions: Partial<CompilerOptions>;
constructor(jestConfig: Config.ProjectConfig | undefined, parentLogger?: Logger | undefined);
protected _resolveTsConfig(compilerOptions?: RawCompilerOptions, resolvedConfigFile?: string): Record<string, any>;
get tsJestDigest(): string;
isTestFile(fileName: string): boolean;
shouldStringifyContent(filePath: string): boolean;
raiseDiagnostics(diagnostics: Diagnostic[], filePath?: string, logger?: Logger): void;
shouldReportDiagnostics(filePath: string): boolean;
resolvePath(inputPath: string, { throwIfMissing, nodeResolve }?: {
throwIfMissing?: boolean;
nodeResolve?: boolean;
}): string;
} }
+348 -598
View File
File diff suppressed because it is too large Load Diff
-10
View File
@@ -1,10 +0,0 @@
import { Config } from '@jest/types';
export interface TsJestPresets {
transform: Config.InitialOptions['transform'];
testMatch?: string[];
moduleFileExtensions?: string[];
}
export interface CreateJestPresetOptions {
allowJs?: boolean;
}
export declare function createJestPreset({ allowJs }?: CreateJestPresetOptions, from?: Config.InitialOptions): TsJestPresets;
+5 -4
View File
@@ -1,5 +1,6 @@
import type { Config } from '@jest/types';
declare type JestPathMapping = Config.InitialOptions['moduleNameMapper'];
export declare const pathsToModuleNameMapper: (mapping: import("typescript").MapLike<string[]>, { prefix }?: { export declare const pathsToModuleNameMapper: (mapping: import("typescript").MapLike<string[]>, { prefix }?: {
prefix?: string | undefined; prefix: string;
}) => { }) => JestPathMapping;
[key: string]: string | string[]; export {};
} | undefined;
+14 -13
View File
@@ -12,14 +12,15 @@ var __values = (this && this.__values) || function(o) {
}; };
var _a; var _a;
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.pathsToModuleNameMapper = void 0;
var bs_logger_1 = require("bs-logger"); var bs_logger_1 = require("bs-logger");
var logger_1 = require("../util/logger"); var logger_1 = require("../utils/logger");
var messages_1 = require("../util/messages"); var messages_1 = require("../utils/messages");
var escapeRegex = function (str) { return str.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&'); }; var escapeRegex = function (str) { return str.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&'); };
var logger = logger_1.rootLogger.child((_a = {}, _a[bs_logger_1.LogContexts.namespace] = 'path-mapper', _a)); var logger = logger_1.rootLogger.child((_a = {}, _a[bs_logger_1.LogContexts.namespace] = 'path-mapper', _a));
exports.pathsToModuleNameMapper = function (mapping, _a) { exports.pathsToModuleNameMapper = function (mapping, _a) {
var e_1, _b; var e_1, _b;
var _c = (_a === void 0 ? {} : _a).prefix, prefix = _c === void 0 ? '' : _c; var _c = (_a === void 0 ? Object.create(null) : _a).prefix, prefix = _c === void 0 ? '' : _c;
var jestMap = {}; var jestMap = {};
try { try {
for (var _d = __values(Object.keys(mapping)), _e = _d.next(); !_e.done; _e = _d.next()) { for (var _d = __values(Object.keys(mapping)), _e = _d.next(); !_e.done; _e = _d.next()) {
@@ -30,25 +31,25 @@ exports.pathsToModuleNameMapper = function (mapping, _a) {
logger.warn(messages_1.interpolate("Not mapping \"{{path}}\" because it has no target.", { path: fromPath })); logger.warn(messages_1.interpolate("Not mapping \"{{path}}\" because it has no target.", { path: fromPath }));
continue; continue;
} }
else if (toPaths.length > 1) {
logger.warn(messages_1.interpolate("Mapping only to first target of \"{{path}}\" because it has more than one ({{count}}).", {
path: fromPath,
count: toPaths.length,
}));
}
var target = toPaths[0];
var segments = fromPath.split(/\*/g); var segments = fromPath.split(/\*/g);
if (segments.length === 1) { if (segments.length === 1) {
var paths = toPaths.map(function (target) {
var enrichedPrefix = prefix !== '' && !prefix.endsWith('/') ? prefix + "/" : prefix;
return "" + enrichedPrefix + target;
});
pattern = "^" + escapeRegex(fromPath) + "$"; pattern = "^" + escapeRegex(fromPath) + "$";
jestMap[pattern] = "" + prefix + target; jestMap[pattern] = paths.length === 1 ? paths[0] : paths;
} }
else if (segments.length === 2) { else if (segments.length === 2) {
var paths = toPaths.map(function (target) {
var enrichedPrefix = prefix !== '' && !prefix.endsWith('/') ? prefix + "/" : prefix;
return "" + enrichedPrefix + target.replace(/\*/g, '$1');
});
pattern = "^" + escapeRegex(segments[0]) + "(.*)" + escapeRegex(segments[1]) + "$"; pattern = "^" + escapeRegex(segments[0]) + "(.*)" + escapeRegex(segments[1]) + "$";
jestMap[pattern] = "" + prefix + target.replace(/\*/g, '$1'); jestMap[pattern] = paths.length === 1 ? paths[0] : paths;
} }
else { else {
logger.warn(messages_1.interpolate("Not mapping \"{{path}}\" because it has more than one star (`*`).", { path: fromPath })); logger.warn(messages_1.interpolate("Not mapping \"{{path}}\" because it has more than one star (`*`).", { path: fromPath }));
continue;
} }
} }
} }
+4 -1
View File
@@ -1 +1,4 @@
export {}; export declare const LINE_FEED = "\n";
export declare const TS_TSX_REGEX: RegExp;
export declare const JS_JSX_REGEX: RegExp;
export declare const DECLARATION_TYPE_EXT = ".d.ts";
+2 -2
View File
@@ -1,8 +1,8 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.DEFAULT_JEST_TEST_MATCH = exports.DECLARATION_TYPE_EXT = exports.JS_JSX_REGEX = exports.TS_TSX_REGEX = exports.LINE_FEED = void 0;
exports.LINE_FEED = '\n'; exports.LINE_FEED = '\n';
exports.EXTENSION_REGEX = /\.[^.]+$/;
exports.TS_TSX_REGEX = /\.tsx?$/; exports.TS_TSX_REGEX = /\.tsx?$/;
exports.JS_JSX_REGEX = /\.jsx?$/; exports.JS_JSX_REGEX = /\.jsx?$/;
exports.JSON_REGEX = /\.json$/i; exports.DECLARATION_TYPE_EXT = '.d.ts';
exports.DEFAULT_JEST_TEST_MATCH = ['**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[jt]s?(x)']; exports.DEFAULT_JEST_TEST_MATCH = ['**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[jt]s?(x)'];
+5 -9
View File
@@ -1,7 +1,7 @@
import { createJestPreset as createJestPresetCore } from './config/create-jest-preset'; import { createJestPreset as createJestPresetCore } from './presets/create-jest-preset';
import { TsJestTransformer } from './ts-jest-transformer'; import { TsJestTransformer } from './ts-jest-transformer';
import { TsJestGlobalOptions } from './types'; import type { TsJestGlobalOptions } from './types';
import { mocked as mockedCore } from './util/testing'; import { mocked as mockedCore } from './utils/testing';
declare module '@jest/types' { declare module '@jest/types' {
namespace Config { namespace Config {
interface ConfigGlobals { interface ConfigGlobals {
@@ -12,12 +12,8 @@ declare module '@jest/types' {
export declare const mocked: typeof mockedCore; export declare const mocked: typeof mockedCore;
export declare const createJestPreset: typeof createJestPresetCore; export declare const createJestPreset: typeof createJestPresetCore;
export declare const pathsToModuleNameMapper: (mapping: import("typescript").MapLike<string[]>, { prefix }?: { export declare const pathsToModuleNameMapper: (mapping: import("typescript").MapLike<string[]>, { prefix }?: {
prefix?: string | undefined; prefix: string;
}) => { }) => {
[key: string]: string | string[]; [key: string]: string | string[];
} | undefined; } | undefined;
export declare const version: string; export declare function createTransformer(): TsJestTransformer;
export declare const digest: string;
export declare function createTransformer(baseConfig?: TsJestGlobalOptions): TsJestTransformer;
declare const jestPreset: import("./config/create-jest-preset").TsJestPresets;
export { jestPreset, };
+8 -58
View File
@@ -1,36 +1,15 @@
"use strict"; "use strict";
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
};
var _a; var _a;
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.createTransformer = exports.pathsToModuleNameMapper = exports.createJestPreset = exports.mocked = void 0;
var bs_logger_1 = require("bs-logger"); var bs_logger_1 = require("bs-logger");
var fs_1 = require("fs"); var create_jest_preset_1 = require("./presets/create-jest-preset");
var path_1 = require("path");
var create_jest_preset_1 = require("./config/create-jest-preset");
var paths_to_module_name_mapper_1 = require("./config/paths-to-module-name-mapper"); var paths_to_module_name_mapper_1 = require("./config/paths-to-module-name-mapper");
var ts_jest_transformer_1 = require("./ts-jest-transformer"); var ts_jest_transformer_1 = require("./ts-jest-transformer");
var logger_1 = require("./util/logger"); var logger_1 = require("./utils/logger");
var messages_1 = require("./util/messages"); var messages_1 = require("./utils/messages");
var testing_1 = require("./util/testing"); var testing_1 = require("./utils/testing");
var version_checkers_1 = require("./util/version-checkers"); var version_checkers_1 = require("./utils/version-checkers");
var warn = logger_1.rootLogger.child((_a = {}, _a[bs_logger_1.LogContexts.logLevel] = bs_logger_1.LogLevels.warn, _a)); var warn = logger_1.rootLogger.child((_a = {}, _a[bs_logger_1.LogContexts.logLevel] = bs_logger_1.LogLevels.warn, _a));
var helperMoved = function (name, helper) { var helperMoved = function (name, helper) {
return warn.wrap(messages_1.interpolate("The `{{helper}}` helper has been moved to `ts-jest/utils`. Use `import { {{helper}} } from 'ts-jest/utils'` instead.", { helper: name }), helper); return warn.wrap(messages_1.interpolate("The `{{helper}}` helper has been moved to `ts-jest/utils`. Use `import { {{helper}} } from 'ts-jest/utils'` instead.", { helper: name }), helper);
@@ -38,37 +17,8 @@ var helperMoved = function (name, helper) {
exports.mocked = helperMoved('mocked', testing_1.mocked); exports.mocked = helperMoved('mocked', testing_1.mocked);
exports.createJestPreset = helperMoved('createJestPreset', create_jest_preset_1.createJestPreset); exports.createJestPreset = helperMoved('createJestPreset', create_jest_preset_1.createJestPreset);
exports.pathsToModuleNameMapper = helperMoved('pathsToModuleNameMapper', paths_to_module_name_mapper_1.pathsToModuleNameMapper); exports.pathsToModuleNameMapper = helperMoved('pathsToModuleNameMapper', paths_to_module_name_mapper_1.pathsToModuleNameMapper);
exports.version = require('../package.json').version; function createTransformer() {
exports.digest = fs_1.readFileSync(path_1.resolve(__dirname, '..', '.ts-jest-digest'), 'utf8');
var transformer;
function defaultTransformer() {
return transformer || (transformer = createTransformer());
}
function createTransformer(baseConfig) {
version_checkers_1.VersionCheckers.jest.warn(); version_checkers_1.VersionCheckers.jest.warn();
return new ts_jest_transformer_1.TsJestTransformer(baseConfig); return new ts_jest_transformer_1.TsJestTransformer();
} }
exports.createTransformer = createTransformer; exports.createTransformer = createTransformer;
function process() {
var _a;
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return (_a = defaultTransformer()).process.apply(_a, __spread(args));
}
exports.process = process;
function getCacheKey() {
var _a;
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return (_a = defaultTransformer()).getCacheKey.apply(_a, __spread(args));
}
exports.getCacheKey = getCacheKey;
exports.canInstrument = false;
var jestPreset = create_jest_preset_1.createJestPreset();
exports.jestPreset = jestPreset;
exports.__singleton = function () { return transformer; };
exports.__resetModule = function () { return (transformer = undefined); };
+7
View File
@@ -0,0 +1,7 @@
import type { Config } from '@jest/types';
import type { TsJestPresets } from '../types';
interface CreateJestPresetOptions {
allowJs?: boolean;
}
export declare function createJestPreset({ allowJs }?: CreateJestPresetOptions, from?: Config.InitialOptions): TsJestPresets;
export {};
@@ -11,7 +11,8 @@ var __assign = (this && this.__assign) || function () {
return __assign.apply(this, arguments); return __assign.apply(this, arguments);
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var logger_1 = require("../util/logger"); exports.createJestPreset = void 0;
var logger_1 = require("../utils/logger");
var logger = logger_1.rootLogger.child({ namespace: 'jest-preset' }); var logger = logger_1.rootLogger.child({ namespace: 'jest-preset' });
function createJestPreset(_a, from) { function createJestPreset(_a, from) {
var _b; var _b;
+60 -10
View File
@@ -1,4 +1,15 @@
"use strict"; "use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __read = (this && this.__read) || function (o, n) { var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator]; var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o; if (!m) return o;
@@ -20,23 +31,44 @@ var __spread = (this && this.__spread) || function () {
return ar; return ar;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.factory = exports.version = exports.name = void 0;
var bs_logger_1 = require("bs-logger"); var bs_logger_1 = require("bs-logger");
var HOIST_METHODS = ['mock', 'unmock', 'enableAutomock', 'disableAutomock', 'deepUnmock']; var HOIST_METHODS = ['mock', 'unmock', 'enableAutomock', 'disableAutomock', 'deepUnmock'];
var JEST_GLOBALS_MODULE_NAME = '@jest/globals';
var JEST_GLOBAL_NAME = 'jest';
var ROOT_LEVEL_AST = 1;
exports.name = 'hoisting-jest-mock'; exports.name = 'hoisting-jest-mock';
exports.version = 1; exports.version = 4;
function factory(cs) { function factory(cs) {
var logger = cs.logger.child({ namespace: 'ts-hoisting' }); var logger = cs.logger.child({ namespace: 'ts-hoisting' });
var ts = cs.compilerModule; var ts = cs.compilerModule;
function shouldHoistExpression(expression) { var importNames = [];
return (ts.isCallExpression(expression) && function shouldHoistExpression(node) {
ts.isPropertyAccessExpression(expression.expression) && if (ts.isCallExpression(node) &&
HOIST_METHODS.includes(expression.expression.name.text) && ts.isPropertyAccessExpression(node.expression) &&
((ts.isIdentifier(expression.expression.expression) && expression.expression.expression.text === 'jest') || HOIST_METHODS.includes(node.expression.name.text)) {
shouldHoistExpression(expression.expression.expression))); if (importNames.length) {
return ((ts.isIdentifier(node.expression.expression) && importNames.includes(node.expression.expression.text)) ||
(ts.isPropertyAccessExpression(node.expression.expression) &&
ts.isIdentifier(node.expression.expression.expression) &&
importNames.includes(node.expression.expression.expression.text)) ||
shouldHoistExpression(node.expression.expression));
}
else {
return ((ts.isIdentifier(node.expression.expression) && node.expression.expression.text === JEST_GLOBAL_NAME) ||
shouldHoistExpression(node.expression.expression));
}
}
return false;
} }
function shouldHoistNode(node) { function shouldHoistNode(node) {
return ts.isExpressionStatement(node) && shouldHoistExpression(node.expression); return ts.isExpressionStatement(node) && shouldHoistExpression(node.expression);
} }
function isJestGlobalImport(node) {
return (ts.isImportDeclaration(node) &&
ts.isStringLiteral(node.moduleSpecifier) &&
node.moduleSpecifier.text === JEST_GLOBALS_MODULE_NAME);
}
function createVisitor(ctx, _) { function createVisitor(ctx, _) {
var level = 0; var level = 0;
var hoisted = []; var hoisted = [];
@@ -56,14 +88,32 @@ function factory(cs) {
} }
}; };
var visitor = function (node) { var visitor = function (node) {
var _a, _b;
enter(); enter();
var resultNode = ts.visitEachChild(node, visitor, ctx); var resultNode = ts.visitEachChild(node, visitor, ctx);
if (isJestGlobalImport(resultNode) && ((_a = resultNode.importClause) === null || _a === void 0 ? void 0 : _a.namedBindings) &&
(ts.isNamespaceImport(resultNode.importClause.namedBindings) ||
ts.isNamedImports(resultNode.importClause.namedBindings))) {
var namedBindings = resultNode.importClause.namedBindings;
var jestImportName = ts.isNamespaceImport(namedBindings)
? namedBindings.name.text
: (_b = namedBindings.elements.find(function (element) { var _a; return element.name.text === JEST_GLOBAL_NAME || ((_a = element.propertyName) === null || _a === void 0 ? void 0 : _a.text) === JEST_GLOBAL_NAME; })) === null || _b === void 0 ? void 0 : _b.name.text;
if (jestImportName) {
importNames.push(jestImportName);
}
}
if (hoisted[level] && hoisted[level].length) { if (hoisted[level] && hoisted[level].length) {
var hoistedStmts_1 = hoisted[level]; var hoistedStmts_1 = hoisted[level];
var otherStmts = resultNode.statements.filter(function (s) { return !hoistedStmts_1.includes(s); }); var otherStmts = resultNode.statements.filter(function (s) { return !hoistedStmts_1.includes(s) && !isJestGlobalImport(s); });
var newNode = ts.getMutableClone(resultNode); var newNode = ts.getMutableClone(resultNode);
newNode.statements = ts.createNodeArray(__spread(hoistedStmts_1, otherStmts)); var newStatements = __spread(hoistedStmts_1, otherStmts);
resultNode = newNode; if (level === ROOT_LEVEL_AST) {
var jestGlobalsImportStmts = resultNode.statements.filter(function (s) { return isJestGlobalImport(s); });
resultNode = __assign(__assign({}, newNode), { statements: ts.createNodeArray(__spread(jestGlobalsImportStmts, newStatements)) });
}
else {
resultNode = __assign(__assign({}, newNode), { statements: ts.createNodeArray(newStatements) });
}
} }
exit(); exit();
if (shouldHoistNode(resultNode)) { if (shouldHoistNode(resultNode)) {
+21 -1
View File
@@ -1,4 +1,24 @@
"use strict"; "use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var hoisting = require("./hoist-jest"); exports.internals = void 0;
var hoisting = __importStar(require("./hoist-jest"));
exports.internals = [hoisting]; exports.internals = [hoisting];
+3
View File
@@ -0,0 +1,3 @@
import type * as _ts from 'typescript';
import type { ConfigSet } from '../config/config-set';
export declare function factory(cs: ConfigSet): (ctx: _ts.TransformationContext) => _ts.Transformer<_ts.SourceFile>;
+121
View File
@@ -0,0 +1,121 @@
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.factory = exports.version = exports.name = void 0;
var bs_logger_1 = require("bs-logger");
var path_1 = require("path");
exports.name = 'path-mapping';
exports.version = 1;
var isBaseDir = function (base, dir) { var _a; return !((_a = path_1.relative(base, dir)) === null || _a === void 0 ? void 0 : _a.startsWith('.')); };
function factory(cs) {
var _a;
var logger = cs.logger.child({ namespace: 'ts-path-mapping' });
var ts = cs.compilerModule;
var compilerOptions = cs.parsedTsConfig.options;
var rootDirs = (_a = compilerOptions.rootDirs) === null || _a === void 0 ? void 0 : _a.filter(path_1.isAbsolute);
var isDynamicImport = function (node) {
return ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword;
};
var isRequire = function (node) {
return ts.isCallExpression(node) &&
ts.isIdentifier(node.expression) &&
node.expression.text === 'require' &&
ts.isStringLiteral(node.arguments[0]) &&
node.arguments.length === 1;
};
var createVisitor = function (ctx, sf) {
var fileName = sf.fileName;
var fileDir = path_1.normalize(path_1.dirname(fileName));
var rewritePath = function (importPath) {
var e_1, _a;
var p = importPath;
var resolvedModule = ts.resolveModuleName(importPath, fileName, compilerOptions, ts.sys).resolvedModule;
if (resolvedModule) {
var resolvedFileName = resolvedModule.resolvedFileName;
var filePath = fileDir;
var modulePath = path_1.dirname(resolvedFileName);
if (rootDirs) {
var fileRootDir = '';
var moduleRootDir = '';
try {
for (var rootDirs_1 = __values(rootDirs), rootDirs_1_1 = rootDirs_1.next(); !rootDirs_1_1.done; rootDirs_1_1 = rootDirs_1.next()) {
var rootDir = rootDirs_1_1.value;
if (isBaseDir(rootDir, resolvedFileName) && rootDir.length > moduleRootDir.length)
moduleRootDir = rootDir;
if (isBaseDir(rootDir, fileName) && rootDir.length > fileRootDir.length)
fileRootDir = rootDir;
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (rootDirs_1_1 && !rootDirs_1_1.done && (_a = rootDirs_1.return)) _a.call(rootDirs_1);
}
finally { if (e_1) throw e_1.error; }
}
if (fileRootDir && moduleRootDir) {
filePath = path_1.relative(fileRootDir, filePath);
modulePath = path_1.relative(moduleRootDir, modulePath);
}
}
p = path_1.normalize(path_1.join(path_1.relative(filePath, modulePath), path_1.basename(resolvedFileName)));
p = p.startsWith('.') ? p : "./" + p;
}
return p;
};
var visitor = function (node) {
var rewrittenPath;
var newNode = ts.getMutableClone(node);
if (isDynamicImport(node) || isRequire(node)) {
rewrittenPath = rewritePath(node.arguments[0].text);
return __assign(__assign({}, newNode), { arguments: ts.createNodeArray([ts.createStringLiteral(rewrittenPath)]) });
}
if (ts.isExternalModuleReference(node) && ts.isStringLiteral(node.expression)) {
rewrittenPath = rewritePath(node.expression.text);
return ts.updateExternalModuleReference(newNode, ts.createLiteral(rewrittenPath));
}
if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) {
rewrittenPath = rewritePath(node.moduleSpecifier.text);
return __assign(__assign({}, newNode), { moduleSpecifier: ts.createLiteral(rewrittenPath) });
}
if (ts.isExportDeclaration(node) && node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) {
rewrittenPath = rewritePath(node.moduleSpecifier.text);
return __assign(__assign({}, newNode), { moduleSpecifier: ts.createLiteral(rewrittenPath) });
}
if (ts.isImportTypeNode(node) &&
ts.isLiteralTypeNode(node.argument) &&
ts.isStringLiteral(node.argument.literal)) {
rewrittenPath = rewritePath(node.argument.literal.text);
return __assign(__assign({}, newNode), { argument: ts.createLiteralTypeNode(ts.createStringLiteral(rewrittenPath)) });
}
return ts.visitEachChild(node, visitor, ctx);
};
return visitor;
};
return function (ctx) {
var _a;
return logger.wrap((_a = {}, _a[bs_logger_1.LogContexts.logLevel] = bs_logger_1.LogLevels.debug, _a.call = null, _a), 'visitSourceFileNode(): path mapping', function (sf) { return ts.visitNode(sf, createVisitor(ctx, sf)); });
};
}
exports.factory = factory;
+6 -7
View File
@@ -1,12 +1,11 @@
import { CacheKeyOptions, TransformOptions, TransformedSource, Transformer } from '@jest/transform'; import type { CacheKeyOptions, TransformedSource, Transformer, TransformOptions } from '@jest/transform';
import { Config } from '@jest/types'; import type { Config } from '@jest/types';
import type { Logger } from 'bs-logger';
import { ConfigSet } from './config/config-set'; import { ConfigSet } from './config/config-set';
import { TsJestGlobalOptions } from './types';
export declare class TsJestTransformer implements Transformer { export declare class TsJestTransformer implements Transformer {
private readonly logger; protected readonly logger: Logger;
private readonly id; protected _transformCfgStr: string;
private readonly options; constructor();
constructor(baseOptions?: TsJestGlobalOptions);
configsFor(jestConfig: Config.ProjectConfig): ConfigSet; configsFor(jestConfig: Config.ProjectConfig): ConfigSet;
process(input: string, filePath: Config.Path, jestConfig: Config.ProjectConfig, transformOptions?: TransformOptions): TransformedSource | string; process(input: string, filePath: Config.Path, jestConfig: Config.ProjectConfig, transformOptions?: TransformOptions): TransformedSource | string;
getCacheKey(fileContent: string, filePath: string, _jestConfigStr: string, transformOptions: CacheKeyOptions): string; getCacheKey(fileContent: string, filePath: string, _jestConfigStr: string, transformOptions: CacheKeyOptions): string;
+49 -50
View File
@@ -11,53 +11,53 @@ var __assign = (this && this.__assign) || function () {
return __assign.apply(this, arguments); return __assign.apply(this, arguments);
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var util_1 = require("util"); exports.TsJestTransformer = void 0;
var config_set_1 = require("./config/config-set"); var config_set_1 = require("./config/config-set");
var constants_1 = require("./constants"); var constants_1 = require("./constants");
var json_1 = require("./util/json"); var json_1 = require("./utils/json");
var jsonable_value_1 = require("./util/jsonable-value"); var jsonable_value_1 = require("./utils/jsonable-value");
var logger_1 = require("./util/logger"); var logger_1 = require("./utils/logger");
var messages_1 = require("./util/messages"); var messages_1 = require("./utils/messages");
var sha1_1 = require("./util/sha1"); var sha1_1 = require("./utils/sha1");
var INSPECT_CUSTOM = util_1.inspect.custom || 'inspect';
var TsJestTransformer = (function () { var TsJestTransformer = (function () {
function TsJestTransformer(baseOptions) { function TsJestTransformer() {
if (baseOptions === void 0) { baseOptions = {}; } this.logger = logger_1.rootLogger.child({ namespace: 'ts-jest-transformer' });
this.options = __assign({}, baseOptions); this.logger.debug('created new transformer');
this.id = TsJestTransformer._nextTransformerId;
this.logger = logger_1.rootLogger.child({
transformerId: this.id,
namespace: 'jest-transformer',
});
this.logger.debug({ baseOptions: baseOptions }, 'created new transformer');
} }
Object.defineProperty(TsJestTransformer, "_nextTransformerId", {
get: function () {
return ++TsJestTransformer._lastTransformerId;
},
enumerable: true,
configurable: true
});
TsJestTransformer.prototype[INSPECT_CUSTOM] = function () {
return "[object TsJestTransformer<#" + this.id + ">]";
};
TsJestTransformer.prototype.configsFor = function (jestConfig) { TsJestTransformer.prototype.configsFor = function (jestConfig) {
var csi = TsJestTransformer._configSetsIndex.find(function (cs) { return cs.jestConfig.value === jestConfig; }); var ccs = TsJestTransformer._cachedConfigSets.find(function (cs) { return cs.jestConfig.value === jestConfig; });
if (csi) var configSet;
return csi.configSet; if (ccs) {
var serialized = json_1.stringify(jestConfig); this._transformCfgStr = ccs.transformerCfgStr;
csi = TsJestTransformer._configSetsIndex.find(function (cs) { return cs.jestConfig.serialized === serialized; }); configSet = ccs.configSet;
if (csi) { }
csi.jestConfig.value = jestConfig; else {
return csi.configSet; var serializedJestCfg_1 = json_1.stringify(jestConfig);
var serializedCcs = TsJestTransformer._cachedConfigSets.find(function (cs) { return cs.jestConfig.serialized === serializedJestCfg_1; });
if (serializedCcs) {
serializedCcs.jestConfig.value = jestConfig;
this._transformCfgStr = serializedCcs.transformerCfgStr;
configSet = serializedCcs.configSet;
}
else {
this.logger.info('no matching config-set found, creating a new one');
configSet = new config_set_1.ConfigSet(jestConfig);
var jest_1 = __assign({}, jestConfig);
var globals = (jest_1.globals = __assign({}, jest_1.globals));
jest_1.name = undefined;
jest_1.cacheDirectory = undefined;
delete globals['ts-jest'];
this._transformCfgStr = new jsonable_value_1.JsonableValue(__assign(__assign({ digest: configSet.tsJestDigest, babel: configSet.babelConfig }, jest_1), { tsconfig: {
options: configSet.parsedTsConfig.options,
raw: configSet.parsedTsConfig.raw,
} })).serialized;
TsJestTransformer._cachedConfigSets.push({
jestConfig: new jsonable_value_1.JsonableValue(jestConfig),
configSet: configSet,
transformerCfgStr: this._transformCfgStr,
});
}
} }
var jestConfigObj = jestConfig;
this.logger.info('no matching config-set found, creating a new one');
var configSet = new config_set_1.ConfigSet(jestConfigObj, this.options, this.logger);
TsJestTransformer._configSetsIndex.push({
jestConfig: new jsonable_value_1.JsonableValue(jestConfigObj),
configSet: configSet,
});
return configSet; return configSet;
}; };
TsJestTransformer.prototype.process = function (input, filePath, jestConfig, transformOptions) { TsJestTransformer.prototype.process = function (input, filePath, jestConfig, transformOptions) {
@@ -66,13 +66,13 @@ var TsJestTransformer = (function () {
var source = input; var source = input;
var configs = this.configsFor(jestConfig); var configs = this.configsFor(jestConfig);
var hooks = configs.hooks; var hooks = configs.hooks;
var stringify = configs.shouldStringifyContent(filePath); var shouldStringifyContent = configs.shouldStringifyContent(filePath);
var babelJest = stringify ? undefined : configs.babelJestTransformer; var babelJest = shouldStringifyContent ? undefined : configs.babelJestTransformer;
var isDefinitionFile = filePath.endsWith('.d.ts'); var isDefinitionFile = filePath.endsWith(constants_1.DECLARATION_TYPE_EXT);
var isJsFile = constants_1.JS_JSX_REGEX.test(filePath); var isJsFile = constants_1.JS_JSX_REGEX.test(filePath);
var isTsFile = !isDefinitionFile && constants_1.TS_TSX_REGEX.test(filePath); var isTsFile = !isDefinitionFile && constants_1.TS_TSX_REGEX.test(filePath);
if (stringify) { if (shouldStringifyContent) {
result = "module.exports=" + JSON.stringify(source); result = "module.exports=" + json_1.stringify(source);
} }
else if (isDefinitionFile) { else if (isDefinitionFile) {
result = ''; result = '';
@@ -103,13 +103,12 @@ var TsJestTransformer = (function () {
return result; return result;
}; };
TsJestTransformer.prototype.getCacheKey = function (fileContent, filePath, _jestConfigStr, transformOptions) { TsJestTransformer.prototype.getCacheKey = function (fileContent, filePath, _jestConfigStr, transformOptions) {
this.logger.debug({ fileName: filePath, transformOptions: transformOptions }, 'computing cache key for', filePath);
var configs = this.configsFor(transformOptions.config); var configs = this.configsFor(transformOptions.config);
this.logger.debug({ fileName: filePath, transformOptions: transformOptions }, 'computing cache key for', filePath);
var _a = transformOptions.instrument, instrument = _a === void 0 ? false : _a, _b = transformOptions.rootDir, rootDir = _b === void 0 ? configs.rootDir : _b; var _a = transformOptions.instrument, instrument = _a === void 0 ? false : _a, _b = transformOptions.rootDir, rootDir = _b === void 0 ? configs.rootDir : _b;
return sha1_1.sha1(configs.cacheKey, '\x00', rootDir, '\x00', "instrument:" + (instrument ? 'on' : 'off'), '\x00', fileContent, '\x00', filePath); return sha1_1.sha1(this._transformCfgStr, '\x00', rootDir, '\x00', "instrument:" + (instrument ? 'on' : 'off'), '\x00', fileContent, '\x00', filePath);
}; };
TsJestTransformer._configSetsIndex = []; TsJestTransformer._cachedConfigSets = [];
TsJestTransformer._lastTransformerId = 0;
return TsJestTransformer; return TsJestTransformer;
}()); }());
exports.TsJestTransformer = TsJestTransformer; exports.TsJestTransformer = TsJestTransformer;
+105
View File
@@ -0,0 +1,105 @@
export interface RawCompilerOptions {
charset?: string;
composite?: boolean;
declaration?: boolean;
declarationDir?: string | null;
diagnostics?: boolean;
disableReferencedProjectLoad?: boolean;
emitBOM?: boolean;
emitDeclarationOnly?: boolean;
incremental?: boolean;
tsBuildInfoFile?: string;
inlineSourceMap?: boolean;
inlineSources?: boolean;
jsx?: 'preserve' | 'react' | 'react-jsx' | 'react-jsxdev' | 'react-native';
reactNamespace?: string;
jsxFactory?: string;
jsxFragmentFactory?: string;
jsxImportSource?: string;
listFiles?: boolean;
mapRoot?: string;
module?: 'CommonJS' | 'AMD' | 'System' | 'UMD' | 'ES6' | 'ES2015' | 'ES2020' | 'ESNext' | 'None' | string;
moduleResolution?: 'Classic' | 'Node';
newLine?: 'crlf' | 'lf';
noEmit?: boolean;
noEmitHelpers?: boolean;
noEmitOnError?: boolean;
noImplicitAny?: boolean;
noImplicitThis?: boolean;
noUnusedLocals?: boolean;
noUnusedParameters?: boolean;
noLib?: boolean;
noResolve?: boolean;
noStrictGenericChecks?: boolean;
skipDefaultLibCheck?: boolean;
skipLibCheck?: boolean;
outFile?: string;
outDir?: string;
preserveConstEnums?: boolean;
preserveSymlinks?: boolean;
preserveWatchOutput?: boolean;
pretty?: boolean;
removeComments?: boolean;
rootDir?: string;
isolatedModules?: boolean;
sourceMap?: boolean;
sourceRoot?: string;
suppressExcessPropertyErrors?: boolean;
suppressImplicitAnyIndexErrors?: boolean;
target?: 'ES3' | 'ES5' | 'ES6' | 'ES2015' | 'ES2016' | 'ES2017' | 'ES2018' | 'ES2019' | 'ES2020' | 'ESNext' | string;
watch?: boolean;
fallbackPolling?: 'fixedPollingInterval' | 'priorityPollingInterval' | 'dynamicPriorityPolling';
watchDirectory?: 'useFsEvents' | 'fixedPollingInterval' | 'dynamicPriorityPolling';
watchFile?: 'fixedPollingInterval' | 'priorityPollingInterval' | 'dynamicPriorityPolling' | 'useFsEvents' | 'useFsEventsOnParentDirectory';
experimentalDecorators?: boolean;
emitDecoratorMetadata?: boolean;
allowUnusedLabels?: boolean;
noImplicitReturns?: boolean;
noUncheckedIndexedAccess?: boolean;
noFallthroughCasesInSwitch?: boolean;
allowUnreachableCode?: boolean;
forceConsistentCasingInFileNames?: boolean;
generateCpuProfile?: string;
baseUrl?: string;
paths?: {
[k: string]: string[];
};
plugins?: {
name?: string;
[k: string]: unknown;
}[];
rootDirs?: string[];
typeRoots?: string[];
types?: string[];
traceResolution?: boolean;
allowJs?: boolean;
noErrorTruncation?: boolean;
allowSyntheticDefaultImports?: boolean;
noImplicitUseStrict?: boolean;
listEmittedFiles?: boolean;
disableSizeLimit?: boolean;
lib?: ('ES5' | 'ES6' | 'ES2015' | 'ES2015.Collection' | 'ES2015.Core' | 'ES2015.Generator' | 'ES2015.Iterable' | 'ES2015.Promise' | 'ES2015.Proxy' | 'ES2015.Reflect' | 'ES2015.Symbol.WellKnown' | 'ES2015.Symbol' | 'ES2016' | 'ES2016.Array.Include' | 'ES2017' | 'ES2017.Intl' | 'ES2017.Object' | 'ES2017.SharedMemory' | 'ES2017.String' | 'ES2017.TypedArrays' | 'ES2018' | 'ES2018.AsyncGenerator' | 'ES2018.AsyncIterable' | 'ES2018.Intl' | 'ES2018.Promise' | 'ES2018.Regexp' | 'ES2019' | 'ES2019.Array' | 'ES2019.Object' | 'ES2019.String' | 'ES2019.Symbol' | 'ES2020' | 'ES2020.BigInt' | 'ES2020.Promise' | 'ES2020.String' | 'ES2020.Symbol.WellKnown' | 'ESNext' | 'ESNext.Array' | 'ESNext.AsyncIterable' | 'ESNext.BigInt' | 'ESNext.Intl' | 'ESNext.Promise' | 'ESNext.String' | 'ESNext.Symbol' | 'DOM' | 'DOM.Iterable' | 'ScriptHost' | 'WebWorker' | 'WebWorker.ImportScripts')[];
strictNullChecks?: boolean;
maxNodeModuleJsDepth?: number;
importHelpers?: boolean;
importsNotUsedAsValues?: 'remove' | 'preserve' | 'error';
alwaysStrict?: boolean;
strict?: boolean;
strictBindCallApply?: boolean;
downlevelIteration?: boolean;
checkJs?: boolean;
strictFunctionTypes?: boolean;
strictPropertyInitialization?: boolean;
esModuleInterop?: boolean;
allowUmdGlobalAccess?: boolean;
keyofStringsOnly?: boolean;
useDefineForClassFields?: boolean;
declarationMap?: boolean;
resolveJsonModule?: boolean;
assumeChangesOnlyAffectDirectDependencies?: boolean;
extendedDiagnostics?: boolean;
listFilesOnly?: boolean;
disableSourceOfProjectReferenceRedirect?: boolean;
disableSolutionSearching?: boolean;
[k: string]: unknown;
}
+2
View File
@@ -0,0 +1,2 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
+27 -53
View File
@@ -1,76 +1,50 @@
import * as _ts from 'typescript'; import type { Config } from '@jest/types';
import type * as _babel from 'babel__core';
import type * as _ts from 'typescript';
import type { RawCompilerOptions } from './tsconfig-raw';
export declare type TTypeScript = typeof _ts;
export declare type BabelConfig = _babel.TransformOptions;
export interface AstTransformer<T = Record<string, unknown>> {
path: string;
options?: T;
}
export interface ConfigCustomTransformer {
before?: (string | AstTransformer)[];
after?: (string | AstTransformer)[];
afterDeclarations?: (string | AstTransformer)[];
}
export interface TsJestGlobalOptions { export interface TsJestGlobalOptions {
tsConfig?: boolean | string | _ts.CompilerOptions; tsConfig?: boolean | string | RawCompilerOptions;
tsconfig?: boolean | string | _ts.CompilerOptions; tsconfig?: boolean | string | RawCompilerOptions;
packageJson?: boolean | string | object; packageJson?: boolean | string | Record<string, unknown>;
isolatedModules?: boolean; isolatedModules?: boolean;
compiler?: string; compiler?: string;
astTransformers?: string[]; astTransformers?: string[] | ConfigCustomTransformer;
diagnostics?: boolean | { diagnostics?: boolean | {
pretty?: boolean; pretty?: boolean;
ignoreCodes?: number | string | (number | string)[]; ignoreCodes?: number | string | (number | string)[];
pathRegex?: RegExp | string; pathRegex?: RegExp | string;
exclude?: Config.Glob[];
warnOnly?: boolean; warnOnly?: boolean;
}; };
babelConfig?: boolean | string | BabelConfig; babelConfig?: boolean | string | BabelConfig;
stringifyContentPathRegex?: string | RegExp; stringifyContentPathRegex?: string | RegExp;
} }
interface TsJestConfig$tsConfig$file { export interface GlobalConfigTsJest extends Config.ConfigGlobals {
kind: 'file'; 'ts-jest': TsJestGlobalOptions;
value: string | undefined;
} }
interface TsJestConfig$tsConfig$inline { export interface InitialOptionsTsJest extends Config.InitialOptions {
kind: 'inline'; globals?: GlobalConfigTsJest;
value: _ts.CompilerOptions;
} }
declare type TsJestConfig$tsConfig = TsJestConfig$tsConfig$file | TsJestConfig$tsConfig$inline | undefined; export declare type TsJestPresets = Pick<Config.InitialOptions, 'moduleFileExtensions' | 'transform' | 'testMatch'>;
interface TsJestConfig$diagnostics { export interface TsJestDiagnosticsCfg {
pretty: boolean; pretty: boolean;
ignoreCodes: number[]; ignoreCodes: number[];
pathRegex?: string | undefined; pathRegex?: string | undefined;
exclude: Config.Glob[];
throws: boolean; throws: boolean;
warnOnly?: boolean; warnOnly?: boolean;
} }
interface TsJestConfig$babelConfig$file {
kind: 'file';
value: string | undefined;
}
interface TsJestConfig$babelConfig$inline {
kind: 'inline';
value: BabelConfig;
}
declare type TsJestConfig$babelConfig = TsJestConfig$babelConfig$file | TsJestConfig$babelConfig$inline | undefined;
interface TsJestConfig$packageJson$file {
kind: 'file';
value: string | undefined;
}
interface TsJestConfig$packageJson$inline {
kind: 'inline';
value: any;
}
declare type TsJestConfig$packageJson = TsJestConfig$packageJson$file | TsJestConfig$packageJson$inline | undefined;
declare type TsJestConfig$stringifyContentPathRegex = string | undefined;
export interface TsJestConfig {
tsConfig: TsJestConfig$tsConfig;
packageJson: TsJestConfig$packageJson;
isolatedModules: boolean;
compiler: string;
diagnostics: TsJestConfig$diagnostics;
babelConfig: TsJestConfig$babelConfig;
transformers: string[];
stringifyContentPathRegex: TsJestConfig$stringifyContentPathRegex;
}
export interface TsCompiler { export interface TsCompiler {
program: _ts.Program | undefined; program: _ts.Program | undefined;
} }
export declare type TSFiles = Map<string, TSFile>;
export interface TSFile {
text?: string;
output?: string;
version: number;
projectReference?: {
project?: _ts.ResolvedProjectReference;
outputFileName?: string;
};
}
export {};
-3
View File
@@ -1,3 +0,0 @@
export { mocked } from './testing';
export { createJestPreset } from '../config/create-jest-preset';
export { pathsToModuleNameMapper } from '../config/paths-to-module-name-mapper';
-8
View File
@@ -1,8 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var testing_1 = require("./testing");
exports.mocked = testing_1.mocked;
var create_jest_preset_1 = require("../config/create-jest-preset");
exports.createJestPreset = create_jest_preset_1.createJestPreset;
var paths_to_module_name_mapper_1 = require("../config/paths-to-module-name-mapper");
exports.pathsToModuleNameMapper = paths_to_module_name_mapper_1.pathsToModuleNameMapper;
-1
View File
@@ -1 +0,0 @@
export {};
-1
View File
@@ -1 +0,0 @@
export {};
-1
View File
@@ -1 +0,0 @@
export {};
-56
View File
@@ -1,56 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var semver_1 = require("semver");
var get_package_version_1 = require("./get-package-version");
var logger_1 = require("./logger");
var messages_1 = require("./messages");
var logger = logger_1.rootLogger.child({ namespace: 'versions' });
exports.VersionCheckers = {
jest: createVersionChecker('jest', ">=25 <26"),
typescript: createVersionChecker('typescript', ">=3.4 <4"),
babelJest: createVersionChecker('babel-jest', ">=25 <26"),
babelCore: createVersionChecker('@babel/core', ">=7.0.0-beta.0 <8"),
};
function checkVersion(name, expectedRange, action) {
if (action === void 0) { action = 'warn'; }
var version = get_package_version_1.getPackageVersion(name);
var success = !!version && semver_1.satisfies(version, expectedRange);
logger.debug({
actualVersion: version,
expectedVersion: expectedRange,
}, 'checking version of %s: %s', name, success ? 'OK' : 'NOT OK');
if (!action || success)
return success;
var message = messages_1.interpolate(version ? "Version {{actualVersion}} of {{module}} installed has not been tested with ts-jest. If you're experiencing issues, consider using a supported version ({{expectedVersion}}). Please do not report issues in ts-jest if you are using unsupported versions." : "Module {{module}} is not installed. If you're experiencing issues, consider installing a supported version ({{expectedVersion}}).", {
module: name,
actualVersion: version || '??',
expectedVersion: rangeToHumanString(expectedRange),
});
if (action === 'warn') {
logger.warn(message);
}
else if (action === 'throw') {
logger.fatal(message);
throw new RangeError(message);
}
return success;
}
function rangeToHumanString(versionRange) {
return new semver_1.Range(versionRange).toString();
}
function createVersionChecker(moduleName, expectedVersion) {
var memo;
var warn = function () {
if (memo !== undefined)
return memo;
return (memo = checkVersion(moduleName, expectedVersion, 'warn'));
};
var raise = function () { return checkVersion(moduleName, expectedVersion, 'throw'); };
return {
raise: raise,
warn: warn,
forget: function () {
memo = undefined;
},
};
}
@@ -12,13 +12,16 @@ var __assign = (this && this.__assign) || function () {
}; };
var _a; var _a;
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.backportTsJestDebugEnvVar = exports.backportJestConfig = void 0;
var bs_logger_1 = require("bs-logger"); var bs_logger_1 = require("bs-logger");
var messages_1 = require("./messages"); var messages_1 = require("./messages");
var constants_1 = require("../constants");
var context = (_a = {}, _a[bs_logger_1.LogContexts.namespace] = 'backports', _a); var context = (_a = {}, _a[bs_logger_1.LogContexts.namespace] = 'backports', _a);
exports.backportJestConfig = function (logger, config) { exports.backportJestConfig = function (logger, config) {
var _a, _b;
logger.debug(__assign(__assign({}, context), { config: config }), 'backporting config'); logger.debug(__assign(__assign({}, context), { config: config }), 'backporting config');
var _a = (config || {}).globals, globals = _a === void 0 ? {} : _a; var _c = (config || {}).globals, globals = _c === void 0 ? {} : _c;
var _b = globals["ts-jest"], tsJest = _b === void 0 ? {} : _b; var _d = globals["ts-jest"], tsJest = _d === void 0 ? {} : _d;
var mergeTsJest = {}; var mergeTsJest = {};
var hadWarnings = false; var hadWarnings = false;
var warnConfig = function (oldPath, newPath, note) { var warnConfig = function (oldPath, newPath, note) {
@@ -84,7 +87,7 @@ exports.backportJestConfig = function (logger, config) {
if (hadWarnings) { if (hadWarnings) {
logger.warn(context, "Your Jest configuration is outdated. Use the CLI to help migrating it: ts-jest config:migrate <config-file>."); logger.warn(context, "Your Jest configuration is outdated. Use the CLI to help migrating it: ts-jest config:migrate <config-file>.");
} }
return __assign(__assign({}, config), { globals: __assign(__assign({}, globals), { 'ts-jest': __assign(__assign({}, mergeTsJest), tsJest) }) }); return __assign(__assign({}, config), { testMatch: (_a = config.testMatch) !== null && _a !== void 0 ? _a : constants_1.DEFAULT_JEST_TEST_MATCH, testRegex: (_b = config.testRegex) !== null && _b !== void 0 ? _b : [], globals: __assign(__assign({}, globals), { 'ts-jest': __assign(__assign({}, mergeTsJest), tsJest) }) });
}; };
exports.backportTsJestDebugEnvVar = function (logger) { exports.backportTsJestDebugEnvVar = function (logger) {
if ('TS_JEST_DEBUG' in process.env) { if ('TS_JEST_DEBUG' in process.env) {
@@ -1,5 +1,6 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.getPackageVersion = void 0;
function getPackageVersion(moduleName) { function getPackageVersion(moduleName) {
try { try {
return require(moduleName + "/package.json").version; return require(moduleName + "/package.json").version;
@@ -37,6 +37,7 @@ var __spread = (this && this.__spread) || function () {
return ar; return ar;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.__requireModule = exports.importer = exports.Importer = void 0;
var logger_1 = require("./logger"); var logger_1 = require("./logger");
var memoize_1 = require("./memoize"); var memoize_1 = require("./memoize");
var messages_1 = require("./messages"); var messages_1 = require("./messages");
@@ -61,7 +62,7 @@ var Importer = (function () {
jest: [passThru(version_checkers_1.VersionCheckers.jest.warn)], jest: [passThru(version_checkers_1.VersionCheckers.jest.warn)],
}); });
}, },
enumerable: true, enumerable: false,
configurable: true configurable: true
}); });
Importer.prototype.babelJest = function (why) { Importer.prototype.babelJest = function (why) {
+2
View File
@@ -0,0 +1,2 @@
export declare function stringify(input: unknown): string;
export declare function parse(input: string): any;
@@ -1,5 +1,6 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.normalize = exports.parse = exports.stringify = void 0;
var stableStringify = require("fast-json-stable-stringify"); var stableStringify = require("fast-json-stable-stringify");
var UNDEFINED = 'undefined'; var UNDEFINED = 'undefined';
function stringify(input) { function stringify(input) {
+10
View File
@@ -0,0 +1,10 @@
export declare class JsonableValue<V = Record<string, any>> {
private _serialized;
private _value;
constructor(value: V);
set value(value: V);
get value(): V;
get serialized(): string;
valueOf(): V;
toString(): string;
}
@@ -1,5 +1,6 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.JsonableValue = void 0;
var json_1 = require("./json"); var json_1 = require("./json");
var JsonableValue = (function () { var JsonableValue = (function () {
function JsonableValue(value) { function JsonableValue(value) {
@@ -13,14 +14,14 @@ var JsonableValue = (function () {
this._value = value; this._value = value;
this._serialized = json_1.stringify(value); this._serialized = json_1.stringify(value);
}, },
enumerable: true, enumerable: false,
configurable: true configurable: true
}); });
Object.defineProperty(JsonableValue.prototype, "serialized", { Object.defineProperty(JsonableValue.prototype, "serialized", {
get: function () { get: function () {
return this._serialized; return this._serialized;
}, },
enumerable: true, enumerable: false,
configurable: true configurable: true
}); });
JsonableValue.prototype.valueOf = function () { JsonableValue.prototype.valueOf = function () {
+1
View File
@@ -0,0 +1 @@
export declare let rootLogger: import("bs-logger/dist/logger").Logger;
@@ -1,5 +1,6 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.rootLogger = void 0;
var bs_logger_1 = require("bs-logger"); var bs_logger_1 = require("bs-logger");
var backports_1 = require("./backports"); var backports_1 = require("./backports");
var original = process.env.TS_JEST_LOG; var original = process.env.TS_JEST_LOG;
@@ -1,5 +1,6 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.Memoize = void 0;
var cacheProp = Symbol.for('[memoize]'); var cacheProp = Symbol.for('[memoize]');
function Memoize(keyBuilder) { function Memoize(keyBuilder) {
return function (_, propertyKey, descriptor) { return function (_, propertyKey, descriptor) {
@@ -1,5 +1,6 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.interpolate = void 0;
function interpolate(msg, vars) { function interpolate(msg, vars) {
if (vars === void 0) { vars = {}; } if (vars === void 0) { vars = {}; }
return msg.replace(/\{\{([^\}]+)\}\}/g, function (_, key) { return (key in vars ? vars[key] : _); }); return msg.replace(/\{\{([^\}]+)\}\}/g, function (_, key) { return (key in vars ? vars[key] : _); });
@@ -1,5 +1,6 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.normalizeSlashes = void 0;
function normalizeSlashes(value) { function normalizeSlashes(value) {
return value.replace(/\\/g, '/'); return value.replace(/\\/g, '/');
} }
@@ -1,5 +1,6 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.sha1 = exports.cache = void 0;
var crypto_1 = require("crypto"); var crypto_1 = require("crypto");
exports.cache = Object.create(null); exports.cache = Object.create(null);
function sha1() { function sha1() {
@@ -1,28 +1,28 @@
/// <reference types="jest" /> /// <reference types="jest" />
declare type MockableFunction = (...args: any[]) => any; export declare type MockableFunction = (...args: any[]) => any;
declare type MethodKeysOf<T> = { export declare type MethodKeysOf<T> = {
[K in keyof T]: T[K] extends MockableFunction ? K : never; [K in keyof T]: T[K] extends MockableFunction ? K : never;
}[keyof T]; }[keyof T];
declare type PropertyKeysOf<T> = { export declare type PropertyKeysOf<T> = {
[K in keyof T]: T[K] extends MockableFunction ? never : K; [K in keyof T]: T[K] extends MockableFunction ? never : K;
}[keyof T]; }[keyof T];
declare type ArgumentsOf<T> = T extends (...args: infer A) => any ? A : never; export declare type ArgumentsOf<T> = T extends (...args: infer A) => any ? A : never;
declare type ConstructorArgumentsOf<T> = T extends new (...args: infer A) => any ? A : never; export declare type ConstructorArgumentsOf<T> = T extends new (...args: infer A) => any ? A : never;
interface MockWithArgs<T extends MockableFunction> extends jest.MockInstance<ReturnType<T>, ArgumentsOf<T>> { export interface MockWithArgs<T extends MockableFunction> extends jest.MockInstance<ReturnType<T>, ArgumentsOf<T>> {
new (...args: ConstructorArgumentsOf<T>): T; new (...args: ConstructorArgumentsOf<T>): T;
(...args: ArgumentsOf<T>): ReturnType<T>; (...args: ArgumentsOf<T>): ReturnType<T>;
} }
declare type MaybeMockedConstructor<T> = T extends new (...args: any[]) => infer R ? jest.MockInstance<R, ConstructorArgumentsOf<T>> : {}; export declare type MaybeMockedConstructor<T> = T extends new (...args: any[]) => infer R ? jest.MockInstance<R, ConstructorArgumentsOf<T>> : T;
declare type MockedFunction<T extends MockableFunction> = MockWithArgs<T> & { export declare type MockedFunction<T extends MockableFunction> = MockWithArgs<T> & {
[K in keyof T]: T[K]; [K in keyof T]: T[K];
}; };
declare type MockedFunctionDeep<T extends MockableFunction> = MockWithArgs<T> & MockedObjectDeep<T>; export declare type MockedFunctionDeep<T extends MockableFunction> = MockWithArgs<T> & MockedObjectDeep<T>;
declare type MockedObject<T> = MaybeMockedConstructor<T> & { export declare type MockedObject<T> = MaybeMockedConstructor<T> & {
[K in MethodKeysOf<T>]: T[K] extends MockableFunction ? MockedFunction<T[K]> : T[K]; [K in MethodKeysOf<T>]: T[K] extends MockableFunction ? MockedFunction<T[K]> : T[K];
} & { } & {
[K in PropertyKeysOf<T>]: T[K]; [K in PropertyKeysOf<T>]: T[K];
}; };
declare type MockedObjectDeep<T> = MaybeMockedConstructor<T> & { export declare type MockedObjectDeep<T> = MaybeMockedConstructor<T> & {
[K in MethodKeysOf<T>]: T[K] extends MockableFunction ? MockedFunctionDeep<T[K]> : T[K]; [K in MethodKeysOf<T>]: T[K] extends MockableFunction ? MockedFunctionDeep<T[K]> : T[K];
} & { } & {
[K in PropertyKeysOf<T>]: MaybeMockedDeep<T[K]>; [K in PropertyKeysOf<T>]: MaybeMockedDeep<T[K]>;
@@ -31,4 +31,3 @@ export declare type MaybeMockedDeep<T> = T extends MockableFunction ? MockedFunc
export declare type MaybeMocked<T> = T extends MockableFunction ? MockedFunction<T> : T extends object ? MockedObject<T> : T; export declare type MaybeMocked<T> = T extends MockableFunction ? MockedFunction<T> : T extends object ? MockedObject<T> : T;
export declare function mocked<T>(item: T, deep?: false): MaybeMocked<T>; export declare function mocked<T>(item: T, deep?: false): MaybeMocked<T>;
export declare function mocked<T>(item: T, deep: true): MaybeMockedDeep<T>; export declare function mocked<T>(item: T, deep: true): MaybeMockedDeep<T>;
export {};
@@ -1,5 +1,6 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.mocked = void 0;
function mocked(item, _deep) { function mocked(item, _deep) {
if (_deep === void 0) { _deep = false; } if (_deep === void 0) { _deep = false; }
return item; return item;
@@ -3,7 +3,7 @@ var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) { var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf || extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b); return extendStatics(d, b);
}; };
return function (d, b) { return function (d, b) {
@@ -13,6 +13,7 @@ var __extends = (this && this.__extends) || (function () {
}; };
})(); })();
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.TSError = exports.INSPECT_CUSTOM = void 0;
var make_error_1 = require("make-error"); var make_error_1 = require("make-error");
var util_1 = require("util"); var util_1 = require("util");
var logger_1 = require("./logger"); var logger_1 = require("./logger");
+60
View File
@@ -0,0 +1,60 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.VersionCheckers = void 0;
var semver_1 = require("semver");
var get_package_version_1 = require("./get-package-version");
var logger_1 = require("./logger");
var messages_1 = require("./messages");
var logger = logger_1.rootLogger.child({ namespace: 'versions' });
exports.VersionCheckers = {
jest: createVersionChecker('jest', ">=26 <27"),
typescript: createVersionChecker('typescript', ">=3.8 <5"),
babelJest: createVersionChecker('babel-jest', ">=26 <27"),
babelCore: createVersionChecker('@babel/core', ">=7.0.0-beta.0 <8"),
};
function checkVersion(name, expectedRange, action) {
if (action === void 0) { action = 'warn'; }
var success = true;
if (!('TS_JEST_DISABLE_VER_CHECKER' in process.env)) {
var version = get_package_version_1.getPackageVersion(name);
success = !!version && semver_1.satisfies(version, expectedRange);
logger.debug({
actualVersion: version,
expectedVersion: expectedRange,
}, 'checking version of %s: %s', name, success ? 'OK' : 'NOT OK');
if (!action || success)
return success;
var message = messages_1.interpolate(version ? "Version {{actualVersion}} of {{module}} installed has not been tested with ts-jest. If you're experiencing issues, consider using a supported version ({{expectedVersion}}). Please do not report issues in ts-jest if you are using unsupported versions." : "Module {{module}} is not installed. If you're experiencing issues, consider installing a supported version ({{expectedVersion}}).", {
module: name,
actualVersion: version || '??',
expectedVersion: rangeToHumanString(expectedRange),
});
if (action === 'warn') {
logger.warn(message);
}
else if (action === 'throw') {
logger.fatal(message);
throw new RangeError(message);
}
}
return success;
}
function rangeToHumanString(versionRange) {
return new semver_1.Range(versionRange).toString();
}
function createVersionChecker(moduleName, expectedVersion) {
var memo;
var warn = function () {
if (memo !== undefined)
return memo;
return (memo = checkVersion(moduleName, expectedVersion, 'warn'));
};
var raise = function () { return checkVersion(moduleName, expectedVersion, 'throw'); };
return {
raise: raise,
warn: warn,
forget: function () {
memo = undefined;
},
};
}
+1 -1
View File
@@ -1 +1 @@
module.exports = require('./presets/default/jest-preset') module.exports = require('./presets').defaults

Some files were not shown because too many files have changed in this diff Show More