node-cli-tester 21.0.18 → 21.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib-prod/index.js CHANGED
@@ -1,10 +1,6 @@
1
- import { NodeCliTester } from "./node-cli-tester";
2
- import { TestTemplates } from "./spec-templates.backend";
3
- import { CliTest } from "./cli-test.backend";
4
- import { run } from "./start.backend";
5
- export {
6
- CliTest,
7
- NodeCliTester,
8
- TestTemplates,
9
- run
10
- };
1
+ export { NodeCliTester } from './node-cli-tester';
2
+ //#region @backend
3
+ export { TestTemplates } from './spec-templates.backend';
4
+ export { CliTest } from './cli-test.backend';
5
+ export { run } from './start.backend';
6
+ //#endregion
@@ -1,182 +1,186 @@
1
- import * as glob from "glob";
2
- import { path, ___NS__first, ___NS__isObject, ___NS__keys, ___NS__maxBy, ___NS__merge, ___NS__minBy, Utils__NS__uniqArray } from "tnp-core/lib-prod";
3
- import { config } from "tnp-core/lib-prod";
4
- import { BaseProject as Project, Helpers__NS__createSymLink, Helpers__NS__error, Helpers__NS__exists, Helpers__NS__isFolder, Helpers__NS__log, Helpers__NS__mkdirp, Helpers__NS__parse, Helpers__NS__readFile, Helpers__NS__removeFolderIfExists, Helpers__NS__stringify, Helpers__NS__writeFile } from "tnp-helpers/lib-prod";
5
- import { CLASS } from "typescript-class-helpers/lib-prod";
6
- import { BaseProjectStructure } from "./base-project-structure.backend";
7
- class MetaMd {
8
- //#endregion
9
- //#region constructor
10
- constructor(filePath) {
11
- this.filePath = filePath;
12
- }
13
- //#region static fields
14
- static JSON_PART = "@jsonPart";
15
- static FILE_CONTENT_PART = "@fileContentPart";
16
- static TEST_PART = "@testPart";
17
- //#region static fields / create
18
- static async create(json, fileContent, testContent) {
19
- return await create(___NS__isObject(json) ? Helpers__NS__stringify(json) : json, fileContent, testContent);
20
- }
21
- //#endregion
22
- //#region static fields / preserve file
23
- static async preserveFiles(originalAnyTypeFiles, destinationFolder, editorCwd, foundProjectsFn = (a) => a, baseProjectsStructurePath, overrideThisFileName = void 0, overrideTimehash = void 0) {
24
- const properDestName = overrideThisFileName ? overrideThisFileName : `${path.basename(___NS__first(originalAnyTypeFiles))}.${config.file.meta_config_md}`;
25
- if (!Helpers__NS__isFolder(destinationFolder)) {
26
- Helpers__NS__error(`[tnp-helpers][meta-content-md] Destination folder "${destinationFolder}"
1
+ //#region imports
2
+ import * as glob from 'glob';
3
+ import { path, ___NS__first, ___NS__isObject, ___NS__keys, ___NS__maxBy, ___NS__merge, ___NS__minBy, Utils__NS__uniqArray } from 'tnp-core/lib-prod';
4
+ import { config } from 'tnp-core/lib-prod';
5
+ import { BaseProject as Project, Helpers__NS__createSymLink, Helpers__NS__error, Helpers__NS__exists, Helpers__NS__isFolder, Helpers__NS__log, Helpers__NS__mkdirp, Helpers__NS__parse, Helpers__NS__readFile, Helpers__NS__removeFolderIfExists, Helpers__NS__stringify, Helpers__NS__writeFile } from 'tnp-helpers/lib-prod';
6
+ import { CLASS } from 'typescript-class-helpers/lib-prod';
7
+ import { BaseProjectStructure } from './base-project-structure.backend';
8
+ //#endregion
9
+ /**
10
+ * Special forma of .md for keeping metadata, testfile, and test template for file
11
+ */
12
+ export class MetaMd {
13
+ //#region static fields
14
+ static { this.JSON_PART = '@jsonPart'; }
15
+ static { this.FILE_CONTENT_PART = '@fileContentPart'; }
16
+ static { this.TEST_PART = '@testPart'; }
17
+ //#region static fields / create
18
+ static async create(json, fileContent, testContent) {
19
+ return await create((___NS__isObject(json) ? Helpers__NS__stringify(json) : json), fileContent, testContent);
20
+ }
21
+ //#endregion
22
+ //#region static fields / preserve file
23
+ static async preserveFiles(originalAnyTypeFiles, destinationFolder, editorCwd, foundProjectsFn = (a) => a, baseProjectsStructurePath, // navi-cli folder or current folder,
24
+ overrideThisFileName = void 0, overrideTimehash = void 0) {
25
+ const properDestName = overrideThisFileName ? overrideThisFileName :
26
+ `${path.basename(___NS__first(originalAnyTypeFiles))}.${config.file.meta_config_md}`; // TODO later menu to confirm name
27
+ if (!Helpers__NS__isFolder(destinationFolder)) {
28
+ Helpers__NS__error(`[tnp-helpers][meta-content-md] Destination folder "${destinationFolder}"
27
29
  is not a folder`, false, true);
30
+ }
31
+ let foundedProjectsInPath = resolveFoundedProject(originalAnyTypeFiles, editorCwd, foundProjectsFn);
32
+ const mostBaseLocationFound = ___NS__minBy(foundedProjectsInPath, p => p.location.length).location;
33
+ // console.log(foundedProjectsInPath.map(p => p.location))
34
+ const projects = foundedProjectsInPath
35
+ .reduce((a, b) => {
36
+ const baseStructureHash = BaseProjectStructure.generate(b).insideIfNotExists(baseProjectsStructurePath);
37
+ return ___NS__merge(a, {
38
+ [path.join(path.basename(mostBaseLocationFound), b.location.replace(mostBaseLocationFound, ''))]: {
39
+ githash: b.git.lastCommitHash(),
40
+ name: b.name,
41
+ baseStructureHash,
42
+ }
43
+ });
44
+ }, {});
45
+ const timeHash = overrideTimehash ? overrideTimehash : (+new Date).toString(36);
46
+ const c = await MetaMd.create({
47
+ orgFileBasenames: originalAnyTypeFiles.map(a => path.basename(a)),
48
+ orgRelativePathes: originalAnyTypeFiles.map(a => {
49
+ return path.join(path.basename(mostBaseLocationFound), a.replace(mostBaseLocationFound, ''));
50
+ }),
51
+ projects,
52
+ firstProjectBasename: path.basename(mostBaseLocationFound),
53
+ timeHash,
54
+ }, originalAnyTypeFiles.map(a => Helpers__NS__readFile(a)));
55
+ Helpers__NS__writeFile(path.join(destinationFolder, properDestName), c);
56
+ }
57
+ //#endregion
58
+ async addFiles(newFilesPathes, destinationFolder, editorCwd, foundProjectFn = void 0, baseProjectsStructurePath) {
59
+ let foundedProjectsInPath = resolveFoundedProject(newFilesPathes, editorCwd, foundProjectFn);
60
+ const mostBaseLocationFound = ___NS__minBy(foundedProjectsInPath, p => p.location.length).location;
61
+ newFilesPathes = Utils__NS__uniqArray([
62
+ ...newFilesPathes,
63
+ ...this.readonlyMetaJson.orgRelativePathes.map(a => {
64
+ return path.join(path.dirname(mostBaseLocationFound), a);
65
+ }),
66
+ ]);
67
+ newFilesPathes.forEach(f => {
68
+ if (!Helpers__NS__exists(f)) {
69
+ Helpers__NS__error(`File doesn't exists`, false, true);
70
+ }
71
+ });
72
+ await MetaMd.preserveFiles(newFilesPathes, destinationFolder, editorCwd, foundProjectFn, baseProjectsStructurePath, path.basename(this.filePath), this.readonlyMetaJson.timeHash);
28
73
  }
