UNPKG

6.34 kBJavaScriptView Raw
1"use strict";
2var __read = (this && this.__read) || function (o, n) {
3 var m = typeof Symbol === "function" && o[Symbol.iterator];
4 if (!m) return o;
5 var i = m.call(o), r, ar = [], e;
6 try {
7 while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
8 }
9 catch (error) { e = { error: error }; }
10 finally {
11 try {
12 if (r && !r.done && (m = i["return"])) m.call(i);
13 }
14 finally { if (e) throw e.error; }
15 }
16 return ar;
17};
18var __spreadArray = (this && this.__spreadArray) || function (to, from) {
19 for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
20 to[j] = from[i];
21 return to;
22};
23exports.__esModule = true;
24var ts = require("typescript");
25var schematics_1 = require("@angular-devkit/schematics");
26var schematics_core_1 = require("../../schematics-core");
27function replaceWithRuntimeChecks() {
28 return function (tree) {
29 // only add runtime checks when ngrx-store-freeze is used
30 schematics_core_1.visitTSSourceFiles(tree, removeUsages) &&
31 schematics_core_1.visitTSSourceFiles(tree, insertRuntimeChecks);
32 };
33}
34function removeNgRxStoreFreezePackage() {
35 return function (tree) {
36 var pkgPath = '/package.json';
37 var buffer = tree.read(pkgPath);
38 if (buffer === null) {
39 throw new schematics_1.SchematicsException('Could not read package.json');
40 }
41 var content = buffer.toString();
42 var pkg = JSON.parse(content);
43 if (pkg === null || typeof pkg !== 'object' || Array.isArray(pkg)) {
44 throw new schematics_1.SchematicsException('Error reading package.json');
45 }
46 var dependencyCategories = ['dependencies', 'devDependencies'];
47 dependencyCategories.forEach(function (category) {
48 if (pkg[category] && pkg[category]['ngrx-store-freeze']) {
49 delete pkg[category]['ngrx-store-freeze'];
50 }
51 });
52 tree.overwrite(pkgPath, JSON.stringify(pkg, null, 2));
53 return tree;
54 };
55}
56function default_1() {
57 return schematics_1.chain([removeNgRxStoreFreezePackage(), replaceWithRuntimeChecks()]);
58}
59exports["default"] = default_1;
60function removeUsages(sourceFile, tree, ngrxStoreFreezeIsUsed) {
61 if (sourceFile.fileName.endsWith('.spec.ts') ||
62 sourceFile.fileName.endsWith('.test.ts')) {
63 return ngrxStoreFreezeIsUsed;
64 }
65 var importRemovements = findStoreFreezeImportsToRemove(sourceFile);
66 if (importRemovements.length === 0) {
67 return ngrxStoreFreezeIsUsed;
68 }
69 var usageReplacements = findStoreFreezeUsagesToRemove(sourceFile);
70 var changes = __spreadArray(__spreadArray([], __read(importRemovements)), __read(usageReplacements));
71 return schematics_core_1.commitChanges(tree, sourceFile.fileName, changes);
72}
73function insertRuntimeChecks(sourceFile, tree) {
74 if (sourceFile.fileName.endsWith('.spec.ts') ||
75 sourceFile.fileName.endsWith('.test.ts')) {
76 return;
77 }
78 var changes = findRuntimeCHecksToInsert(sourceFile);
79 return schematics_core_1.commitChanges(tree, sourceFile.fileName, changes);
80}
81function findStoreFreezeImportsToRemove(sourceFile) {
82 var imports = sourceFile.statements
83 .filter(ts.isImportDeclaration)
84 .filter(function (_a) {
85 var moduleSpecifier = _a.moduleSpecifier;
86 return (moduleSpecifier.getText(sourceFile) === "'ngrx-store-freeze'" ||
87 moduleSpecifier.getText(sourceFile) === "\"ngrx-store-freeze\"");
88 });
89 var removements = imports.map(function (i) {
90 return new schematics_core_1.RemoveChange(sourceFile.fileName, i.getStart(sourceFile), i.getEnd());
91 });
92 return removements;
93}
94function findStoreFreezeUsagesToRemove(sourceFile) {
95 var changes = [];
96 ts.forEachChild(sourceFile, crawl);
97 return changes;
98 function crawl(node) {
99 ts.forEachChild(node, crawl);
100 if (!ts.isArrayLiteralExpression(node))
101 return;
102 var elements = node.elements.map(function (elem) { return elem.getText(sourceFile); });
103 var elementsWithoutStoreFreeze = elements.filter(function (elemText) { return elemText !== 'storeFreeze'; });
104 if (elements.length !== elementsWithoutStoreFreeze.length) {
105 changes.push(new schematics_core_1.RemoveChange(sourceFile.fileName, node.getStart(sourceFile), node.getEnd()));
106 changes.push(new schematics_core_1.InsertChange(sourceFile.fileName, node.getStart(sourceFile), "[" + elementsWithoutStoreFreeze.join(', ') + "]"));
107 }
108 }
109}
110function findRuntimeCHecksToInsert(sourceFile) {
111 var changes = [];
112 ts.forEachChild(sourceFile, crawl);
113 return changes;
114 function crawl(node) {
115 ts.forEachChild(node, crawl);
116 if (!ts.isCallExpression(node))
117 return;
118 var expression = node.expression;
119 if (!(ts.isPropertyAccessExpression(expression) &&
120 expression.expression.getText(sourceFile) === 'StoreModule' &&
121 expression.name.getText(sourceFile) === 'forRoot')) {
122 return;
123 }
124 var runtimeChecks = "runtimeChecks: { strictStateImmutability: true, strictActionImmutability: true }";
125 // covers StoreModule.forRoot(ROOT_REDUCERS)
126 if (node.arguments.length === 1) {
127 changes.push(new schematics_core_1.InsertChange(sourceFile.fileName, node.arguments[0].getEnd(), ", { " + runtimeChecks + "}"));
128 }
129 else if (node.arguments.length === 2) {
130 var storeConfig = node.arguments[1];
131 if (ts.isObjectLiteralExpression(storeConfig)) {
132 // covers StoreModule.forRoot(ROOT_REDUCERS, {})
133 if (storeConfig.properties.length === 0) {
134 changes.push(new schematics_core_1.InsertChange(sourceFile.fileName, storeConfig.getEnd() - 1, runtimeChecks + " "));
135 }
136 else {
137 // covers StoreModule.forRoot(ROOT_REDUCERS, { metaReducers })
138 var lastProperty = storeConfig.properties[storeConfig.properties.length - 1];
139 changes.push(new schematics_core_1.InsertChange(sourceFile.fileName, lastProperty.getEnd(), ", " + runtimeChecks));
140 }
141 }
142 }
143 }
144}
145//# sourceMappingURL=index.js.map
\No newline at end of file