1 | "use strict";
|
2 | var __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 | };
|
18 | var __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 | };
|
23 | exports.__esModule = true;
|
24 | var ts = require("typescript");
|
25 | var schematics_1 = require("@angular-devkit/schematics");
|
26 | var schematics_core_1 = require("../../schematics-core");
|
27 | function replaceWithRuntimeChecks() {
|
28 | return function (tree) {
|
29 |
|
30 | schematics_core_1.visitTSSourceFiles(tree, removeUsages) &&
|
31 | schematics_core_1.visitTSSourceFiles(tree, insertRuntimeChecks);
|
32 | };
|
33 | }
|
34 | function 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 | }
|
56 | function default_1() {
|
57 | return schematics_1.chain([removeNgRxStoreFreezePackage(), replaceWithRuntimeChecks()]);
|
58 | }
|
59 | exports["default"] = default_1;
|
60 | function 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 | }
|
73 | function 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 | }
|
81 | function 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 | }
|
94 | function 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 | }
|
110 | function 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 |
|
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 |
|
133 | if (storeConfig.properties.length === 0) {
|
134 | changes.push(new schematics_core_1.InsertChange(sourceFile.fileName, storeConfig.getEnd() - 1, runtimeChecks + " "));
|
135 | }
|
136 | else {
|
137 |
|
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 |
|
\ | No newline at end of file |