1 | "use strict";
|
2 | var __values = (this && this.__values) || function(o) {
|
3 | var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
4 | if (m) return m.call(o);
|
5 | if (o && typeof o.length === "number") return {
|
6 | next: function () {
|
7 | if (o && i >= o.length) o = void 0;
|
8 | return { value: o && o[i++], done: !o };
|
9 | }
|
10 | };
|
11 | throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
12 | };
|
13 | var __read = (this && this.__read) || function (o, n) {
|
14 | var m = typeof Symbol === "function" && o[Symbol.iterator];
|
15 | if (!m) return o;
|
16 | var i = m.call(o), r, ar = [], e;
|
17 | try {
|
18 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
19 | }
|
20 | catch (error) { e = { error: error }; }
|
21 | finally {
|
22 | try {
|
23 | if (r && !r.done && (m = i["return"])) m.call(i);
|
24 | }
|
25 | finally { if (e) throw e.error; }
|
26 | }
|
27 | return ar;
|
28 | };
|
29 | var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
30 | if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
31 | if (ar || !(i in from)) {
|
32 | if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
33 | ar[i] = from[i];
|
34 | }
|
35 | }
|
36 | return to.concat(ar || Array.prototype.slice.call(from));
|
37 | };
|
38 | Object.defineProperty(exports, "__esModule", { value: true });
|
39 | exports.getPrefix = exports.omit = exports.addReducerImportToNgModule = exports.addReducerToActionReducerMap = exports.addReducerToStateInterface = exports.addReducerToState = void 0;
|
40 | var ts = require("typescript");
|
41 | var stringUtils = require("./strings");
|
42 | var change_1 = require("./change");
|
43 | var schematics_1 = require("@angular-devkit/schematics");
|
44 | var core_1 = require("@angular-devkit/core");
|
45 | var find_module_1 = require("./find-module");
|
46 | var ast_utils_1 = require("./ast-utils");
|
47 | function addReducerToState(options) {
|
48 | return function (host) {
|
49 | var e_1, _a;
|
50 | if (!options.reducers) {
|
51 | return host;
|
52 | }
|
53 | var reducersPath = (0, core_1.normalize)("/".concat(options.path, "/").concat(options.reducers));
|
54 | if (!host.exists(reducersPath)) {
|
55 | throw new Error("Specified reducers path ".concat(reducersPath, " does not exist"));
|
56 | }
|
57 | var text = host.read(reducersPath);
|
58 | if (text === null) {
|
59 | throw new schematics_1.SchematicsException("File ".concat(reducersPath, " does not exist."));
|
60 | }
|
61 | var sourceText = text.toString('utf-8');
|
62 | var source = ts.createSourceFile(reducersPath, sourceText, ts.ScriptTarget.Latest, true);
|
63 | var reducerPath = "/".concat(options.path, "/") +
|
64 | (options.flat ? '' : stringUtils.dasherize(options.name) + '/') +
|
65 | (options.group ? 'reducers/' : '') +
|
66 | stringUtils.dasherize(options.name) +
|
67 | '.reducer';
|
68 | var relativePath = (0, find_module_1.buildRelativePath)(reducersPath, reducerPath);
|
69 | var reducerImport = (0, ast_utils_1.insertImport)(source, reducersPath, "* as from".concat(stringUtils.classify(options.name)), relativePath, true);
|
70 | var stateInterfaceInsert = addReducerToStateInterface(source, reducersPath, options);
|
71 | var reducerMapInsert = addReducerToActionReducerMap(source, reducersPath, options);
|
72 | var changes = [reducerImport, stateInterfaceInsert, reducerMapInsert];
|
73 | var recorder = host.beginUpdate(reducersPath);
|
74 | try {
|
75 | for (var changes_1 = __values(changes), changes_1_1 = changes_1.next(); !changes_1_1.done; changes_1_1 = changes_1.next()) {
|
76 | var change = changes_1_1.value;
|
77 | if (change instanceof change_1.InsertChange) {
|
78 | recorder.insertLeft(change.pos, change.toAdd);
|
79 | }
|
80 | }
|
81 | }
|
82 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
83 | finally {
|
84 | try {
|
85 | if (changes_1_1 && !changes_1_1.done && (_a = changes_1.return)) _a.call(changes_1);
|
86 | }
|
87 | finally { if (e_1) throw e_1.error; }
|
88 | }
|
89 | host.commitUpdate(recorder);
|
90 | return host;
|
91 | };
|
92 | }
|
93 | exports.addReducerToState = addReducerToState;
|
94 |
|
95 |
|
96 |
|
97 | function addReducerToStateInterface(source, reducersPath, options) {
|
98 | var stateInterface = source.statements.find(function (stm) { return stm.kind === ts.SyntaxKind.InterfaceDeclaration; });
|
99 | var node = stateInterface;
|
100 | if (!node) {
|
101 | return new change_1.NoopChange();
|
102 | }
|
103 | var state = options.plural
|
104 | ? stringUtils.pluralize(options.name)
|
105 | : stringUtils.camelize(options.name);
|
106 | var keyInsert = "[from".concat(stringUtils.classify(options.name), ".").concat(stringUtils.camelize(state), "FeatureKey]: from").concat(stringUtils.classify(options.name), ".State;");
|
107 | var expr = node;
|
108 | var position;
|
109 | var toInsert;
|
110 | if (expr.members.length === 0) {
|
111 | position = expr.getEnd() - 1;
|
112 | toInsert = " ".concat(keyInsert, "\n");
|
113 | }
|
114 | else {
|
115 | node = expr.members[expr.members.length - 1];
|
116 | position = node.getEnd() + 1;
|
117 |
|
118 | var text = node.getFullText(source);
|
119 | var matches = text.match(/^\r?\n+(\s*)/);
|
120 | if (matches && matches.length > 0) {
|
121 | toInsert = "".concat(matches[1]).concat(keyInsert, "\n");
|
122 | }
|
123 | else {
|
124 | toInsert = "\n".concat(keyInsert);
|
125 | }
|
126 | }
|
127 | return new change_1.InsertChange(reducersPath, position, toInsert);
|
128 | }
|
129 | exports.addReducerToStateInterface = addReducerToStateInterface;
|
130 |
|
131 |
|
132 |
|
133 | function addReducerToActionReducerMap(source, reducersPath, options) {
|
134 | var initializer;
|
135 | var actionReducerMap = source.statements
|
136 | .filter(function (stm) { return stm.kind === ts.SyntaxKind.VariableStatement; })
|
137 | .filter(function (stm) { return !!stm.declarationList; })
|
138 | .map(function (stm) {
|
139 | var declarations = stm.declarationList.declarations;
|
140 | var variable = declarations.find(function (decl) { return decl.kind === ts.SyntaxKind.VariableDeclaration; });
|
141 | var type = variable ? variable.type : {};
|
142 | return { initializer: variable.initializer, type: type };
|
143 | })
|
144 | .filter(function (initWithType) { return initWithType.type !== undefined; })
|
145 | .find(function (_a) {
|
146 | var type = _a.type;
|
147 | return type.typeName.text === 'ActionReducerMap';
|
148 | });
|
149 | if (!actionReducerMap || !actionReducerMap.initializer) {
|
150 | return new change_1.NoopChange();
|
151 | }
|
152 | var node = actionReducerMap.initializer;
|
153 | var state = options.plural
|
154 | ? stringUtils.pluralize(options.name)
|
155 | : stringUtils.camelize(options.name);
|
156 | var keyInsert = "[from".concat(stringUtils.classify(options.name), ".").concat(stringUtils.camelize(state), "FeatureKey]: from").concat(stringUtils.classify(options.name), ".reducer,");
|
157 | var expr = node;
|
158 | var position;
|
159 | var toInsert;
|
160 | if (expr.properties.length === 0) {
|
161 | position = expr.getEnd() - 1;
|
162 | toInsert = " ".concat(keyInsert, "\n");
|
163 | }
|
164 | else {
|
165 | node = expr.properties[expr.properties.length - 1];
|
166 | position = node.getEnd() + 1;
|
167 |
|
168 | var text = node.getFullText(source);
|
169 | var matches = text.match(/^\r?\n+(\s*)/);
|
170 | if (matches && matches.length > 0) {
|
171 | toInsert = "\n".concat(matches[1]).concat(keyInsert);
|
172 | }
|
173 | else {
|
174 | toInsert = "\n".concat(keyInsert);
|
175 | }
|
176 | }
|
177 | return new change_1.InsertChange(reducersPath, position, toInsert);
|
178 | }
|
179 | exports.addReducerToActionReducerMap = addReducerToActionReducerMap;
|
180 |
|
181 |
|
182 |
|
183 | function addReducerImportToNgModule(options) {
|
184 | return function (host) {
|
185 | var e_2, _a;
|
186 | if (!options.module) {
|
187 | return host;
|
188 | }
|
189 | var modulePath = options.module;
|
190 | if (!host.exists(options.module)) {
|
191 | throw new Error("Specified module path ".concat(modulePath, " does not exist"));
|
192 | }
|
193 | var text = host.read(modulePath);
|
194 | if (text === null) {
|
195 | throw new schematics_1.SchematicsException("File ".concat(modulePath, " does not exist."));
|
196 | }
|
197 | var sourceText = text.toString('utf-8');
|
198 | var source = ts.createSourceFile(modulePath, sourceText, ts.ScriptTarget.Latest, true);
|
199 | var commonImports = [
|
200 | (0, ast_utils_1.insertImport)(source, modulePath, 'StoreModule', '@ngrx/store'),
|
201 | ];
|
202 | var reducerPath = "/".concat(options.path, "/") +
|
203 | (options.flat ? '' : stringUtils.dasherize(options.name) + '/') +
|
204 | (options.group ? 'reducers/' : '') +
|
205 | stringUtils.dasherize(options.name) +
|
206 | '.reducer';
|
207 | var relativePath = (0, find_module_1.buildRelativePath)(modulePath, reducerPath);
|
208 | var reducerImport = (0, ast_utils_1.insertImport)(source, modulePath, "* as from".concat(stringUtils.classify(options.name)), relativePath, true);
|
209 | var state = options.plural
|
210 | ? stringUtils.pluralize(options.name)
|
211 | : stringUtils.camelize(options.name);
|
212 | var _b = __read((0, ast_utils_1.addImportToModule)(source, modulePath, "StoreModule.forFeature(from".concat(stringUtils.classify(options.name), ".").concat(state, "FeatureKey, from").concat(stringUtils.classify(options.name), ".reducer)"), relativePath), 1), storeNgModuleImport = _b[0];
|
213 | var changes = __spreadArray(__spreadArray([], __read(commonImports), false), [reducerImport, storeNgModuleImport], false);
|
214 | var recorder = host.beginUpdate(modulePath);
|
215 | try {
|
216 | for (var changes_2 = __values(changes), changes_2_1 = changes_2.next(); !changes_2_1.done; changes_2_1 = changes_2.next()) {
|
217 | var change = changes_2_1.value;
|
218 | if (change instanceof change_1.InsertChange) {
|
219 | recorder.insertLeft(change.pos, change.toAdd);
|
220 | }
|
221 | }
|
222 | }
|
223 | catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
224 | finally {
|
225 | try {
|
226 | if (changes_2_1 && !changes_2_1.done && (_a = changes_2.return)) _a.call(changes_2);
|
227 | }
|
228 | finally { if (e_2) throw e_2.error; }
|
229 | }
|
230 | host.commitUpdate(recorder);
|
231 | return host;
|
232 | };
|
233 | }
|
234 | exports.addReducerImportToNgModule = addReducerImportToNgModule;
|
235 | function omit(object, keyToRemove) {
|
236 | return Object.keys(object)
|
237 | .filter(function (key) { return key !== keyToRemove; })
|
238 | .reduce(function (result, key) {
|
239 | var _a;
|
240 | return Object.assign(result, (_a = {}, _a[key] = object[key], _a));
|
241 | }, {});
|
242 | }
|
243 | exports.omit = omit;
|
244 | function getPrefix(options) {
|
245 | return stringUtils.camelize(options.prefix || 'load');
|
246 | }
|
247 | exports.getPrefix = getPrefix;
|
248 |
|
\ | No newline at end of file |