29
- let foundedProjectsInPath = resolveFoundedProject(originalAnyTypeFiles, editorCwd, foundProjectsFn);
30
- const mostBaseLocationFound = ___NS__minBy(foundedProjectsInPath, (p) => p.location.length).location;
31
- const projects = foundedProjectsInPath.reduce((a, b) => {
32
- const baseStructureHash = BaseProjectStructure.generate(b).insideIfNotExists(baseProjectsStructurePath);
33
- return ___NS__merge(a, {
34
- [path.join(path.basename(mostBaseLocationFound), b.location.replace(mostBaseLocationFound, ""))]: {
35
- githash: b.git.lastCommitHash(),
36
- name: b.name,
37
- baseStructureHash
74
+ //#region static fields / handle instance from meta-content.md file
75
+ static instanceFrom(filePath) {
76
+ return new MetaMd(filePath);
77
+ }
78
+ static allInstancesFrom(folderPath) {
79
+ return glob.sync(`${folderPath}/*.${config.file.meta_config_md}`).map(f => {
80
+ return MetaMd.instanceFrom(f);
81
+ });
82
+ }
83
+ //#endregion
84
+ //#endregion
85
+ //#region getters
86
+ get json() {
87
+ const content = Helpers__NS__readFile(this.filePath) || '';
88
+ try {
89
+ const extracted = ___NS__first(extract(content, MetaMd.JSON_PART));
90
+ const parsed = Helpers__NS__parse(extracted, true);
91
+ return parsed;
92
+ }
93
+ catch (error) {
94
+ return {};
38
95
  }
39
- });
40
- }, {});
41
- const timeHash = overrideTimehash ? overrideTimehash : (+/* @__PURE__ */ new Date()).toString(36);
42
- const c = await MetaMd.create({
43
- orgFileBasenames: originalAnyTypeFiles.map((a) => path.basename(a)),
44
- orgRelativePathes: originalAnyTypeFiles.map((a) => {
45
- return path.join(path.basename(mostBaseLocationFound), a.replace(mostBaseLocationFound, ""));
46
- }),
47
- projects,
48
- firstProjectBasename: path.basename(mostBaseLocationFound),
49
- timeHash
50
- }, originalAnyTypeFiles.map((a) => Helpers__NS__readFile(a)));
51
- Helpers__NS__writeFile(path.join(destinationFolder, properDestName), c);
52
- }
53
- //#endregion
54
- async addFiles(newFilesPathes, destinationFolder, editorCwd, foundProjectFn = void 0, baseProjectsStructurePath) {
55
- let foundedProjectsInPath = resolveFoundedProject(newFilesPathes, editorCwd, foundProjectFn);
56
- const mostBaseLocationFound = ___NS__minBy(foundedProjectsInPath, (p) => p.location.length).location;
57
- newFilesPathes = Utils__NS__uniqArray([
58
- ...newFilesPathes,
59
- ...this.readonlyMetaJson.orgRelativePathes.map((a) => {
60
- return path.join(path.dirname(mostBaseLocationFound), a);
61
- })
62
- ]);
63
- newFilesPathes.forEach((f) => {
64
- if (!Helpers__NS__exists(f)) {
65
- Helpers__NS__error(`File doesn't exists`, false, true);
66
- }
67
- });
68
- await MetaMd.preserveFiles(
69
- newFilesPathes,
70
- destinationFolder,
71
- editorCwd,
72
- foundProjectFn,
73
- baseProjectsStructurePath,
74
- path.basename(this.filePath),
75
- this.readonlyMetaJson.timeHash
76
- );
77
- }
78
- //#region static fields / handle instance from meta-content.md file
79
- static instanceFrom(filePath) {
80
- return new MetaMd(filePath);
81
- }
82
- static allInstancesFrom(folderPath) {
83
- return glob.sync(`${folderPath}/*.${config.file.meta_config_md}`).map((f) => {
84
- return MetaMd.instanceFrom(f);
85
- });
86
- }
87
- //#endregion
88
- //#endregion
89
- //#region getters
90
- get json() {
91
- const content = Helpers__NS__readFile(this.filePath) || "";
92
- try {
93
- const extracted = ___NS__first(extract(content, MetaMd.JSON_PART));
94
- const parsed = Helpers__NS__parse(extracted, true);
95
- return parsed;
96
- } catch (error) {
97
- return {};
98
- }
99
- }
100
- get readonlyMetaJson() {
101
- return Object.freeze(this.json);
102
- }
103
- fileContentByIndex(i) {
104
- const content = Helpers__NS__readFile(this.filePath) || "";
105
- const extracted = extract(content, MetaMd.FILE_CONTENT_PART)[i];
106
- return extracted;
107
- }
108
- get basename() {
109
- return path.basename(this.filePath);
110
- }
111
- get dirname() {
112
- return path.dirname(this.filePath);
113
- }
114
- //#endregion
115
- //#region recreate files/content/env before any tests
116
- /**
117
- * recate original files before any unit/intergration test
118
- */
119
- recreate(testCwd, cwdProj, ProjectClass = Project, onlyIfNotExists = false) {
120
- const hashDir = path.join(testCwd, this.json.timeHash);
121
- if (onlyIfNotExists && Helpers__NS__exists(hashDir)) {
122
- return;
123
- }
124
- Helpers__NS__removeFolderIfExists(hashDir);
125
- Helpers__NS__mkdirp(hashDir);
126
- const firstToFind = this.json.projects[this.json.firstProjectBasename].baseStructureHash;
127
- const allBaseStructures = BaseProjectStructure.allBaseStructures(cwdProj);
128
- const baseStructure = allBaseStructures.find((p) => p.baseStructureHash === firstToFind);
129
- if (!baseStructure) {
130
- Helpers__NS__error(`[node-cli-test][regenerate] base structure was not generated for ${firstToFind}`, false, true);
131
- }
132
- baseStructure.copyto(hashDir);
133
- ___NS__keys(this.json.projects).filter((key) => key !== this.json.firstProjectBasename).map((key) => {
134
- const baseStructureHashChild = this.json.projects[key].baseStructureHash;
135
- const childBaseStruct = allBaseStructures.find((p) => p.baseStructureHash === baseStructureHashChild);
136
- if (childBaseStruct) {
137
- childBaseStruct.copyto(path.join(
138
- hashDir,
139
- path.dirname(key)
140
- ), path.basename(key));
141
- }
142
- });
143
- this.readonlyMetaJson.orgRelativePathes.forEach((f, i) => {
144
- const fileToWritePath = path.join(hashDir, f);
145
- Helpers__NS__writeFile(fileToWritePath, this.fileContentByIndex(i));
146
- });
147
- const proj = ProjectClass.ins.From(path.join(hashDir, this.readonlyMetaJson.firstProjectBasename));
148
- const linksToLInk = [];
149
- linksToLInk.forEach((l) => {
150
- const source = path.resolve(path.join(proj.location, l.relativeLinkFrom));
151
- if (Helpers__NS__exists(source)) {
152
- const dest = path.resolve(path.join(proj.location, l.relativePath));
153
- Helpers__NS__createSymLink(source, dest);
154
- } else {
155
- Helpers__NS__log(`[cli-tester][recreate-env] not exist ${source}`);
156
- }
157
- });
158
- }
159
- //#endregion
96
+ }
97
+ get readonlyMetaJson() {
98
+ return Object.freeze(this.json);
99
+ }
100
+ fileContentByIndex(i) {
101
+ const content = Helpers__NS__readFile(this.filePath) || '';
102
+ const extracted = extract(content, MetaMd.FILE_CONTENT_PART)[i];
103
+ return extracted;
104
+ }
105
+ get basename() {
106
+ return path.basename(this.filePath);
107
+ }
108
+ get dirname() {
109
+ return path.dirname(this.filePath);
110
+ }
111
+ //#endregion
112
+ //#region constructor
113
+ constructor(filePath) {
114
+ this.filePath = filePath;
115
+ }
116
+ //#endregion
117
+ //#region recreate files/content/env before any tests
118
+ /**
119
+ * recate original files before any unit/intergration test
120
+ */
121
+ recreate(testCwd, cwdProj, ProjectClass = Project, onlyIfNotExists = false) {
122
+ // recreat whole structure
123
+ const hashDir = path.join(testCwd, this.json.timeHash);
124
+ if (onlyIfNotExists && Helpers__NS__exists(hashDir)) {
125
+ return;
126
+ }
127
+ Helpers__NS__removeFolderIfExists(hashDir);
128
+ Helpers__NS__mkdirp(hashDir);
129
+ const firstToFind = this.json.projects[this.json.firstProjectBasename].baseStructureHash;
130
+ const allBaseStructures = BaseProjectStructure.allBaseStructures(cwdProj);
131
+ const baseStructure = allBaseStructures.find(p => p.baseStructureHash === firstToFind);
132
+ if (!baseStructure) {
133
+ Helpers__NS__error(`[node-cli-test][regenerate] base structure was not generated for ${firstToFind}`, false, true);
134
+ }
135
+ baseStructure.copyto(hashDir);
136
+ ___NS__keys(this.json.projects)
137
+ .filter(key => key !== this.json.firstProjectBasename)
138
+ .map(key => {
139
+ const baseStructureHashChild = this.json.projects[key].baseStructureHash;
140
+ const childBaseStruct = allBaseStructures.find(p => p.baseStructureHash === baseStructureHashChild);
141
+ if (childBaseStruct) {
142
+ childBaseStruct.copyto(path.join(hashDir, path.dirname(key)), path.basename(key));
143
+ }
144
+ });
145
+ this.readonlyMetaJson.orgRelativePathes.forEach((f, i) => {
146
+ const fileToWritePath = path.join(hashDir, f);
147
+ Helpers__NS__writeFile(fileToWritePath, this.fileContentByIndex(i));
148
+ });
149
+ const proj = ProjectClass.ins.From(path.join(hashDir, this.readonlyMetaJson.firstProjectBasename));
150
+ const linksToLInk = []; // proj?.forEmptyStructure().filter(f => !!f.relativeLinkFrom) || [];
151
+ linksToLInk.forEach(l => {
152
+ const source = path.resolve(path.join(proj.location, l.relativeLinkFrom));
153
+ if (Helpers__NS__exists(source)) {
154
+ const dest = path.resolve(path.join(proj.location, l.relativePath));
155
+ Helpers__NS__createSymLink(source, dest);
156
+ }
157
+ else {
158
+ Helpers__NS__log(`[cli-tester][recreate-env] not exist ${source}`);
159
+ }
160
+ });
161
+ }
160
162
  }
