UNPKG

3.54 kBJavaScriptView Raw
1#!/usr/bin/env node
2'use strict';
3
4const fs = require('fs');
5const path = require('path');
6const semver = require('semver');
7
8// eslint-disable-next-line
9const verbose = (...args) => process.env.VERBOSE ? console.log(...args) : undefined;
10const { applyPatch } = require('patch-package/dist/applyPatches');
11function applyPatchFile(baseDir, patch, reverse = false) {
12 return applyPatch({
13 patchFilePath: path.resolve(baseDir, patch.fileName),
14 patchDir: baseDir,
15 packageDetails: patch.details,
16 reverse,
17 });
18}
19async function applyPatches(rootDirectory, reverse = false) {
20 const { availablePatches, baseDir } = await getAvailablePatches();
21 for (const patch of availablePatches) {
22 if (patch.details) {
23 const packageResolution = resolvePackage(rootDirectory, patch);
24 if (packageResolution) {
25 const isValidVersion = semver.satisfies(packageResolution, patch.details.version);
26 if (isValidVersion) {
27 const result = applyPatchFile(baseDir, patch, reverse);
28 if (result) {
29 // eslint-disable-next-line
30 console.info(`[TypedDocumentNode] Patch for ${patch.details.name}@${packageResolution} has been ${reverse ? 'reversed' : 'applied'}!`);
31 }
32 else {
33 // eslint-disable-next-line
34 console.warn(`[TypedDocumentNode] Something went wrong, unable to patch ${patch.details.name} (Patch: ${patch.details.version}, Installed: ${packageResolution})`);
35 }
36 }
37 else {
38 // eslint-disable-next-line
39 verbose(`[TypedDocumentNode] Patch for ${patch.details.name} exists, but you have a version mismatch! (Supported: ${patch.details.version}, you have: ${packageResolution})`);
40 }
41 }
42 else {
43 verbose(`[TypedDocumentNode] Skipping ${patch.fileName} patch, didn't find any package resolution!`);
44 }
45 }
46 else {
47 verbose(`[TypedDocumentNode] Unable to extract package details for patch file ${patch.fileName}!`);
48 }
49 }
50}
51function resolvePackage(rootDirectory, patch) {
52 try {
53 const packagePath = require.resolve(`${patch.details.name}/package.json`, { paths: [rootDirectory] });
54 const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
55 return packageJson.version || null;
56 }
57 catch (e) {
58 return null;
59 }
60}
61async function getAvailablePatches() {
62 const baseDir = path.join(__dirname, './patches/');
63 const files = fs.readdirSync(baseDir).filter(d => path.extname(d) === '.patch');
64 return {
65 baseDir,
66 availablePatches: files.map(fileName => {
67 const cleanName = path.basename(fileName, path.extname(fileName));
68 const parts = cleanName.split('+');
69 const versionRange = parts.pop();
70 const name = parts.join('/');
71 return {
72 fileName,
73 details: {
74 // This structure and fields are required internally in `patch-package` code.
75 version: versionRange,
76 name,
77 pathSpecifier: name,
78 humanReadablePathSpecifier: name,
79 packageNames: [name],
80 },
81 };
82 })
83 };
84}
85
86applyPatches(process.cwd(), false);