Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion cloudapi
Submodule cloudapi updated 630 files
89 changes: 50 additions & 39 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 16 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
"grpc-tools": "^1.12.4",
"husky": "^7.0.4",
"jest": "^27.4.5",
"prettier": "^3.8.3",
"semantic-release": "^21.0.1",
"ts-jest": "^27.1.1",
"ts-node": "^10.9.2",
Expand Down Expand Up @@ -127,6 +128,8 @@
"./backup-v1/*": "./dist/generated/yandex/cloud/backup/v1/*.js",
"./baremetal-v1alpha": "./dist/clients/baremetal-v1alpha/index.js",
"./baremetal-v1alpha/*": "./dist/generated/yandex/cloud/baremetal/v1alpha/*.js",
"./billing-usage_records-v1": "./dist/clients/billing-usage_records-v1/index.js",
"./billing-usage_records-v1/*": "./dist/generated/yandex/cloud/billing/usage_records/v1/*.js",
"./billing-v1": "./dist/clients/billing-v1/index.js",
"./billing-v1/*": "./dist/generated/yandex/cloud/billing/v1/*.js",
"./cdn-v1": "./dist/clients/cdn-v1/index.js",
Expand All @@ -145,8 +148,12 @@
"./cloudrouter-v1/*": "./dist/generated/yandex/cloud/cloudrouter/v1/*.js",
"./compute-v1": "./dist/clients/compute-v1/index.js",
"./compute-v1/*": "./dist/generated/yandex/cloud/compute/v1/*.js",
"./connectionmanager-v1": "./dist/clients/connectionmanager-v1/index.js",
"./connectionmanager-v1/*": "./dist/generated/yandex/cloud/connectionmanager/v1/*.js",
"./containerregistry-v1": "./dist/clients/containerregistry-v1/index.js",
"./containerregistry-v1/*": "./dist/generated/yandex/cloud/containerregistry/v1/*.js",
"./datacatalog-v1": "./dist/clients/datacatalog-v1/index.js",
"./datacatalog-v1/*": "./dist/generated/yandex/cloud/datacatalog/v1/*.js",
"./dataproc-manager-v1": "./dist/clients/dataproc-manager-v1/index.js",
"./dataproc-manager-v1/*": "./dist/generated/yandex/cloud/dataproc/manager/v1/*.js",
"./dataproc-v1": "./dist/clients/dataproc-v1/index.js",
Expand All @@ -157,6 +164,8 @@
"./datasphere-v2/*": "./dist/generated/yandex/cloud/datasphere/v2/*.js",
"./datatransfer-v1": "./dist/clients/datatransfer-v1/index.js",
"./datatransfer-v1/*": "./dist/generated/yandex/cloud/datatransfer/v1/*.js",
"./devtools-ycvc-v1": "./dist/clients/devtools-ycvc-v1/index.js",
"./devtools-ycvc-v1/*": "./dist/generated/yandex/cloud/devtools/ycvc/v1/*.js",
"./dist/*": "./dist/*.js",
"./dns-v1": "./dist/clients/dns-v1/index.js",
"./dns-v1/*": "./dist/generated/yandex/cloud/dns/v1/*.js",
Expand Down Expand Up @@ -195,6 +204,8 @@
"./marketplace-metering-v1/*": "./dist/generated/yandex/cloud/marketplace/metering/v1/*.js",
"./marketplace-pim-v1": "./dist/clients/marketplace-pim-v1/index.js",
"./marketplace-pim-v1/*": "./dist/generated/yandex/cloud/marketplace/pim/v1/*.js",
"./marketplace-stacklandlicenseapi-v1": "./dist/clients/marketplace-stacklandlicenseapi-v1/index.js",
"./marketplace-stacklandlicenseapi-v1/*": "./dist/generated/yandex/cloud/marketplace/stacklandlicenseapi/v1/*.js",
"./marketplace-v1": "./dist/clients/marketplace-v1/index.js",
"./marketplace-v1/*": "./dist/generated/yandex/cloud/marketplace/v1/*.js",
"./mdb-clickhouse-v1": "./dist/clients/mdb-clickhouse-v1/index.js",
Expand Down Expand Up @@ -246,6 +257,8 @@
"./serverless-eventrouter-v1/*": "./dist/generated/yandex/cloud/serverless/eventrouter/v1/*.js",
"./serverless-functions-v1": "./dist/clients/serverless-functions-v1/index.js",
"./serverless-functions-v1/*": "./dist/generated/yandex/cloud/serverless/functions/v1/*.js",
"./serverless-mcpgateway-v1": "./dist/clients/serverless-mcpgateway-v1/index.js",
"./serverless-mcpgateway-v1/*": "./dist/generated/yandex/cloud/serverless/mcpgateway/v1/*.js",
"./serverless-mdbproxy-v1": "./dist/clients/serverless-mdbproxy-v1/index.js",
"./serverless-mdbproxy-v1/*": "./dist/generated/yandex/cloud/serverless/mdbproxy/v1/*.js",
"./serverless-triggers-v1": "./dist/clients/serverless-triggers-v1/index.js",
Expand All @@ -269,6 +282,8 @@
"./vpc-v1": "./dist/clients/vpc-v1/index.js",
"./vpc-v1/*": "./dist/generated/yandex/cloud/vpc/v1/*.js",
"./ydb-v1": "./dist/clients/ydb-v1/index.js",
"./ydb-v1/*": "./dist/generated/yandex/cloud/ydb/v1/*.js"
"./ydb-v1/*": "./dist/generated/yandex/cloud/ydb/v1/*.js",
"./ytsaurus-v1": "./dist/clients/ytsaurus-v1/index.js",
"./ytsaurus-v1/*": "./dist/generated/yandex/cloud/ytsaurus/v1/*.js"
}
}
94 changes: 94 additions & 0 deletions scripts/generate_services/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,98 @@ const generateCloudApi = (protoFiles: string[]) => {
return exec(command);
};

