/
compat.ts
103 lines (95 loc) · 3.65 KB
/
compat.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import { logger } from '../utils/logger';
import {
resolveOldFormatWithInlineProjects,
workspaceConfigName,
Workspaces,
} from '../shared/workspace';
import { workspaceRoot } from '../utils/app-root';
/* eslint-disable */
const Module = require('module');
const originalRequire = Module.prototype.require;
let patched = false;
let loggedWriteWorkspaceWarning = false;
if (!patched) {
Module.prototype.require = function () {
const result = originalRequire.apply(this, arguments);
if (arguments[0].startsWith('@angular-devkit/core')) {
// Register `workspace.json` as a nonstandard workspace config file
const core = originalRequire.apply(this, [
`@angular-devkit/core/src/workspace/core`,
]);
core._test_addWorkspaceFile('workspace.json', core.WorkspaceFormat.JSON);
const originalReadWorkspace = core.readWorkspace;
core.readWorkspace = (path, ...rest) => {
const configFile = workspaceConfigName(workspaceRoot);
if (!configFile) {
path = 'workspace.json';
}
return originalReadWorkspace.apply(this, [path, ...rest]);
};
const originalWriteWorkspace = core.writeWorkspace;
core.writeWorkspace = (...args) => {
const configFile = workspaceConfigName(workspaceRoot);
if (!loggedWriteWorkspaceWarning) {
if (configFile) {
logger.warn(
`[NX] Angular devkit called \`writeWorkspace\`, this may have had unintended consequences in ${configFile}`
);
logger.warn(`[NX] Double check ${configFile} before proceeding`);
} else {
logger.warn(
`[NX] Angular devkit called \`writeWorkspace\`, this may have created 'workspace.json' or 'angular.json`
);
logger.warn(
`[NX] Double check workspace configuration before proceeding`
);
}
loggedWriteWorkspaceWarning = true;
}
return originalWriteWorkspace.apply(this, args);
};
// Patch readJsonWorkspace to inline project configurations
// as well as work in workspaces without a central workspace file.
const readJsonUtils = originalRequire.apply(this, [
`@angular-devkit/core/src/workspace/json/reader`,
]);
const originalReadJsonWorkspace = readJsonUtils.readJsonWorkspace;
readJsonUtils.readJsonWorkspace = async (
path,
host: { readFile: (p) => Promise<string> }
) => {
try {
return await originalReadJsonWorkspace(path, host);
} catch {
logger.debug(
'[NX] Angular devkit readJsonWorkspace fell back to Nx workspaces logic'
);
const w = new Workspaces(workspaceRoot);
// Read our v1 workspace schema
const workspaceConfiguration = resolveOldFormatWithInlineProjects(
w.readWorkspaceConfiguration()
);
// readJsonWorkspace actually has AST parsing + more, so we
// still need to call it rather than just return our file
return originalReadJsonWorkspace.apply(this, [
'workspace.json', // path name, doesn't matter
{
// second arg is a host, only method used is readFile
readFile: () => JSON.stringify(workspaceConfiguration),
},
]);
}
};
}
return result;
};
try {
require('@angular-devkit/build-angular/src/utils/version').Version.assertCompatibleAngularVersion =
() => {};
} catch (e) {}
try {
require('@angular-devkit/build-angular/src/utils/version').assertCompatibleAngularVersion =
() => {};
} catch (e) {}
patched = true;
}