Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
f6cb0e5
chore!: migrate to Node 18
feywind Apr 14, 2025
fc14469
chore: linter fix pass
feywind Apr 14, 2025
a51815c
chore: remove accidentally added file
feywind Apr 14, 2025
36e8a59
samples: fix linting and typelessing of samples
feywind Apr 14, 2025
a285b67
build: remove typeless bot stuff from owlbot.py
feywind Apr 14, 2025
d229eb5
feat: fix a bunch of linter errors, and import new gapic classes
feywind Apr 15, 2025
447a1bf
fix: revert some of the promise fixes
feywind Apr 15, 2025
7345943
tests: fix various test issues caused by version upgrades
feywind Apr 16, 2025
2175e59
chore: linter fixes
feywind Apr 16, 2025
9abec70
chore: try to bypass linting on TS samples for now
feywind Apr 22, 2025
846e774
build: try updating lint and samples scripts
feywind Apr 22, 2025
dfb6700
build: two owlbot related updates
feywind Apr 22, 2025
9473828
🦉 Updates from OwlBot post-processor
gcf-owl-bot[bot] Apr 22, 2025
39fdd86
build: revert execa to dodge esm for now
feywind Apr 22, 2025
4ad0fcc
chore: merge branch 'node18' of https://github.com/googleapis/nodejs-…
feywind Apr 22, 2025
0e1386d
chore: also revert execa import for older version
feywind Apr 22, 2025
c47aa5a
chore: update execa reference once more
feywind Apr 22, 2025
12e94df
chore!: remove legacy otel support
feywind Apr 22, 2025
87f018c
feat!: remove legacy ack deadline parameters, and move maxExtension i…
feywind Apr 25, 2025
c26968d
build: further revert execa's version
feywind Apr 25, 2025
dff39d3
build: more execa adjustments
feywind Apr 25, 2025
2e78049
feat: time to say goodbye to some more old OTel cruft
feywind Apr 25, 2025
d5eddda
tests: this will be the day ... that tsc starts paying attention to @…
feywind Apr 25, 2025
3fa8dda
chore: revert package.json version changes so release-please can do it
feywind Apr 28, 2025
e5f4afc
🦉 Updates from OwlBot post-processor
gcf-owl-bot[bot] Apr 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ docs/
protos/
system-test/
samples/generated/
samples/typescript/
5 changes: 2 additions & 3 deletions .github/.OwlBot.lock.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright 2024 Google LLC
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand All @@ -13,5 +13,4 @@
# limitations under the License.
docker:
image: gcr.io/cloud-devrel-public-resources/owlbot-nodejs:latest
digest: sha256:609822e3c09b7a1bd90b99655904609f162cc15acb4704f1edf778284c36f429
# created: 2024-10-01T19:34:30.797530443Z
digest: sha256:c7e4968cfc97a204a4b2381f3ecb55cabc40c4cccf88b1ef8bef0d976be87fee
1 change: 1 addition & 0 deletions .github/release-trigger.yml
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
enabled: true
multiScmName: nodejs-pubsub
41 changes: 29 additions & 12 deletions .github/scripts/close-invalid-link.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,26 @@
// See the License for the specific language governing permissions and
// limitations under the License.

const fs = require('fs');
const yaml = require('js-yaml');
const path = require('path');
const TEMPLATE_FILE_PATH = path.resolve(__dirname, '../ISSUE_TEMPLATE/bug_report.yml')