163
+ //#region create
161
164
  async function create(json5string, fileContents, testContent) {
162
- const metadataJSON = Helpers__NS__parse(json5string, true);
163
- if (!testContent) {
164
- const projPath = ___NS__maxBy(___NS__keys(metadataJSON.projects).map((projRelPath) => {
165
- return { path: projRelPath, length: projRelPath.length };
166
- }), (c) => c.length)?.path || "";
167
- let TestTemplatesClass = CLASS.getBy("TestTemplates");
168
- if (!TestTemplatesClass) {
169
- TestTemplatesClass = await (await import("./spec-templates.backend")).TestTemplates;
170
- }
171
- testContent = TestTemplatesClass.testPart(metadataJSON.orgRelativePathes, projPath, metadataJSON.timeHash);
172
- }
173
- const filesContestString = fileContents.map((fileContent, i) => {
174
- const ext = path.extname(metadataJSON.orgFileBasenames[i]).replace(/^\./, "");
175
- return `\`\`\`${ext} ${MetaMd.FILE_CONTENT_PART}
165
+ const metadataJSON = Helpers__NS__parse(json5string, true);
166
+ // Helpers__NS__log(`metadataJSON.orgFileBasename: ${metadataJSON.orgFileBasename}`)
167
+ if (!testContent) {
168
+ const projPath = ___NS__maxBy(___NS__keys(metadataJSON.projects).map(projRelPath => {
169
+ return { path: projRelPath, length: projRelPath.length };
170
+ }), c => c.length)?.path || '';
171
+ let TestTemplatesClass = CLASS.getBy('TestTemplates');
172
+ if (!TestTemplatesClass) {
173
+ TestTemplatesClass = await (await import('./spec-templates.backend')).TestTemplates;
174
+ }
175
+ testContent = TestTemplatesClass.testPart(metadataJSON.orgRelativePathes, projPath, metadataJSON.timeHash);
176
+ }
177
+ const filesContestString = fileContents.map((fileContent, i) => {
178
+ const ext = path.extname(metadataJSON.orgFileBasenames[i]).replace(/^\./, '');
179
+ return `\`\`\`${ext} ${MetaMd.FILE_CONTENT_PART}
176
180
  ${fileContent}
177
181
  \`\`\``;
178
- }).join("\n\n");
179
- return `
182
+ }).join('\n\n');
183
+ return `
180
184
  \`\`\`ts ${MetaMd.TEST_PART}
181
185
  ${testContent}
182
186
  \`\`\`
@@ -186,51 +190,54 @@ ${json5string}
186
190
  \`\`\`
187
191
 
188
192
  ${filesContestString}
189
- `.split("\n").map((l) => {
190
- return l.trim().startsWith("```") ? l.trimLeft() : l;
191
- }).join("\n").trim() + "\n";
193
+ `.split('\n').map(l => {
194
+ return l.trim().startsWith('\`\`\`') ? l.trimLeft() : l;
195
+ }).join('\n').trim() + '\n';
192
196
  }
193
- function extract(content, PARTS_TO_FIND) {
194
- if (!content) {
195
- return;
196
- }
197
- const parts = [];
198
- let lines = [];
199
- const allLines = content.split("\n");
200
- let pushingActive = false;
201
- for (let index = 0; index < allLines.length; index++) {
202
- const orgLine = allLines[index] || "";
203
- const line = orgLine.trim();
204
- if (pushingActive) {
205
- if (line.startsWith("```")) {
206
- parts.push(lines.join("\n"));
207
- lines = [];
208
- } else {
209
- lines.push(orgLine);
210
- }
211
- }
212
- if (line.startsWith("```") && line.search(PARTS_TO_FIND) !== -1) {
213
- pushingActive = true;
214
- }
215
- }
216
- return parts.filter((f) => !!f.trim());
197
+ //#endregion
198
+ //#region extract data parts from content md file
199
+ export function extract(content, PARTS_TO_FIND) {
200
+ if (!content) {
201
+ return;
202
+ }
203
+ const parts = [];
204
+ let lines = [];
205
+ const allLines = content.split('\n');
206
+ let pushingActive = false;
207
+ for (let index = 0; index < allLines.length; index++) {
208
+ const orgLine = (allLines[index] || '');
209
+ const line = orgLine.trim();
210
+ if (pushingActive) {
211
+ if (line.startsWith('\`\`\`')) {
212
+ parts.push(lines.join('\n'));
213
+ lines = [];
214
+ }
215
+ else {
216
+ lines.push(orgLine);
217
+ }
218
+ }
219
+ if (line.startsWith('\`\`\`') && (line.search(PARTS_TO_FIND) !== -1)) {
220
+ pushingActive = true;
221
+ }
222
+ }
223
+ return parts.filter(f => !!f.trim());
217
224
  }