/**
* Workaround for TS7056 ("inferred type exceeds the maximum length the
* compiler will serialize") on large ts-proto helper objects. Adds an explicit
* type annotation to every `export const X = { encode, decode, fromJSON,
* toJSON, fromPartial }` so TS emits the annotation into .d.ts instead of the
* giant inferred object literal type.
*
* Only annotates helpers that contain EXACTLY the five standard ts-proto
* methods — consts with extras (e.g. `wrap`/`unwrap` on well-known types like
* `google.protobuf.Struct`/`Value`/`ListValue`) are left untouched, since a
* rigid annotation would reject those extra members. Such helpers are small
* enough not to trigger TS7056 anyway.
*
* Idempotent: after the rewrite the original `export const X = {` opener no
* longer matches (it becomes `export const X: { ... } = {`).
*/
const annotateHelperConsts = () => {
const GENERATED_CODE_DIR = PATH.resolve('./src/generated');
const files = fg.sync('**/*.ts', { cwd: GENERATED_CODE_DIR, absolute: true });

const STANDARD_METHODS = ['encode', 'decode', 'fromJSON', 'toJSON', 'fromPartial'];
const START_RE = /^export const (\w+) = \{$/;
// Top-level property of a ts-proto helper: 4-space indent + identifier
// followed by `(` (regular method) or `<` (generic method e.g.
// `fromPartial<I extends ...>(...)`).
const PROP_RE = /^ {4}(\w+)[<(]/;
const END_LINE = '};';

for (const file of files) {
const content = fs.readFileSync(file, 'utf8');
const lines = content.split('\n');
const out: string[] = [];
let modified = false;
let i = 0;

while (i < lines.length) {
const m = START_RE.exec(lines[i]);
if (!m) {
out.push(lines[i]);
i += 1;
continue;
}

const name = m[1];

// Find the matching `};` at column 0 (end of the top-level const).
let j = i + 1;
while (j < lines.length && lines[j] !== END_LINE) j += 1;
if (j >= lines.length) {
out.push(lines[i]);
i += 1;
continue;
}

const body = lines.slice(i + 1, j);
const methods = new Set<string>();
for (const line of body) {
const pm = PROP_RE.exec(line);
if (pm) methods.add(pm[1]);
}

const isStandard =
methods.size === STANDARD_METHODS.length &&
STANDARD_METHODS.every((s) => methods.has(s));

if (!isStandard) {
out.push(lines[i]);
i += 1;
continue;
}

out.push(
`export const ${name}: {`,
` encode(message: ${name}, writer?: _m0.Writer): _m0.Writer;`,
` decode(input: _m0.Reader | Uint8Array, length?: number): ${name};`,
` fromJSON(object: any): ${name};`,
` toJSON(message: ${name}): unknown;`,
` fromPartial<I extends Exact<DeepPartial<${name}>, I>>(object: I): ${name};`,
`} = {`,
);
out.push(...body);
out.push(END_LINE);
modified = true;
i = j + 1;
}

if (modified) {
fs.writeFileSync(file, out.join('\n'), 'utf8');
}
}
};

const generateClient = async (dir: string) => {
const target = PATH.join(YANDEX_CLOUD_DIR, dir);

Expand Down Expand Up @@ -178,6 +270,8 @@ const main = async () => {

await Promise.all([generateCloudApi(protoFiles), generateServiceEndpointsMap()]);

annotateHelperConsts();

const clientPromiseList = Object.keys(serviceMap).map(generateClient);
const serviceDirList = await Promise.all(clientPromiseList);
serviceDirList.sort();
Expand Down
Loading
Loading