async function closeIssue(github, owner, repo, number) {
await github.rest.issues.createComment({
owner: owner,
repo: repo,
issue_number: number,
body: 'Issue was opened with an invalid reproduction link. Please make sure the repository is a valid, publicly-accessible github repository, and make sure the url is complete (example: https://github.com/googleapis/google-cloud-node)'
body: "Issue was opened with an invalid reproduction link. Please make sure the repository is a valid, publicly-accessible github repository, and make sure the url is complete (example: https://github.com/googleapis/google-cloud-node)"
});
await github.rest.issues.update({
owner: owner,
repo: repo,
issue_number: number,
state: 'closed'
state: "closed"
});
}
module.exports = async ({github, context}) => {
module.exports = async ({ github, context }) => {
const owner = context.repo.owner;
const repo = context.repo.repo;
const number = context.issue.number;
Expand All @@ -37,20 +42,32 @@ module.exports = async ({github, context}) => {
issue_number: number,
});

const isBugTemplate = issue.data.body.includes('Link to the code that reproduces this issue');
const yamlData = fs.readFileSync(TEMPLATE_FILE_PATH, 'utf8');
const obj = yaml.load(yamlData);
const linkMatchingText = (obj.body.find(x => {return x.type === 'input' && x.validations.required === true && x.attributes.label.includes('link')})).attributes.label;
const isBugTemplate = issue.data.body.includes(linkMatchingText);

if (isBugTemplate) {
console.log(`Issue ${number} is a bug template`)
try {
const link = issue.data.body.split('\n')[18].match(/(https?:\/\/(gist\.)?github.com\/.*)/)[0];
console.log(`Issue ${number} contains this link: ${link}`)
const isValidLink = (await fetch(link)).ok;
console.log(`Issue ${number} has a ${isValidLink ? 'valid' : 'invalid'} link`)
if (!isValidLink) {
await closeIssue(github, owner, repo, number);
}
const text = issue.data.body;
const match = text.indexOf(linkMatchingText);
if (match !== -1) {
const nextLineIndex = text.indexOf('http', match);
if (nextLineIndex == -1) {
await closeIssue(github, owner, repo, number);
return;
}
const link = text.substring(nextLineIndex, text.indexOf('\n', nextLineIndex));
console.log(`Issue ${number} contains this link: ${link}`);
const isValidLink = (await fetch(link)).ok;
console.log(`Issue ${number} has a ${isValidLink ? "valid" : "invalid"} link`)
if (!isValidLink) {
await closeIssue(github, owner, repo, number);
}
}
} catch (err) {
await closeIssue(github, owner, repo, number);
}
}
};
};
108 changes: 54 additions & 54 deletions .github/scripts/close-unresponsive.cjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2024 Google LLC
/// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand All @@ -13,57 +13,57 @@
// limitations under the License.

function labeledEvent(data) {
return data.event === 'labeled' && data.label.name === 'needs more info';
}

const numberOfDaysLimit = 15;
const close_message = `This has been closed since a request for information has \
not been answered for ${numberOfDaysLimit} days. It can be reopened when the \
requested information is provided.`;

module.exports = async ({github, context}) => {
const owner = context.repo.owner;
const repo = context.repo.repo;

const issues = await github.rest.issues.listForRepo({
owner: owner,
repo: repo,
labels: 'needs more info',
});
const numbers = issues.data.map((e) => e.number);

for (const number of numbers) {
const events = await github.paginate(
github.rest.issues.listEventsForTimeline,
{
owner: owner,
repo: repo,
issue_number: number,
},
(response) => response.data.filter(labeledEvent)
);

const latest_response_label = events[events.length - 1];

const created_at = new Date(latest_response_label.created_at);
const now = new Date();
const diff = now - created_at;
const diffDays = diff / (1000 * 60 * 60 * 24);

if (diffDays > numberOfDaysLimit) {
await github.rest.issues.update({
owner: owner,
repo: repo,
issue_number: number,
state: 'closed',
});

await github.rest.issues.createComment({
owner: owner,
repo: repo,
issue_number: number,
body: close_message,
});
}
return data.event === "labeled" && data.label.name === "needs more info";
}

const numberOfDaysLimit = 15;
const close_message = `This has been closed since a request for information has \
not been answered for ${numberOfDaysLimit} days. It can be reopened when the \
requested information is provided.`;

module.exports = async ({ github, context }) => {
const owner = context.repo.owner;
const repo = context.repo.repo;

const issues = await github.rest.issues.listForRepo({
owner: owner,
repo: repo,
labels: "needs more info",
});
const numbers = issues.data.map((e) => e.number);

for (const number of numbers) {
const events = await github.paginate(
github.rest.issues.listEventsForTimeline,
{
owner: owner,
repo: repo,
issue_number: number,
},
(response) => response.data.filter(labeledEvent)
);

const latest_response_label = events[events.length - 1];

const created_at = new Date(latest_response_label.created_at);
const now = new Date();
const diff = now - created_at;
const diffDays = diff / (1000 * 60 * 60 * 24);

if (diffDays > numberOfDaysLimit) {
await github.rest.issues.update({
owner: owner,
repo: repo,
issue_number: number,
state: "closed",
});

await github.rest.issues.createComment({
owner: owner,
repo: repo,
issue_number: number,
body: close_message,
});
}
};
}
};
50 changes: 50 additions & 0 deletions .github/scripts/fixtures/invalidIssueBody.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
### Please make sure you have searched for information in the following guides.