225
+ //#endregion
226
+ //#region resolve founded projects
218
227
  function resolveFoundedProject(originalAnyTypeFiles, editorCwd, foundProjectFn) {
219
- let foundedProjectsInPath = [];
220
- for (let index = 0; index < originalAnyTypeFiles.length; index++) {
221
- const fileAbsPath = originalAnyTypeFiles[index];
222
- foundedProjectsInPath = [
223
- ...foundedProjectsInPath,
224
- ...Project.ins.allProjectFrom(fileAbsPath, editorCwd)
225
- ];
226
- if (foundProjectFn) {
227
- foundedProjectsInPath = foundProjectFn(Utils__NS__uniqArray(foundedProjectsInPath, "location"));
228
- }
229
- }
230
- foundedProjectsInPath = Utils__NS__uniqArray(foundedProjectsInPath, "location");
231
- return foundedProjectsInPath;
228
+ let foundedProjectsInPath = [];
229
+ for (let index = 0; index < originalAnyTypeFiles.length; index++) {
230
+ const fileAbsPath = originalAnyTypeFiles[index];
231
+ foundedProjectsInPath = [
232
+ ...foundedProjectsInPath,
233
+ ...Project.ins.allProjectFrom(fileAbsPath, editorCwd)
234
+ ];
235
+ if (foundProjectFn) {
236
+ foundedProjectsInPath = foundProjectFn(Utils__NS__uniqArray(foundedProjectsInPath, 'location'));
237
+ }
238
+ }
239
+ foundedProjectsInPath = Utils__NS__uniqArray(foundedProjectsInPath, 'location');
240
+ return foundedProjectsInPath;
232
241
  }
233
- export {
234
- MetaMd,
235
- extract
236
- };
242
+ //#endregion
243
+ //#endregion
@@ -1 +1,2 @@
1
- export * from "./migrations_index._auto-generated_";
1
+ //@ts-nocheck
2
+ export * from './migrations_index._auto-generated_';
@@ -0,0 +1,3 @@
1
+ // THIS FILE IS GENERATED - DO NOT MODIFY
2
+ // THIS FILE IS GENERATED - DO NOT MODIFY
3
+ // THIS FILE IS GENERATED - DO NOT MODIFY