1 | #!/usr/bin/env node
|
2 | 'use strict';
|
3 |
|
4 | const fs = require('fs');
|
5 | const path = require('path');
|
6 | const semver = require('semver');
|
7 |
|
8 |
|
9 | const verbose = (...args) => process.env.VERBOSE ? console.log(...args) : undefined;
|
10 | const { applyPatch } = require('patch-package/dist/applyPatches');
|
11 | function 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 | }
|
19 | async 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 |
|
30 | console.info(`[TypedDocumentNode] Patch for ${patch.details.name}@${packageResolution} has been ${reverse ? 'reversed' : 'applied'}!`);
|
31 | }
|
32 | else {
|
33 |
|
34 | console.warn(`[TypedDocumentNode] Something went wrong, unable to patch ${patch.details.name} (Patch: ${patch.details.version}, Installed: ${packageResolution})`);
|
35 | }
|
36 | }
|
37 | else {
|
38 |
|
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 | }
|
51 | function 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 | }
|
61 | async 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 |
|
75 | version: versionRange,
|
76 | name,
|
77 | pathSpecifier: name,
|
78 | humanReadablePathSpecifier: name,
|
79 | packageNames: [name],
|
80 | },
|
81 | };
|
82 | })
|
83 | };
|
84 | }
|
85 |
|
86 | applyPatches(process.cwd(), false);
|