- [X] Search the issues already opened: https://github.com/GoogleCloudPlatform/google-cloud-node/issues
- [X] Search StackOverflow: http://stackoverflow.com/questions/tagged/google-cloud-platform+node.js
- [X] Check our Troubleshooting guide: https://googlecloudplatform.github.io/google-cloud-node/#/docs/guides/troubleshooting
- [X] Check our FAQ: https://googlecloudplatform.github.io/google-cloud-node/#/docs/guides/faq
- [X] Check our libraries HOW-TO: https://github.com/googleapis/gax-nodejs/blob/main/client-libraries.md
- [X] Check out our authentication guide: https://github.com/googleapis/google-auth-library-nodejs
- [X] Check out handwritten samples for many of our APIs: https://github.com/GoogleCloudPlatform/nodejs-docs-samples

### A screenshot that you have tested with "Try this API".


N/A

### Link to the code that reproduces this issue. A link to a **public** Github Repository or gist with a minimal reproduction.

not-a-link

### A step-by-step description of how to reproduce the issue, based on the linked reproduction.


Change MY_PROJECT to your project name, add credentials if needed and run.

### A clear and concise description of what the bug is, and what you expected to happen.

The application crashes with the following exception (which there is no way to catch). It should just emit error, and allow graceful handling.
TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be of type string or an instance of Buffer or Uint8Array. Received an instance of Object
at _write (node:internal/streams/writable:474:13)
at Writable.write (node:internal/streams/writable:502:10)
at Duplexify._write (/project/node_modules/duplexify/index.js:212:22)
at doWrite (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:390:139)
at writeOrBuffer (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:381:5)
at Writable.write (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:302:11)
at Pumpify.<anonymous> (/project/node_modules/@google-cloud/speech/build/src/helpers.js:79:27)
at Object.onceWrapper (node:events:633:26)
at Pumpify.emit (node:events:518:28)
at obj.<computed> [as _write] (/project/node_modules/stubs/index.js:28:22)
at doWrite (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:390:139)
at writeOrBuffer (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:381:5)
at Writable.write (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:302:11)
at PassThrough.ondata (node:internal/streams/readable:1007:22)
at PassThrough.emit (node:events:518:28)
at addChunk (node:internal/streams/readable:559:12) {
code: 'ERR_INVALID_ARG_TYPE'


### A clear and concise description WHY you expect this behavior, i.e., was it a recent change, there is documentation that points to this behavior, etc. **

No library should crash an application this way.
50 changes: 50 additions & 0 deletions .github/scripts/fixtures/validIssueBody.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
### Please make sure you have searched for information in the following guides.

- [X] Search the issues already opened: https://github.com/GoogleCloudPlatform/google-cloud-node/issues
- [X] Search StackOverflow: http://stackoverflow.com/questions/tagged/google-cloud-platform+node.js
- [X] Check our Troubleshooting guide: https://googlecloudplatform.github.io/google-cloud-node/#/docs/guides/troubleshooting
- [X] Check our FAQ: https://googlecloudplatform.github.io/google-cloud-node/#/docs/guides/faq
- [X] Check our libraries HOW-TO: https://github.com/googleapis/gax-nodejs/blob/main/client-libraries.md
- [X] Check out our authentication guide: https://github.com/googleapis/google-auth-library-nodejs
- [X] Check out handwritten samples for many of our APIs: https://github.com/GoogleCloudPlatform/nodejs-docs-samples

### A screenshot that you have tested with "Try this API".


N/A

### Link to the code that reproduces this issue. A link to a **public** Github Repository or gist with a minimal reproduction.

https://gist.github.com/orgads/13cbf44c91923da27d8772b5f10489c9

### A step-by-step description of how to reproduce the issue, based on the linked reproduction.


Change MY_PROJECT to your project name, add credentials if needed and run.

### A clear and concise description of what the bug is, and what you expected to happen.

The application crashes with the following exception (which there is no way to catch). It should just emit error, and allow graceful handling.
TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be of type string or an instance of Buffer or Uint8Array. Received an instance of Object
at _write (node:internal/streams/writable:474:13)
at Writable.write (node:internal/streams/writable:502:10)
at Duplexify._write (/project/node_modules/duplexify/index.js:212:22)
at doWrite (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:390:139)
at writeOrBuffer (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:381:5)
at Writable.write (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:302:11)
at Pumpify.<anonymous> (/project/node_modules/@google-cloud/speech/build/src/helpers.js:79:27)
at Object.onceWrapper (node:events:633:26)
at Pumpify.emit (node:events:518:28)
at obj.<computed> [as _write] (/project/node_modules/stubs/index.js:28:22)
at doWrite (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:390:139)
at writeOrBuffer (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:381:5)
at Writable.write (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:302:11)
at PassThrough.ondata (node:internal/streams/readable:1007:22)
at PassThrough.emit (node:events:518:28)
at addChunk (node:internal/streams/readable:559:12) {
code: 'ERR_INVALID_ARG_TYPE'


### A clear and concise description WHY you expect this behavior, i.e., was it a recent change, there is documentation that points to this behavior, etc. **

No library should crash an application this way.
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
### Please make sure you have searched for information in the following guides.

- [X] Search the issues already opened: https://github.com/GoogleCloudPlatform/google-cloud-node/issues
- [X] Search StackOverflow: http://stackoverflow.com/questions/tagged/google-cloud-platform+node.js
- [X] Check our Troubleshooting guide: https://googlecloudplatform.github.io/google-cloud-node/#/docs/guides/troubleshooting
- [X] Check our FAQ: https://googlecloudplatform.github.io/google-cloud-node/#/docs/guides/faq
- [X] Check our libraries HOW-TO: https://github.com/googleapis/gax-nodejs/blob/main/client-libraries.md
- [X] Check out our authentication guide: https://github.com/googleapis/google-auth-library-nodejs
- [X] Check out handwritten samples for many of our APIs: https://github.com/GoogleCloudPlatform/nodejs-docs-samples

### A screenshot that you have tested with "Try this API".


N/A

### A step-by-step description of how to reproduce the issue, based on the linked reproduction.


Change MY_PROJECT to your project name, add credentials if needed and run.

### A clear and concise description of what the bug is, and what you expected to happen.

The application crashes with the following exception (which there is no way to catch). It should just emit error, and allow graceful handling.
TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be of type string or an instance of Buffer or Uint8Array. Received an instance of Object
at _write (node:internal/streams/writable:474:13)
at Writable.write (node:internal/streams/writable:502:10)
at Duplexify._write (/project/node_modules/duplexify/index.js:212:22)
at doWrite (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:390:139)
at writeOrBuffer (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:381:5)
at Writable.write (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:302:11)
at Pumpify.<anonymous> (/project/node_modules/@google-cloud/speech/build/src/helpers.js:79:27)
at Object.onceWrapper (node:events:633:26)
at Pumpify.emit (node:events:518:28)
at obj.<computed> [as _write] (/project/node_modules/stubs/index.js:28:22)
at doWrite (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:390:139)
at writeOrBuffer (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:381:5)
at Writable.write (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:302:11)
at PassThrough.ondata (node:internal/streams/readable:1007:22)
at PassThrough.emit (node:events:518:28)
at addChunk (node:internal/streams/readable:559:12) {
code: 'ERR_INVALID_ARG_TYPE'

### Link to the code that reproduces this issue. A link to a **public** Github Repository with a minimal reproduction.


https://gist.github.com/orgads/13cbf44c91923da27d8772b5f10489c9

### A clear and concise description WHY you expect this behavior, i.e., was it a recent change, there is documentation that points to this behavior, etc. **

No library should crash an application this way.
21 changes: 21 additions & 0 deletions .github/scripts/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "tests",
"private": true,
"description": "tests for script",
"scripts": {
"test": "mocha tests/close-invalid-link.test.cjs && mocha tests/close-or-remove-response-label.test.cjs"
},
"author": "Google Inc.",
"license": "Apache-2.0",
"engines": {
"node": ">=18"
},
"dependencies": {
"js-yaml": "^4.1.0"
},
"devDependencies": {
"@octokit/rest": "^19.0.0",
"mocha": "^10.0.0",
"sinon": "^18.0.0"
}
}
Loading