@diia-inhouse/genproto 3.2.6 → 3.2.7
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.
|
@@ -10,6 +10,7 @@ const promises_1 = __importDefault(require("node:fs/promises"));
|
|
|
10
10
|
const node_path_1 = __importDefault(require("node:path"));
|
|
11
11
|
const promises_2 = require("node:stream/promises");
|
|
12
12
|
const glob_1 = require("glob");
|
|
13
|
+
const lodash_1 = require("lodash");
|
|
13
14
|
const index_1 = require("./index");
|
|
14
15
|
// import "designSystem/molecules/attentionIconMessageMlc.proto";
|
|
15
16
|
const importRegex = /import "(?<path>[^"]+)";/;
|
|
@@ -68,10 +69,10 @@ class PythonCommandBuilder extends index_1.CommandBuilder {
|
|
|
68
69
|
const localProtos = await (0, glob_1.glob)('proto' + protoPattern);
|
|
69
70
|
const rulesTasks = [];
|
|
70
71
|
for (const localProto of localProtos) {
|
|
71
|
-
rulesTasks.push(replaceRulesTask(localProto, mapping, this.logger));
|
|
72
|
+
rulesTasks.push(replaceRulesTask(localProto, mapping, this.outputDir, this.logger));
|
|
72
73
|
}
|
|
73
74
|
const rules = await Promise.all(rulesTasks);
|
|
74
|
-
replaceRules = [...new Map(rules.flat().map((rule) => [rule.
|
|
75
|
+
replaceRules = [...new Map(rules.flat().map((rule) => [rule.regex.source, rule])).values()];
|
|
75
76
|
const generatedFiles = await (0, glob_1.glob)(this.outputDir + '/**/*.py');
|
|
76
77
|
const tasks = [];
|
|
77
78
|
for (const generatedFile of generatedFiles) {
|
|
@@ -81,6 +82,12 @@ class PythonCommandBuilder extends index_1.CommandBuilder {
|
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
84
|
exports.default = PythonCommandBuilder;
|
|
85
|
+
function doubleInnerUnderscores(str) {
|
|
86
|
+
return str.replaceAll(/([\da-z])_(?=[\da-z])/gi, '$1__');
|
|
87
|
+
}
|
|
88
|
+
function escapeRegex(str) {
|
|
89
|
+
return str.replaceAll(/[$()*+.?[\\\]^{|}]/g, String.raw `\$&`);
|
|
90
|
+
}
|
|
84
91
|
async function touchFilesInTree(dirPath, fileName, logger) {
|
|
85
92
|
const entries = await promises_1.default.readdir(dirPath, { withFileTypes: true }); // nosemgrep: eslint.detect-non-literal-fs-filename
|
|
86
93
|
const targetFile = node_path_1.default.join(dirPath, fileName); // nosemgrep: eslint.detect-non-literal-fs-filename
|
|
@@ -99,11 +106,24 @@ async function touchFilesInTree(dirPath, fileName, logger) {
|
|
|
99
106
|
}
|
|
100
107
|
}
|
|
101
108
|
}
|
|
102
|
-
async function replaceRulesTask(localProto, mapping, logger) {
|
|
109
|
+
async function replaceRulesTask(localProto, mapping, outputDir, logger) {
|
|
103
110
|
const replaceRules = [];
|
|
104
111
|
let handle;
|
|
105
112
|
try {
|
|
106
113
|
handle = await promises_1.default.open(localProto); // nosemgrep: eslint.detect-non-literal-fs-filename
|
|
114
|
+
const protoDirname = node_path_1.default.dirname(localProto);
|
|
115
|
+
const protoFilename = node_path_1.default.basename(localProto, '.proto');
|
|
116
|
+
const protoFilenameSnake = (0, lodash_1.snakeCase)(protoFilename);
|
|
117
|
+
const protoFilenameSnakeImportAlies = doubleInnerUnderscores(protoFilenameSnake);
|
|
118
|
+
if (protoDirname === 'proto') {
|
|
119
|
+
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
120
|
+
const rootImportRegex = new RegExp(// nosemgrep: eslint.detect-non-literal-regexp
|
|
121
|
+
`^${escapeRegex(`import ${protoFilenameSnake}_pb2 as ${protoFilenameSnakeImportAlies}__pb2`)}`);
|
|
122
|
+
replaceRules.push({
|
|
123
|
+
regex: rootImportRegex,
|
|
124
|
+
to: `from ${outputDir} import ${protoFilenameSnake}_pb2 as ${protoFilenameSnakeImportAlies}__pb2`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
107
127
|
for await (const line of handle.readLines()) {
|
|
108
128
|
const result = importRegex.exec(line);
|
|
109
129
|
const importPath = result?.groups?.path;
|
|
@@ -112,15 +132,19 @@ async function replaceRulesTask(localProto, mapping, logger) {
|
|
|
112
132
|
}
|
|
113
133
|
const dirpath = node_path_1.default.dirname(importPath);
|
|
114
134
|
const fileName = node_path_1.default.basename(importPath, '.proto');
|
|
135
|
+
const fileNameSnake = (0, lodash_1.snakeCase)(fileName);
|
|
115
136
|
if (dirpath === '.') {
|
|
116
137
|
const depname = mapping[importPath];
|
|
117
138
|
if (depname === undefined) {
|
|
118
139
|
logger.log(`Looking for ${importPath} in mapper, received ${depname}. Skipping the mapper.`);
|
|
119
140
|
continue;
|
|
120
141
|
}
|
|
142
|
+
logger.log(`I'm looking for ${fileNameSnake} (${fileName}) to map as "import ${fileNameSnake}_pb2"`);
|
|
143
|
+
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
144
|
+
const flatImportRegex = new RegExp(`^${escapeRegex(`import ${fileNameSnake}_pb2`)}`); // nosemgrep: eslint.detect-non-literal-regexp
|
|
121
145
|
replaceRules.push({
|
|
122
|
-
|
|
123
|
-
to: `from ${depname} import ${
|
|
146
|
+
regex: flatImportRegex,
|
|
147
|
+
to: `from ${depname} import ${fileNameSnake}_pb2`,
|
|
124
148
|
});
|
|
125
149
|
}
|
|
126
150
|
else {
|
|
@@ -130,9 +154,12 @@ async function replaceRulesTask(localProto, mapping, logger) {
|
|
|
130
154
|
continue;
|
|
131
155
|
}
|
|
132
156
|
const importName = dirpath.replaceAll('/', '.');
|
|
157
|
+
logger.log(`I'm looking for ${fileNameSnake} (${fileName}) to map as "from ${importName} import ${fileNameSnake}_pb2"`);
|
|
158
|
+
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
159
|
+
const nestedImportRegex = new RegExp(`^${escapeRegex(`from ${importName} import ${fileNameSnake}_pb2`)}`); // nosemgrep: eslint.detect-non-literal-regexp
|
|
133
160
|
replaceRules.push({
|
|
134
|
-
|
|
135
|
-
to: `from ${depname}.${importName} import ${
|
|
161
|
+
regex: nestedImportRegex,
|
|
162
|
+
to: `from ${depname}.${importName} import ${fileNameSnake}_pb2`,
|
|
136
163
|
});
|
|
137
164
|
}
|
|
138
165
|
}
|
|
@@ -154,7 +181,7 @@ async function fileMapper(generatedFile, replaceRules, logger) {
|
|
|
154
181
|
for await (const line of handle.readLines()) {
|
|
155
182
|
let mutableLine = line;
|
|
156
183
|
for (const rule of replaceRules) {
|
|
157
|
-
mutableLine = mutableLine.replace(rule.
|
|
184
|
+
mutableLine = mutableLine.replace(rule.regex, rule.to);
|
|
158
185
|
}
|
|
159
186
|
const writeOk = wstream.write(mutableLine + '\n');
|
|
160
187
|
if (!writeOk) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pythonCommandBuilder.js","sourceRoot":"","sources":["../../src/command/pythonCommandBuilder.ts"],"names":[],"mappings":";;;;;AAAA,4DAA4D;AAC5D,6CAAkC;AAClC,qCAAoE;AACpE,gEAAyC;AACzC,0DAA4B;AAC5B,mDAA+C;AAE/C,+BAA2B;
|
|
1
|
+
{"version":3,"file":"pythonCommandBuilder.js","sourceRoot":"","sources":["../../src/command/pythonCommandBuilder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diia-inhouse/genproto",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.7",
|
|
4
4
|
"description": "JS codegen from proto with imports from @diia-inhouse/types",
|
|
5
5
|
"bin": {
|
|
6
6
|
"genproto": "./dist/genproto.js"
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"glob": "11.1.0",
|
|
32
|
+
"lodash": "4.17.23",
|
|
32
33
|
"lookpath": "1.2.2",
|
|
33
34
|
"yargs": "17.7.2"
|
|
34
35
|
},
|
|
@@ -38,6 +39,7 @@
|
|
|
38
39
|
"devDependencies": {
|
|
39
40
|
"@diia-inhouse/configs": "6.1.1",
|
|
40
41
|
"@diia-inhouse/eslint-config": "8.6.0",
|
|
42
|
+
"@types/lodash": "4.17.24",
|
|
41
43
|
"@types/node": "20.17.1",
|
|
42
44
|
"@types/yargs": "17.0.33",
|
|
43
45
|
"@vitest/coverage-v8": "4.1.2",
|
|
@@ -6,6 +6,7 @@ import path from 'node:path'
|
|
|
6
6
|
import { finished } from 'node:stream/promises'
|
|
7
7
|
|
|
8
8
|
import { glob } from 'glob'
|
|
9
|
+
import { snakeCase } from 'lodash'
|
|
9
10
|
|
|
10
11
|
import Logger from '../logger'
|
|
11
12
|
import { CommandBuilder } from './index'
|
|
@@ -64,7 +65,7 @@ export default class PythonCommandBuilder extends CommandBuilder {
|
|
|
64
65
|
private async mapPythonImports(): Promise<void> {
|
|
65
66
|
const protoPattern = '/**/*.proto'
|
|
66
67
|
const mapping: Record<string, string> = {}
|
|
67
|
-
let replaceRules: {
|
|
68
|
+
let replaceRules: { regex: RegExp; to: string }[] = []
|
|
68
69
|
|
|
69
70
|
for (const dep in this.cardinalDependencies) {
|
|
70
71
|
const files = await glob(dep + protoPattern)
|
|
@@ -82,12 +83,12 @@ export default class PythonCommandBuilder extends CommandBuilder {
|
|
|
82
83
|
|
|
83
84
|
const rulesTasks = []
|
|
84
85
|
for (const localProto of localProtos) {
|
|
85
|
-
rulesTasks.push(replaceRulesTask(localProto, mapping, this.logger))
|
|
86
|
+
rulesTasks.push(replaceRulesTask(localProto, mapping, this.outputDir, this.logger))
|
|
86
87
|
}
|
|
87
88
|
|
|
88
89
|
const rules = await Promise.all(rulesTasks)
|
|
89
90
|
|
|
90
|
-
replaceRules = [...new Map(rules.flat().map((rule) => [rule.
|
|
91
|
+
replaceRules = [...new Map(rules.flat().map((rule) => [rule.regex.source, rule])).values()]
|
|
91
92
|
|
|
92
93
|
const generatedFiles = await glob(this.outputDir + '/**/*.py')
|
|
93
94
|
|
|
@@ -100,6 +101,14 @@ export default class PythonCommandBuilder extends CommandBuilder {
|
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
103
|
|
|
104
|
+
function doubleInnerUnderscores(str: string): string {
|
|
105
|
+
return str.replaceAll(/([\da-z])_(?=[\da-z])/gi, '$1__')
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function escapeRegex(str: string): string {
|
|
109
|
+
return str.replaceAll(/[$()*+.?[\\\]^{|}]/g, String.raw`\$&`)
|
|
110
|
+
}
|
|
111
|
+
|
|
103
112
|
async function touchFilesInTree(dirPath: string, fileName: string, logger: Logger): Promise<void> {
|
|
104
113
|
const entries = await fsPromises.readdir(dirPath, { withFileTypes: true }) // nosemgrep: eslint.detect-non-literal-fs-filename
|
|
105
114
|
|
|
@@ -125,14 +134,32 @@ async function touchFilesInTree(dirPath: string, fileName: string, logger: Logge
|
|
|
125
134
|
async function replaceRulesTask(
|
|
126
135
|
localProto: string,
|
|
127
136
|
mapping: Record<string, string>,
|
|
137
|
+
outputDir: string,
|
|
128
138
|
logger: Logger,
|
|
129
|
-
): Promise<{
|
|
139
|
+
): Promise<{ regex: RegExp; to: string }[]> {
|
|
130
140
|
const replaceRules = []
|
|
131
141
|
|
|
132
142
|
let handle: fsPromises.FileHandle | undefined
|
|
133
143
|
try {
|
|
134
144
|
handle = await fsPromises.open(localProto) // nosemgrep: eslint.detect-non-literal-fs-filename
|
|
135
145
|
|
|
146
|
+
const protoDirname = path.dirname(localProto)
|
|
147
|
+
const protoFilename = path.basename(localProto, '.proto')
|
|
148
|
+
const protoFilenameSnake = snakeCase(protoFilename)
|
|
149
|
+
const protoFilenameSnakeImportAlies = doubleInnerUnderscores(protoFilenameSnake)
|
|
150
|
+
|
|
151
|
+
if (protoDirname === 'proto') {
|
|
152
|
+
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
153
|
+
const rootImportRegex = new RegExp( // nosemgrep: eslint.detect-non-literal-regexp
|
|
154
|
+
`^${escapeRegex(`import ${protoFilenameSnake}_pb2 as ${protoFilenameSnakeImportAlies}__pb2`)}`,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
replaceRules.push({
|
|
158
|
+
regex: rootImportRegex,
|
|
159
|
+
to: `from ${outputDir} import ${protoFilenameSnake}_pb2 as ${protoFilenameSnakeImportAlies}__pb2`,
|
|
160
|
+
})
|
|
161
|
+
}
|
|
162
|
+
|
|
136
163
|
for await (const line of handle.readLines()) {
|
|
137
164
|
const result = importRegex.exec(line)
|
|
138
165
|
const importPath = result?.groups?.path
|
|
@@ -143,6 +170,7 @@ async function replaceRulesTask(
|
|
|
143
170
|
|
|
144
171
|
const dirpath = path.dirname(importPath)
|
|
145
172
|
const fileName = path.basename(importPath, '.proto')
|
|
173
|
+
const fileNameSnake = snakeCase(fileName)
|
|
146
174
|
|
|
147
175
|
if (dirpath === '.') {
|
|
148
176
|
const depname = mapping[importPath]
|
|
@@ -152,9 +180,14 @@ async function replaceRulesTask(
|
|
|
152
180
|
continue
|
|
153
181
|
}
|
|
154
182
|
|
|
183
|
+
logger.log(`I'm looking for ${fileNameSnake} (${fileName}) to map as "import ${fileNameSnake}_pb2"`)
|
|
184
|
+
|
|
185
|
+
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
186
|
+
const flatImportRegex = new RegExp(`^${escapeRegex(`import ${fileNameSnake}_pb2`)}`) // nosemgrep: eslint.detect-non-literal-regexp
|
|
187
|
+
|
|
155
188
|
replaceRules.push({
|
|
156
|
-
|
|
157
|
-
to: `from ${depname} import ${
|
|
189
|
+
regex: flatImportRegex,
|
|
190
|
+
to: `from ${depname} import ${fileNameSnake}_pb2`,
|
|
158
191
|
})
|
|
159
192
|
} else {
|
|
160
193
|
const depname = mapping[importPath]
|
|
@@ -166,9 +199,14 @@ async function replaceRulesTask(
|
|
|
166
199
|
|
|
167
200
|
const importName = dirpath.replaceAll('/', '.')
|
|
168
201
|
|
|
202
|
+
logger.log(`I'm looking for ${fileNameSnake} (${fileName}) to map as "from ${importName} import ${fileNameSnake}_pb2"`)
|
|
203
|
+
|
|
204
|
+
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
205
|
+
const nestedImportRegex = new RegExp(`^${escapeRegex(`from ${importName} import ${fileNameSnake}_pb2`)}`) // nosemgrep: eslint.detect-non-literal-regexp
|
|
206
|
+
|
|
169
207
|
replaceRules.push({
|
|
170
|
-
|
|
171
|
-
to: `from ${depname}.${importName} import ${
|
|
208
|
+
regex: nestedImportRegex,
|
|
209
|
+
to: `from ${depname}.${importName} import ${fileNameSnake}_pb2`,
|
|
172
210
|
})
|
|
173
211
|
}
|
|
174
212
|
}
|
|
@@ -181,7 +219,7 @@ async function replaceRulesTask(
|
|
|
181
219
|
return replaceRules
|
|
182
220
|
}
|
|
183
221
|
|
|
184
|
-
async function fileMapper(generatedFile: string, replaceRules: {
|
|
222
|
+
async function fileMapper(generatedFile: string, replaceRules: { regex: RegExp; to: string }[], logger: Logger): Promise<void> {
|
|
185
223
|
let handle: fsPromises.FileHandle | undefined
|
|
186
224
|
let wstream: WriteStream | undefined
|
|
187
225
|
let isOk = false
|
|
@@ -193,7 +231,7 @@ async function fileMapper(generatedFile: string, replaceRules: { from: string; t
|
|
|
193
231
|
for await (const line of handle.readLines()) {
|
|
194
232
|
let mutableLine = line
|
|
195
233
|
for (const rule of replaceRules) {
|
|
196
|
-
mutableLine = mutableLine.replace(rule.
|
|
234
|
+
mutableLine = mutableLine.replace(rule.regex, rule.to)
|
|
197
235
|
}
|
|
198
236
|
|
|
199
237
|
const writeOk = wstream.write(mutableLine + '\n')
|