From 112db838ac4e672302ea2b1b4c81f1e4958d4d00 Mon Sep 17 00:00:00 2001 From: Joel Hendrix Date: Thu, 5 Oct 2023 12:25:44 -0700 Subject: [PATCH] Azcore v1.8.0 (#21694) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Release] sdk/resourcemanager/batch/armbatch/2.0.0 generation from spec commit: 310a0100f5b020c1900c527a6aa70d21992f078a (#21111) * [Release] sdk/resourcemanager/network/armnetwork/4.0.0 (#21131) * [Release] sdk/resourcemanager/network/armnetwork/4.0.0 generation from spec commit: 9975d3476c05bcc6bd9535ad3dfb564e6a168fa5 * replace stable azcore * update live test and assets * [Release] sdk/resourcemanager/mobilenetwork/armmobilenetwork/3.0.0 (#21136) * [Release] sdk/resourcemanager/mobilenetwork/armmobilenetwork/3.0.0 generation from spec commit: c53808ba54beef57059371708f1fa6949a11a280 * regenerate * SAS creation fix when stored access policy is used (#21241) * [azblob][sas] Fix SignWithSharedKey if stored access policy is used @stotz89 (#21230) * [azblob][sas] Fix SignWithSharedKey if stored access policy is used * Adding test and changelog --------- Co-authored-by: Sourav Gupta * [azopenai] Move azopenai from `cognitiveservices/azopenai` to `ai/azopenai` (#21264) Part of the fix for #21260. - Moved the code (to preserve history) into `ai/azopenai` - Marked `cognitiveservices/azopenai`, prepping to release one last release to deprecate it. We still need to submit an issue to de-list `cognitiveservices/azopenai` but I believe this takes care of our end. * Update legacy azopenai yaml to add cognitiveservices suffix directive (#21269) * [azopenai] Update changelog to reflect new spot. (#21271) * Increment package version after release of ai/azopenai (#21272) * [internal] Extend telemetry test regexp (#21277) Regexp checks for major, minor and patch level, but fails with golang release candidate versions, as doesn't match regexp. Example: azsdk-go-azservicebus/v1.0.0 (go1.21rc3; linux) * [Storage] Lower Case Query Param Keys in String to Sign (#21262) * fixed string to sign issue * fixed test and added changelog * Auto-install and run standalone test proxy server per test package (#21168) * Auto-install and run standalone test proxy server per test package * Update recording tests to use standalone proxy * Simplify proxy binary switch statement * Add test proxy auto-install docs * Fix up recording test coverage * Add StopTestProxy note about go process handling * Proxy restore/race condition handling. Force ignore PROXY_MANUAL_START in internal tests * Fix recording readme error handling * [Release]sdk/resourcemanager/network/armnetwork/4.1.0-beta.1 (#21265) * sdk/resourcemanager/network/armnetwork/4.1.0-beta.1 * add fake_example_test.go * [Release] sdk/resourcemanager/containerservice/armcontainerservice/4.2.0-beta.1 (#21274) * [Release] sdk/resourcemanager/compute/armcompute/5.2.0-beta.1 (#21275) * [Release] sdk/resourcemanager/compute/armcompute/5.2.0-beta.1 * Update CHANGELOG.md * [Release] sdk/resourcemanager/sql/armsql/2.0.0-beta.1 (#21040) * [Release] sdk/resourcemanager/sql/armsql/2.0.0-beta.1 generation from spec commit: fba7ffa9cee6453e2a3cf8c857074a323252a12d * update release date * regenerated * regenerate * [azopenai] Rename the DeploymentID field to Deployment to match other Azure OpenAI packages (#21284) * Clean up constants in aztables (#21258) * Clean up constants in aztables Older versions of autorest implicitly sealed single-value enums, so enable the legacy behavior to avoid having to pass constant values. Updated the perf test to use the current version of aztables. * update perf test with renamed APIs * [azopenai] Enabling live testing (#21276) Adds in a ci.yml with live testing enabled and re-recordings since we moved to `ai` instead of `cognitiveservices`. * Make recording.proxyManualStartEnv private (#21288) * Sync eng/common directory with azure-sdk-tools for PR 6518 (#21200) * Bump test proxy version * move proxy transition-scripts folder to onboarding Co-authored-by: Bill Wert Co-authored-by: Scott Beddall * upgrade autorest extension version (#21293) * [azcore/azeventgrid] Remove json.RawMessage usage in the public API (#21282) * azcore: Removing the json.RawMessage dependency in the public API (it wasn't part of the signature (formally) but it was part of the returned type. * Consume new pre-release azcore in azeventgrid. * Sync eng/common directory with azure-sdk-tools for PR 6611 (#21295) * update dotnet dev cert being shipped with the proxy to renew for another year --------- Co-authored-by: Scott Beddall * Improve example for runtime.WithCaptureResponse (#21302) * Improve example for runtime.WithCaptureResponse * make linter happy * fix sentence * Don't swallow error on Close() (#21304) Return the result of reader.Close() to the caller. * update azadmin test (#21305) * [azopenai] Make sure we defer close the eventreader in our examples. (#21312) * prep for release (#21316) * Major version upgrade when processing fake (#21285) * add replaceFakeImport function * generic func * remove breakingchange judgment * fix * generator tool fix (#21320) * generator tool fix * fix README.md.tpl * Increment package version after release of monitor/azingest (#21208) * bump the proxy version (#21322) Co-authored-by: Scott Beddall * Prepare azidentity v1.4.0-beta.3 for release (#21331) * Increment package version after release of azidentity (#21337) * [azopenai] If the scanner reaches the end of stream and we haven't gotten the '[done]' token then return an error instead of silently failing. (#21323) Also: - Fixing casing of error message - shouldn't have a leading uppercase letter. - Fixing misspelled comment * add onboard judgment (#21341) * Used ScheduledPurgeDate for both KV, MHSM (#21344) The previous property was calculated so didn't exist from the REST-based call. Also updated the api-version to the latest stable control plane version. Co-authored-by: Heath Stewart * Increase azidentity test coverage (#21345) * [azopenai] Retract old congitiveservices/azopenai package. (#21350) This was the recommendation from the Go team on how to delist our old package from pkg.go.dev. * Include response body in IMDS 400 error message (#21351) * Add TokenRequestOptions.EnableCAE (#21362) * Prep azcore@v1.8.0-beta.2 for release (#21364) * Prep azcore@v1.8.0-beta.2 for release * remove empty section in readme * Update CODEOWNERS (#21366) Add @Azure/azure-sdk-write-identity as an owner of /sdk/azidentity * [azadmin] update test (#21369) * Fix typo in doc comment for the TokenFilePath field in workload_identity (#21353) * update date (#21370) * ARM bearer auth policy opts in to CAE (#21367) * Increment package version after release of azcore (#21371) * [azopenai] Add test for different formats in chat completions streaming (#21374) Also, updating CODEOWNERS to add @jhendrixMSFT to the ai folder. * Increment package version after release of security/keyvault/internal (#21375) * Update CODEOWNERS file for Monitor (#21377) * azblob: Upgrade to STG 85-86 (#21381) * Regenerating AzBlob to STG 85/86 (#20724) * Regenerating azblob to stg 85/86 * Updating CopyFromURL * minor change * minor fixes * undo some minor fixes * Updating Go code generator * Fixing calls to pipeline * Adding custom UnmarshalXML for BlobItem and BlobPrefix * Updating constructor method for AppendBlobClient * Updating Client constructors * Undoing minor fixes to blob examples * Fixing authpolicy * Updating azcore version * Fixing client strings * Const for service client * Minor fix * fixing go mod files * Shared constants client name * Addressing comments * [Feature STG 85/86] Cold Tier * [Checksum Work] BlockBlob Client: Transactional/Source Content Validation (#21033) * Adding test for transactional validation in block blob * StageBlockFromURL tests * Deprecating options in CommitBlockList * CopyFromURL test * Updating checksum behavior * Record tests * Updated recording * Updated recording again * Added error for user gen checksums, tests for UploadStream, UploadBuffer, and UploadFile * Added recorded test * Updated CommitBlockList, added tests for CommitBlockList, and added CRC64 test for Upload * Updating UploadStream test * Recorded test * Recorded test * Fixing CommitBlockList errors * Fixing linting issues * Addressing comment + handling CI issues * Removing TransactionalValidation from CommitBlockList + cleaning up tests * Rerecorded tests * Update azcore (#21188) * Updating azcore * Updating changelog.md * Updating go sum file * Update perf go file * Copy Blob from URL/Put Blob from URL copy source tags (#21128) * Regenerating AzBlob to STG 85/86 (#20724) * Regenerating azblob to stg 85/86 * Updating CopyFromURL * minor change * minor fixes * undo some minor fixes * Updating Go code generator * Fixing calls to pipeline * Adding custom UnmarshalXML for BlobItem and BlobPrefix * Updating constructor method for AppendBlobClient * Updating Client constructors * Undoing minor fixes to blob examples * Fixing authpolicy * Updating azcore version * Fixing client strings * Const for service client * Minor fix * fixing go mod files * Shared constants client name * Addressing comments * [Feature STG 85/86] Cold Tier (#21032) * Adding Cold Tier + tests * Recorded tests * Updated CHANGELOG.md * Fixing linting issues * Updating Cold tier test and recording * Addressing commits * Adding CopySourceBlobTags * Fixing enum variable name, adding default test, changelog update * Cleaning up constants * Moving const to constants.go * Small change * Adding PossibleBlobCopySourceTagsValues() Method for CopySourceTags * List System Containers (#21243) * Listing system containers * Updating CHANGELOG.md * Record test * Filter Tags API on Container (#21197) * Adding FilterBlobs to container client * Updating and adding tests * Updating URL Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> * Updating comment Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> * Updating CHANGELOG.md * Updating test --------- Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> * Encryption Scope SAS (#21294) * Adding encryption sas to blob, account, and identity sas * Fixing issues with Blob SAS * Undo some changes * Undo some changes pt 2 * Undo some changes pt 3 * Adding doc comment * Updating variable names in the tests and updated account sas test * Updating tests * Adding back comment * Updating CHANGELOG.md * Update sdk/storage/azblob/sas/query_params.go Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> * Update sdk/storage/azblob/CHANGELOG.md Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> * Removing SI from Account SAS --------- Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> * Test Encryption Scope support for Sync Blob Copy (SyncCopyFromUrl) (#21332) * Test List Blobs Fix for Invalid XML Characters * minor fixes to changelog --------- Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> * Upgrade azidentity dependencies (#21379) * Increment package version after release of azidentity (#21385) * AzDatalake Support (#21387) * [AzDatalake] Generated Layer + mod file (#20725) * first generation * removed pagination * cleanup spacing and add build file * doc fix * Merge main into datalake feature branch (#20833) * Enable gocritic during linting (#20715) Enabled gocritic's evalOrder to catch dependencies on undefined behavior on return statements. Updated to latest version of golangci-lint. Fixed issue in azblob flagged by latest linter. * Cosmos DB: Enable merge support (#20716) * Adding header and value * Wiring and tests * format * Fixing value * change log * [azservicebus, azeventhubs] Stress test and logging improvement (#20710) Logging improvements: * Updating the logging to print more tracing information (per-link) in prep for the bigger release coming up. * Trimming out some of the verbose logging, seeing if I can get it a bit more reasonable. Stress tests: * Add a timestamp to the log name we generate and also default to append, not overwrite. * Use 0.5 cores, 0.5GB as our baseline. Some pods use more and I'll tune them more later. * update proxy version (#20712) Co-authored-by: Scott Beddall * Return an error when you try to send a message that's too large. (#20721) This now works just like the message batch - you'll get an ErrMessageTooLarge if you attempt to send a message that's too large for the link's configured size. NOTE: there's a patch to `internal/go-amqp/Sender.go` to match what's in go-amqp's main so it returns a programmatically useful error when the message is too large. Fixes #20647 * Changes in test that is failing in pipeline (#20693) * [azservicebus, azeventhubs] Treat 'entity full' as a fatal error (#20722) When the remote entity is full we get a resource-limit-exceeded condition. This isn't something we should keep retrying on and it's best to just abort and let the user know immediately, rather than hoping it might eventually clear out. This affected both Event Hubs and Service Bus. Fixes #20647 * [azservicebus/azeventhubs] Redirect stderr and stdout to tee (#20726) * Update changelog with latest features (#20730) * Update changelog with latest features Prepare for upcoming release. * bump minor version * pass along the artifact name so we can override it later (#20732) Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> * [azeventhubs] Fixing checkpoint store race condition (#20727) The checkpoint store wasn't guarding against multiple owners claiming for the first time - fixing this by using IfNoneMatch Fixes #20717 * Fix azidentity troubleshooting guide link (#20736) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 (#20437) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 generation from spec commit: 85fb4ac6f8bfefd179e6c2632976a154b5c9ff04 * client factory * fix * fix * update * add sdk/resourcemanager/postgresql/armpostgresql live test (#20685) * add sdk/resourcemanager/postgresql/armpostgresql live test * update assets.json * set subscriptionId default value * format * add sdk/resourcemanager/eventhub/armeventhub live test (#20686) * add sdk/resourcemanager/eventhub/armeventhub live test * update assets * add sdk/resourcemanager/compute/armcompute live test (#20048) * add sdk/resourcemanager/compute/armcompute live test * skus filter * fix subscriptionId default value * fix * gofmt * update recording * sdk/resourcemanager/network/armnetwork live test (#20331) * sdk/resourcemanager/network/armnetwork live test * update subscriptionId default value * update recording * add sdk/resourcemanager/cosmos/armcosmos live test (#20705) * add sdk/resourcemanager/cosmos/armcosmos live test * update assets.json * update assets.json * update assets.json * update assets.json * Increment package version after release of azcore (#20740) * [azeventhubs] Improperly resetting etag in the checkpoint store (#20737) We shouldn't be resetting the etag to nil - it's what we use to enforce a "single winner" when doing ownership claims. The bug here was two-fold: I had bad logic in my previous claim ownership, which I fixed in a previous PR, but we need to reflect that same constraint properly in our in-memory checkpoint store for these tests. * Eng workflows sync and branch cleanup additions (#20743) Co-authored-by: James Suplizio * [azeventhubs] Latest start position can also be inclusive (ie, get the latest message) (#20744) * Update GitHubEventProcessor version and remove pull_request_review procesing (#20751) Co-authored-by: James Suplizio * Rename DisableAuthorityValidationAndInstanceDiscovery (#20746) * fix (#20707) * AzFile (#20739) * azfile: Fixing connection string parsing logic (#20798) * Fixing connection string parse logic * Update README * [azadmin] fix flaky test (#20758) * fix flaky test * charles suggestion * Prepare azidentity v1.3.0 for release (#20756) * Fix broken podman link (#20801) Co-authored-by: Wes Haggard * [azquery] update doc comments (#20755) * update doc comments * update statistics and visualization generation * prep-for-release * Fixed contribution section (#20752) Co-authored-by: Bob Tabor * [azeventhubs,azservicebus] Some API cleanup, renames (#20754) * Adding options to UpdateCheckpoint(), just for future potential expansion * Make Offset an int64, not a *int64 (it's not optional, it'll always come back with ReceivedEvents) * Adding more logging into the checkpoint store. * Point all imports at the production go-amqp * Add supporting features to enable distributed tracing (#20301) (#20708) * Add supporting features to enable distributed tracing This includes new internal pipeline policies and other supporting types. See the changelog for a full description. Added some missing doc comments. * fix linter issue * add net.peer.name trace attribute sequence custom HTTP header policy before logging policy. sequence logging policy after HTTP trace policy. keep body download policy at the end. * add span for iterating over pages * Restore ARM CAE support for azcore beta (#20657) This reverts commit 902097226ff3fe2fc6c3e7fc50d3478350253614. * Upgrade to stable azcore (#20808) * Increment package version after release of data/azcosmos (#20807) * Updating changelog (#20810) * Add fake package to azcore (#20711) * Add fake package to azcore This is the supporting infrastructure for the generated SDK fakes. * fix doc comment * Updating CHANGELOG.md (#20809) * changelog (#20811) * Increment package version after release of storage/azfile (#20813) * Update changelog (azblob) (#20815) * Updating CHANGELOG.md * Update the changelog with correct version * [azquery] migration guide (#20742) * migration guide * Charles feedback * Richard feedback --------- Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> * Increment package version after release of monitor/azquery (#20820) * [keyvault] prep for release (#20819) * prep for release * perf tests * update date --------- Co-authored-by: Joel Hendrix Co-authored-by: Matias Quaranta Co-authored-by: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Co-authored-by: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Co-authored-by: Scott Beddall Co-authored-by: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> Co-authored-by: Peng Jiahui <46921893+Alancere@users.noreply.github.com> Co-authored-by: James Suplizio Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> Co-authored-by: gracewilcox <43627800+gracewilcox@users.noreply.github.com> Co-authored-by: Wes Haggard Co-authored-by: Bob Tabor Co-authored-by: Bob Tabor * AzDatalake APIView (#20757) * Enable gocritic during linting (#20715) Enabled gocritic's evalOrder to catch dependencies on undefined behavior on return statements. Updated to latest version of golangci-lint. Fixed issue in azblob flagged by latest linter. * Cosmos DB: Enable merge support (#20716) * Adding header and value * Wiring and tests * format * Fixing value * change log * [azservicebus, azeventhubs] Stress test and logging improvement (#20710) Logging improvements: * Updating the logging to print more tracing information (per-link) in prep for the bigger release coming up. * Trimming out some of the verbose logging, seeing if I can get it a bit more reasonable. Stress tests: * Add a timestamp to the log name we generate and also default to append, not overwrite. * Use 0.5 cores, 0.5GB as our baseline. Some pods use more and I'll tune them more later. * update proxy version (#20712) Co-authored-by: Scott Beddall * Return an error when you try to send a message that's too large. (#20721) This now works just like the message batch - you'll get an ErrMessageTooLarge if you attempt to send a message that's too large for the link's configured size. NOTE: there's a patch to `internal/go-amqp/Sender.go` to match what's in go-amqp's main so it returns a programmatically useful error when the message is too large. Fixes #20647 * Changes in test that is failing in pipeline (#20693) * [azservicebus, azeventhubs] Treat 'entity full' as a fatal error (#20722) When the remote entity is full we get a resource-limit-exceeded condition. This isn't something we should keep retrying on and it's best to just abort and let the user know immediately, rather than hoping it might eventually clear out. This affected both Event Hubs and Service Bus. Fixes #20647 * [azservicebus/azeventhubs] Redirect stderr and stdout to tee (#20726) * Update changelog with latest features (#20730) * Update changelog with latest features Prepare for upcoming release. * bump minor version * pass along the artifact name so we can override it later (#20732) Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> * [azeventhubs] Fixing checkpoint store race condition (#20727) The checkpoint store wasn't guarding against multiple owners claiming for the first time - fixing this by using IfNoneMatch Fixes #20717 * Fix azidentity troubleshooting guide link (#20736) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 (#20437) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 generation from spec commit: 85fb4ac6f8bfefd179e6c2632976a154b5c9ff04 * client factory * fix * fix * update * add sdk/resourcemanager/postgresql/armpostgresql live test (#20685) * add sdk/resourcemanager/postgresql/armpostgresql live test * update assets.json * set subscriptionId default value * format * add sdk/resourcemanager/eventhub/armeventhub live test (#20686) * add sdk/resourcemanager/eventhub/armeventhub live test * update assets * add sdk/resourcemanager/compute/armcompute live test (#20048) * add sdk/resourcemanager/compute/armcompute live test * skus filter * fix subscriptionId default value * fix * gofmt * update recording * sdk/resourcemanager/network/armnetwork live test (#20331) * sdk/resourcemanager/network/armnetwork live test * update subscriptionId default value * update recording * add sdk/resourcemanager/cosmos/armcosmos live test (#20705) * add sdk/resourcemanager/cosmos/armcosmos live test * update assets.json * update assets.json * update assets.json * update assets.json * Increment package version after release of azcore (#20740) * [azeventhubs] Improperly resetting etag in the checkpoint store (#20737) We shouldn't be resetting the etag to nil - it's what we use to enforce a "single winner" when doing ownership claims. The bug here was two-fold: I had bad logic in my previous claim ownership, which I fixed in a previous PR, but we need to reflect that same constraint properly in our in-memory checkpoint store for these tests. * Eng workflows sync and branch cleanup additions (#20743) Co-authored-by: James Suplizio * [azeventhubs] Latest start position can also be inclusive (ie, get the latest message) (#20744) * Update GitHubEventProcessor version and remove pull_request_review procesing (#20751) Co-authored-by: James Suplizio * Rename DisableAuthorityValidationAndInstanceDiscovery (#20746) * added basic fs methods * corrections * fix (#20707) * AzFile (#20739) * azfile: Fixing connection string parsing logic (#20798) * Fixing connection string parse logic * Update README * [azadmin] fix flaky test (#20758) * fix flaky test * charles suggestion * Prepare azidentity v1.3.0 for release (#20756) * Fix broken podman link (#20801) Co-authored-by: Wes Haggard * [azquery] update doc comments (#20755) * update doc comments * update statistics and visualization generation * prep-for-release * Fixed contribution section (#20752) Co-authored-by: Bob Tabor * [azeventhubs,azservicebus] Some API cleanup, renames (#20754) * Adding options to UpdateCheckpoint(), just for future potential expansion * Make Offset an int64, not a *int64 (it's not optional, it'll always come back with ReceivedEvents) * Adding more logging into the checkpoint store. * Point all imports at the production go-amqp * Add supporting features to enable distributed tracing (#20301) (#20708) * Add supporting features to enable distributed tracing This includes new internal pipeline policies and other supporting types. See the changelog for a full description. Added some missing doc comments. * fix linter issue * add net.peer.name trace attribute sequence custom HTTP header policy before logging policy. sequence logging policy after HTTP trace policy. keep body download policy at the end. * add span for iterating over pages * Restore ARM CAE support for azcore beta (#20657) This reverts commit 902097226ff3fe2fc6c3e7fc50d3478350253614. * Upgrade to stable azcore (#20808) * Increment package version after release of data/azcosmos (#20807) * Updating changelog (#20810) * Add fake package to azcore (#20711) * Add fake package to azcore This is the supporting infrastructure for the generated SDK fakes. * fix doc comment * Updating CHANGELOG.md (#20809) * changelog (#20811) * Increment package version after release of storage/azfile (#20813) * Update changelog (azblob) (#20815) * Updating CHANGELOG.md * Update the changelog with correct version * [azquery] migration guide (#20742) * migration guide * Charles feedback * Richard feedback --------- Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> * Increment package version after release of monitor/azquery (#20820) * [keyvault] prep for release (#20819) * prep for release * perf tests * update date * more models * changed generated code and added more models * added client files * regenrated and added more models * file and dir clients setup * combined into one package * added listing methods * separated clients * added additional clients * clean up on path client * more cleanup * more models for file client * cleanup * regenerated using new autorest * more models for fs * cleanup imports * further cleanup * lease acc conditions fixes * lease acc conditions fixes * rename methods return type * added lease * cleanup * cleanup * cleanup * added go version * feedback and cleanup * feedback and cleanup * move path to internal and create common * moved access helpers to internal * make access conditions common * cleanup * handled feedback * cleanup * conn string parsing --------- Co-authored-by: Joel Hendrix Co-authored-by: Matias Quaranta Co-authored-by: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Co-authored-by: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Co-authored-by: Scott Beddall Co-authored-by: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> Co-authored-by: Peng Jiahui <46921893+Alancere@users.noreply.github.com> Co-authored-by: James Suplizio Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> Co-authored-by: gracewilcox <43627800+gracewilcox@users.noreply.github.com> Co-authored-by: Wes Haggard Co-authored-by: Bob Tabor Co-authored-by: Bob Tabor * [Datalake] SAS Support (#21019) * Enable gocritic during linting (#20715) Enabled gocritic's evalOrder to catch dependencies on undefined behavior on return statements. Updated to latest version of golangci-lint. Fixed issue in azblob flagged by latest linter. * Cosmos DB: Enable merge support (#20716) * Adding header and value * Wiring and tests * format * Fixing value * change log * [azservicebus, azeventhubs] Stress test and logging improvement (#20710) Logging improvements: * Updating the logging to print more tracing information (per-link) in prep for the bigger release coming up. * Trimming out some of the verbose logging, seeing if I can get it a bit more reasonable. Stress tests: * Add a timestamp to the log name we generate and also default to append, not overwrite. * Use 0.5 cores, 0.5GB as our baseline. Some pods use more and I'll tune them more later. * update proxy version (#20712) Co-authored-by: Scott Beddall * Return an error when you try to send a message that's too large. (#20721) This now works just like the message batch - you'll get an ErrMessageTooLarge if you attempt to send a message that's too large for the link's configured size. NOTE: there's a patch to `internal/go-amqp/Sender.go` to match what's in go-amqp's main so it returns a programmatically useful error when the message is too large. Fixes #20647 * Changes in test that is failing in pipeline (#20693) * [azservicebus, azeventhubs] Treat 'entity full' as a fatal error (#20722) When the remote entity is full we get a resource-limit-exceeded condition. This isn't something we should keep retrying on and it's best to just abort and let the user know immediately, rather than hoping it might eventually clear out. This affected both Event Hubs and Service Bus. Fixes #20647 * [azservicebus/azeventhubs] Redirect stderr and stdout to tee (#20726) * Update changelog with latest features (#20730) * Update changelog with latest features Prepare for upcoming release. * bump minor version * pass along the artifact name so we can override it later (#20732) Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> * [azeventhubs] Fixing checkpoint store race condition (#20727) The checkpoint store wasn't guarding against multiple owners claiming for the first time - fixing this by using IfNoneMatch Fixes #20717 * Fix azidentity troubleshooting guide link (#20736) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 (#20437) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 generation from spec commit: 85fb4ac6f8bfefd179e6c2632976a154b5c9ff04 * client factory * fix * fix * update * add sdk/resourcemanager/postgresql/armpostgresql live test (#20685) * add sdk/resourcemanager/postgresql/armpostgresql live test * update assets.json * set subscriptionId default value * format * add sdk/resourcemanager/eventhub/armeventhub live test (#20686) * add sdk/resourcemanager/eventhub/armeventhub live test * update assets * add sdk/resourcemanager/compute/armcompute live test (#20048) * add sdk/resourcemanager/compute/armcompute live test * skus filter * fix subscriptionId default value * fix * gofmt * update recording * sdk/resourcemanager/network/armnetwork live test (#20331) * sdk/resourcemanager/network/armnetwork live test * update subscriptionId default value * update recording * add sdk/resourcemanager/cosmos/armcosmos live test (#20705) * add sdk/resourcemanager/cosmos/armcosmos live test * update assets.json * update assets.json * update assets.json * update assets.json * Increment package version after release of azcore (#20740) * [azeventhubs] Improperly resetting etag in the checkpoint store (#20737) We shouldn't be resetting the etag to nil - it's what we use to enforce a "single winner" when doing ownership claims. The bug here was two-fold: I had bad logic in my previous claim ownership, which I fixed in a previous PR, but we need to reflect that same constraint properly in our in-memory checkpoint store for these tests. * Eng workflows sync and branch cleanup additions (#20743) Co-authored-by: James Suplizio * [azeventhubs] Latest start position can also be inclusive (ie, get the latest message) (#20744) * Update GitHubEventProcessor version and remove pull_request_review procesing (#20751) Co-authored-by: James Suplizio * Rename DisableAuthorityValidationAndInstanceDiscovery (#20746) * fix (#20707) * AzFile (#20739) * azfile: Fixing connection string parsing logic (#20798) * Fixing connection string parse logic * Update README * [azadmin] fix flaky test (#20758) * fix flaky test * charles suggestion * Prepare azidentity v1.3.0 for release (#20756) * Fix broken podman link (#20801) Co-authored-by: Wes Haggard * [azquery] update doc comments (#20755) * update doc comments * update statistics and visualization generation * prep-for-release * Fixed contribution section (#20752) Co-authored-by: Bob Tabor * [azeventhubs,azservicebus] Some API cleanup, renames (#20754) * Adding options to UpdateCheckpoint(), just for future potential expansion * Make Offset an int64, not a *int64 (it's not optional, it'll always come back with ReceivedEvents) * Adding more logging into the checkpoint store. * Point all imports at the production go-amqp * Add supporting features to enable distributed tracing (#20301) (#20708) * Add supporting features to enable distributed tracing This includes new internal pipeline policies and other supporting types. See the changelog for a full description. Added some missing doc comments. * fix linter issue * add net.peer.name trace attribute sequence custom HTTP header policy before logging policy. sequence logging policy after HTTP trace policy. keep body download policy at the end. * add span for iterating over pages * Restore ARM CAE support for azcore beta (#20657) This reverts commit 902097226ff3fe2fc6c3e7fc50d3478350253614. * Upgrade to stable azcore (#20808) * Increment package version after release of data/azcosmos (#20807) * Updating changelog (#20810) * Add fake package to azcore (#20711) * Add fake package to azcore This is the supporting infrastructure for the generated SDK fakes. * fix doc comment * Updating CHANGELOG.md (#20809) * changelog (#20811) * Increment package version after release of storage/azfile (#20813) * Update changelog (azblob) (#20815) * Updating CHANGELOG.md * Update the changelog with correct version * [azquery] migration guide (#20742) * migration guide * Charles feedback * Richard feedback --------- Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> * Increment package version after release of monitor/azquery (#20820) * [keyvault] prep for release (#20819) * prep for release * perf tests * update date * added sas support * small fix * query params fix * fix * added some tests * added more tests * resolved some comments * added encoding --------- Co-authored-by: Joel Hendrix Co-authored-by: Matias Quaranta Co-authored-by: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Co-authored-by: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Co-authored-by: Scott Beddall Co-authored-by: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> Co-authored-by: Peng Jiahui <46921893+Alancere@users.noreply.github.com> Co-authored-by: James Suplizio Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> Co-authored-by: gracewilcox <43627800+gracewilcox@users.noreply.github.com> Co-authored-by: Wes Haggard Co-authored-by: Bob Tabor Co-authored-by: Bob Tabor * [Datalake] Client Constructors (#21034) * Enable gocritic during linting (#20715) Enabled gocritic's evalOrder to catch dependencies on undefined behavior on return statements. Updated to latest version of golangci-lint. Fixed issue in azblob flagged by latest linter. * Cosmos DB: Enable merge support (#20716) * Adding header and value * Wiring and tests * format * Fixing value * change log * [azservicebus, azeventhubs] Stress test and logging improvement (#20710) Logging improvements: * Updating the logging to print more tracing information (per-link) in prep for the bigger release coming up. * Trimming out some of the verbose logging, seeing if I can get it a bit more reasonable. Stress tests: * Add a timestamp to the log name we generate and also default to append, not overwrite. * Use 0.5 cores, 0.5GB as our baseline. Some pods use more and I'll tune them more later. * update proxy version (#20712) Co-authored-by: Scott Beddall * Return an error when you try to send a message that's too large. (#20721) This now works just like the message batch - you'll get an ErrMessageTooLarge if you attempt to send a message that's too large for the link's configured size. NOTE: there's a patch to `internal/go-amqp/Sender.go` to match what's in go-amqp's main so it returns a programmatically useful error when the message is too large. Fixes #20647 * Changes in test that is failing in pipeline (#20693) * [azservicebus, azeventhubs] Treat 'entity full' as a fatal error (#20722) When the remote entity is full we get a resource-limit-exceeded condition. This isn't something we should keep retrying on and it's best to just abort and let the user know immediately, rather than hoping it might eventually clear out. This affected both Event Hubs and Service Bus. Fixes #20647 * [azservicebus/azeventhubs] Redirect stderr and stdout to tee (#20726) * Update changelog with latest features (#20730) * Update changelog with latest features Prepare for upcoming release. * bump minor version * pass along the artifact name so we can override it later (#20732) Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> * [azeventhubs] Fixing checkpoint store race condition (#20727) The checkpoint store wasn't guarding against multiple owners claiming for the first time - fixing this by using IfNoneMatch Fixes #20717 * Fix azidentity troubleshooting guide link (#20736) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 (#20437) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 generation from spec commit: 85fb4ac6f8bfefd179e6c2632976a154b5c9ff04 * client factory * fix * fix * update * add sdk/resourcemanager/postgresql/armpostgresql live test (#20685) * add sdk/resourcemanager/postgresql/armpostgresql live test * update assets.json * set subscriptionId default value * format * add sdk/resourcemanager/eventhub/armeventhub live test (#20686) * add sdk/resourcemanager/eventhub/armeventhub live test * update assets * add sdk/resourcemanager/compute/armcompute live test (#20048) * add sdk/resourcemanager/compute/armcompute live test * skus filter * fix subscriptionId default value * fix * gofmt * update recording * sdk/resourcemanager/network/armnetwork live test (#20331) * sdk/resourcemanager/network/armnetwork live test * update subscriptionId default value * update recording * add sdk/resourcemanager/cosmos/armcosmos live test (#20705) * add sdk/resourcemanager/cosmos/armcosmos live test * update assets.json * update assets.json * update assets.json * update assets.json * Increment package version after release of azcore (#20740) * [azeventhubs] Improperly resetting etag in the checkpoint store (#20737) We shouldn't be resetting the etag to nil - it's what we use to enforce a "single winner" when doing ownership claims. The bug here was two-fold: I had bad logic in my previous claim ownership, which I fixed in a previous PR, but we need to reflect that same constraint properly in our in-memory checkpoint store for these tests. * Eng workflows sync and branch cleanup additions (#20743) Co-authored-by: James Suplizio * [azeventhubs] Latest start position can also be inclusive (ie, get the latest message) (#20744) * Update GitHubEventProcessor version and remove pull_request_review procesing (#20751) Co-authored-by: James Suplizio * Rename DisableAuthorityValidationAndInstanceDiscovery (#20746) * fix (#20707) * AzFile (#20739) * azfile: Fixing connection string parsing logic (#20798) * Fixing connection string parse logic * Update README * [azadmin] fix flaky test (#20758) * fix flaky test * charles suggestion * Prepare azidentity v1.3.0 for release (#20756) * Fix broken podman link (#20801) Co-authored-by: Wes Haggard * [azquery] update doc comments (#20755) * update doc comments * update statistics and visualization generation * prep-for-release * Fixed contribution section (#20752) Co-authored-by: Bob Tabor * [azeventhubs,azservicebus] Some API cleanup, renames (#20754) * Adding options to UpdateCheckpoint(), just for future potential expansion * Make Offset an int64, not a *int64 (it's not optional, it'll always come back with ReceivedEvents) * Adding more logging into the checkpoint store. * Point all imports at the production go-amqp * Add supporting features to enable distributed tracing (#20301) (#20708) * Add supporting features to enable distributed tracing This includes new internal pipeline policies and other supporting types. See the changelog for a full description. Added some missing doc comments. * fix linter issue * add net.peer.name trace attribute sequence custom HTTP header policy before logging policy. sequence logging policy after HTTP trace policy. keep body download policy at the end. * add span for iterating over pages * Restore ARM CAE support for azcore beta (#20657) This reverts commit 902097226ff3fe2fc6c3e7fc50d3478350253614. * Upgrade to stable azcore (#20808) * Increment package version after release of data/azcosmos (#20807) * Updating changelog (#20810) * Add fake package to azcore (#20711) * Add fake package to azcore This is the supporting infrastructure for the generated SDK fakes. * fix doc comment * Updating CHANGELOG.md (#20809) * changelog (#20811) * Increment package version after release of storage/azfile (#20813) * Update changelog (azblob) (#20815) * Updating CHANGELOG.md * Update the changelog with correct version * [azquery] migration guide (#20742) * migration guide * Charles feedback * Richard feedback --------- Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> * Increment package version after release of monitor/azquery (#20820) * [keyvault] prep for release (#20819) * prep for release * perf tests * update date * added sas support * small fix * query params fix * fix * added some tests * added more tests * resolved some comments * added encoding * added constructors * cleanup * cleanup * gmt * added all necessary builders * merge branch * removed path client --------- Co-authored-by: Joel Hendrix Co-authored-by: Matias Quaranta Co-authored-by: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Co-authored-by: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Co-authored-by: Scott Beddall Co-authored-by: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> Co-authored-by: Peng Jiahui <46921893+Alancere@users.noreply.github.com> Co-authored-by: James Suplizio Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> Co-authored-by: gracewilcox <43627800+gracewilcox@users.noreply.github.com> Co-authored-by: Wes Haggard Co-authored-by: Bob Tabor Co-authored-by: Bob Tabor * [AzDatalake] Filesystem Client Implementation + Test Framework (#21067) * Enable gocritic during linting (#20715) Enabled gocritic's evalOrder to catch dependencies on undefined behavior on return statements. Updated to latest version of golangci-lint. Fixed issue in azblob flagged by latest linter. * Cosmos DB: Enable merge support (#20716) * Adding header and value * Wiring and tests * format * Fixing value * change log * [azservicebus, azeventhubs] Stress test and logging improvement (#20710) Logging improvements: * Updating the logging to print more tracing information (per-link) in prep for the bigger release coming up. * Trimming out some of the verbose logging, seeing if I can get it a bit more reasonable. Stress tests: * Add a timestamp to the log name we generate and also default to append, not overwrite. * Use 0.5 cores, 0.5GB as our baseline. Some pods use more and I'll tune them more later. * update proxy version (#20712) Co-authored-by: Scott Beddall * Return an error when you try to send a message that's too large. (#20721) This now works just like the message batch - you'll get an ErrMessageTooLarge if you attempt to send a message that's too large for the link's configured size. NOTE: there's a patch to `internal/go-amqp/Sender.go` to match what's in go-amqp's main so it returns a programmatically useful error when the message is too large. Fixes #20647 * Changes in test that is failing in pipeline (#20693) * [azservicebus, azeventhubs] Treat 'entity full' as a fatal error (#20722) When the remote entity is full we get a resource-limit-exceeded condition. This isn't something we should keep retrying on and it's best to just abort and let the user know immediately, rather than hoping it might eventually clear out. This affected both Event Hubs and Service Bus. Fixes #20647 * [azservicebus/azeventhubs] Redirect stderr and stdout to tee (#20726) * Update changelog with latest features (#20730) * Update changelog with latest features Prepare for upcoming release. * bump minor version * pass along the artifact name so we can override it later (#20732) Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> * [azeventhubs] Fixing checkpoint store race condition (#20727) The checkpoint store wasn't guarding against multiple owners claiming for the first time - fixing this by using IfNoneMatch Fixes #20717 * Fix azidentity troubleshooting guide link (#20736) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 (#20437) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 generation from spec commit: 85fb4ac6f8bfefd179e6c2632976a154b5c9ff04 * client factory * fix * fix * update * add sdk/resourcemanager/postgresql/armpostgresql live test (#20685) * add sdk/resourcemanager/postgresql/armpostgresql live test * update assets.json * set subscriptionId default value * format * add sdk/resourcemanager/eventhub/armeventhub live test (#20686) * add sdk/resourcemanager/eventhub/armeventhub live test * update assets * add sdk/resourcemanager/compute/armcompute live test (#20048) * add sdk/resourcemanager/compute/armcompute live test * skus filter * fix subscriptionId default value * fix * gofmt * update recording * sdk/resourcemanager/network/armnetwork live test (#20331) * sdk/resourcemanager/network/armnetwork live test * update subscriptionId default value * update recording * add sdk/resourcemanager/cosmos/armcosmos live test (#20705) * add sdk/resourcemanager/cosmos/armcosmos live test * update assets.json * update assets.json * update assets.json * update assets.json * Increment package version after release of azcore (#20740) * [azeventhubs] Improperly resetting etag in the checkpoint store (#20737) We shouldn't be resetting the etag to nil - it's what we use to enforce a "single winner" when doing ownership claims. The bug here was two-fold: I had bad logic in my previous claim ownership, which I fixed in a previous PR, but we need to reflect that same constraint properly in our in-memory checkpoint store for these tests. * Eng workflows sync and branch cleanup additions (#20743) Co-authored-by: James Suplizio * [azeventhubs] Latest start position can also be inclusive (ie, get the latest message) (#20744) * Update GitHubEventProcessor version and remove pull_request_review procesing (#20751) Co-authored-by: James Suplizio * Rename DisableAuthorityValidationAndInstanceDiscovery (#20746) * fix (#20707) * AzFile (#20739) * azfile: Fixing connection string parsing logic (#20798) * Fixing connection string parse logic * Update README * [azadmin] fix flaky test (#20758) * fix flaky test * charles suggestion * Prepare azidentity v1.3.0 for release (#20756) * Fix broken podman link (#20801) Co-authored-by: Wes Haggard * [azquery] update doc comments (#20755) * update doc comments * update statistics and visualization generation * prep-for-release * Fixed contribution section (#20752) Co-authored-by: Bob Tabor * [azeventhubs,azservicebus] Some API cleanup, renames (#20754) * Adding options to UpdateCheckpoint(), just for future potential expansion * Make Offset an int64, not a *int64 (it's not optional, it'll always come back with ReceivedEvents) * Adding more logging into the checkpoint store. * Point all imports at the production go-amqp * Add supporting features to enable distributed tracing (#20301) (#20708) * Add supporting features to enable distributed tracing This includes new internal pipeline policies and other supporting types. See the changelog for a full description. Added some missing doc comments. * fix linter issue * add net.peer.name trace attribute sequence custom HTTP header policy before logging policy. sequence logging policy after HTTP trace policy. keep body download policy at the end. * add span for iterating over pages * Restore ARM CAE support for azcore beta (#20657) This reverts commit 902097226ff3fe2fc6c3e7fc50d3478350253614. * Upgrade to stable azcore (#20808) * Increment package version after release of data/azcosmos (#20807) * Updating changelog (#20810) * Add fake package to azcore (#20711) * Add fake package to azcore This is the supporting infrastructure for the generated SDK fakes. * fix doc comment * Updating CHANGELOG.md (#20809) * changelog (#20811) * Increment package version after release of storage/azfile (#20813) * Update changelog (azblob) (#20815) * Updating CHANGELOG.md * Update the changelog with correct version * [azquery] migration guide (#20742) * migration guide * Charles feedback * Richard feedback --------- Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> * Increment package version after release of monitor/azquery (#20820) * [keyvault] prep for release (#20819) * prep for release * perf tests * update date * added new client methods * moved access conditions and wrote first test * added more tests * added path listing * list deleted paths * fixed formatter and added more tests * added more tests * marker fix * log * fixed constructor validation * comment * assets update: --------- Co-authored-by: Joel Hendrix Co-authored-by: Matias Quaranta Co-authored-by: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Co-authored-by: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Co-authored-by: Scott Beddall Co-authored-by: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> Co-authored-by: Peng Jiahui <46921893+Alancere@users.noreply.github.com> Co-authored-by: James Suplizio Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> Co-authored-by: gracewilcox <43627800+gracewilcox@users.noreply.github.com> Co-authored-by: Wes Haggard Co-authored-by: Bob Tabor Co-authored-by: Bob Tabor * Feedback + Service Client (#21096) * Enable gocritic during linting (#20715) Enabled gocritic's evalOrder to catch dependencies on undefined behavior on return statements. Updated to latest version of golangci-lint. Fixed issue in azblob flagged by latest linter. * Cosmos DB: Enable merge support (#20716) * Adding header and value * Wiring and tests * format * Fixing value * change log * [azservicebus, azeventhubs] Stress test and logging improvement (#20710) Logging improvements: * Updating the logging to print more tracing information (per-link) in prep for the bigger release coming up. * Trimming out some of the verbose logging, seeing if I can get it a bit more reasonable. Stress tests: * Add a timestamp to the log name we generate and also default to append, not overwrite. * Use 0.5 cores, 0.5GB as our baseline. Some pods use more and I'll tune them more later. * update proxy version (#20712) Co-authored-by: Scott Beddall * Return an error when you try to send a message that's too large. (#20721) This now works just like the message batch - you'll get an ErrMessageTooLarge if you attempt to send a message that's too large for the link's configured size. NOTE: there's a patch to `internal/go-amqp/Sender.go` to match what's in go-amqp's main so it returns a programmatically useful error when the message is too large. Fixes #20647 * Changes in test that is failing in pipeline (#20693) * [azservicebus, azeventhubs] Treat 'entity full' as a fatal error (#20722) When the remote entity is full we get a resource-limit-exceeded condition. This isn't something we should keep retrying on and it's best to just abort and let the user know immediately, rather than hoping it might eventually clear out. This affected both Event Hubs and Service Bus. Fixes #20647 * [azservicebus/azeventhubs] Redirect stderr and stdout to tee (#20726) * Update changelog with latest features (#20730) * Update changelog with latest features Prepare for upcoming release. * bump minor version * pass along the artifact name so we can override it later (#20732) Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> * [azeventhubs] Fixing checkpoint store race condition (#20727) The checkpoint store wasn't guarding against multiple owners claiming for the first time - fixing this by using IfNoneMatch Fixes #20717 * Fix azidentity troubleshooting guide link (#20736) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 (#20437) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 generation from spec commit: 85fb4ac6f8bfefd179e6c2632976a154b5c9ff04 * client factory * fix * fix * update * add sdk/resourcemanager/postgresql/armpostgresql live test (#20685) * add sdk/resourcemanager/postgresql/armpostgresql live test * update assets.json * set subscriptionId default value * format * add sdk/resourcemanager/eventhub/armeventhub live test (#20686) * add sdk/resourcemanager/eventhub/armeventhub live test * update assets * add sdk/resourcemanager/compute/armcompute live test (#20048) * add sdk/resourcemanager/compute/armcompute live test * skus filter * fix subscriptionId default value * fix * gofmt * update recording * sdk/resourcemanager/network/armnetwork live test (#20331) * sdk/resourcemanager/network/armnetwork live test * update subscriptionId default value * update recording * add sdk/resourcemanager/cosmos/armcosmos live test (#20705) * add sdk/resourcemanager/cosmos/armcosmos live test * update assets.json * update assets.json * update assets.json * update assets.json * Increment package version after release of azcore (#20740) * [azeventhubs] Improperly resetting etag in the checkpoint store (#20737) We shouldn't be resetting the etag to nil - it's what we use to enforce a "single winner" when doing ownership claims. The bug here was two-fold: I had bad logic in my previous claim ownership, which I fixed in a previous PR, but we need to reflect that same constraint properly in our in-memory checkpoint store for these tests. * Eng workflows sync and branch cleanup additions (#20743) Co-authored-by: James Suplizio * [azeventhubs] Latest start position can also be inclusive (ie, get the latest message) (#20744) * Update GitHubEventProcessor version and remove pull_request_review procesing (#20751) Co-authored-by: James Suplizio * Rename DisableAuthorityValidationAndInstanceDiscovery (#20746) * fix (#20707) * AzFile (#20739) * azfile: Fixing connection string parsing logic (#20798) * Fixing connection string parse logic * Update README * [azadmin] fix flaky test (#20758) * fix flaky test * charles suggestion * Prepare azidentity v1.3.0 for release (#20756) * Fix broken podman link (#20801) Co-authored-by: Wes Haggard * [azquery] update doc comments (#20755) * update doc comments * update statistics and visualization generation * prep-for-release * Fixed contribution section (#20752) Co-authored-by: Bob Tabor * [azeventhubs,azservicebus] Some API cleanup, renames (#20754) * Adding options to UpdateCheckpoint(), just for future potential expansion * Make Offset an int64, not a *int64 (it's not optional, it'll always come back with ReceivedEvents) * Adding more logging into the checkpoint store. * Point all imports at the production go-amqp * Add supporting features to enable distributed tracing (#20301) (#20708) * Add supporting features to enable distributed tracing This includes new internal pipeline policies and other supporting types. See the changelog for a full description. Added some missing doc comments. * fix linter issue * add net.peer.name trace attribute sequence custom HTTP header policy before logging policy. sequence logging policy after HTTP trace policy. keep body download policy at the end. * add span for iterating over pages * Restore ARM CAE support for azcore beta (#20657) This reverts commit 902097226ff3fe2fc6c3e7fc50d3478350253614. * Upgrade to stable azcore (#20808) * Increment package version after release of data/azcosmos (#20807) * Updating changelog (#20810) * Add fake package to azcore (#20711) * Add fake package to azcore This is the supporting infrastructure for the generated SDK fakes. * fix doc comment * Updating CHANGELOG.md (#20809) * changelog (#20811) * Increment package version after release of storage/azfile (#20813) * Update changelog (azblob) (#20815) * Updating CHANGELOG.md * Update the changelog with correct version * [azquery] migration guide (#20742) * migration guide * Charles feedback * Richard feedback --------- Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> * Increment package version after release of monitor/azquery (#20820) * [keyvault] prep for release (#20819) * prep for release * perf tests * update date * added new client methods * moved access conditions and wrote first test * added more tests * added path listing * list deleted paths * fixed formatter and added more tests * added more tests * marker fix * log * fixed constructor validation * comment * assets update: * some cleanup * missing models and log * cleanup, resolved apiview feedback * test * cleanup * added service tests * implemented listing * cleanup * cleanup --------- Co-authored-by: Joel Hendrix Co-authored-by: Matias Quaranta Co-authored-by: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Co-authored-by: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Co-authored-by: Scott Beddall Co-authored-by: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> Co-authored-by: Peng Jiahui <46921893+Alancere@users.noreply.github.com> Co-authored-by: James Suplizio Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> Co-authored-by: gracewilcox <43627800+gracewilcox@users.noreply.github.com> Co-authored-by: Wes Haggard Co-authored-by: Bob Tabor Co-authored-by: Bob Tabor * [AzDatalake] File Client Support (#21141) * Enable gocritic during linting (#20715) Enabled gocritic's evalOrder to catch dependencies on undefined behavior on return statements. Updated to latest version of golangci-lint. Fixed issue in azblob flagged by latest linter. * Cosmos DB: Enable merge support (#20716) * Adding header and value * Wiring and tests * format * Fixing value * change log * [azservicebus, azeventhubs] Stress test and logging improvement (#20710) Logging improvements: * Updating the logging to print more tracing information (per-link) in prep for the bigger release coming up. * Trimming out some of the verbose logging, seeing if I can get it a bit more reasonable. Stress tests: * Add a timestamp to the log name we generate and also default to append, not overwrite. * Use 0.5 cores, 0.5GB as our baseline. Some pods use more and I'll tune them more later. * update proxy version (#20712) Co-authored-by: Scott Beddall * Return an error when you try to send a message that's too large. (#20721) This now works just like the message batch - you'll get an ErrMessageTooLarge if you attempt to send a message that's too large for the link's configured size. NOTE: there's a patch to `internal/go-amqp/Sender.go` to match what's in go-amqp's main so it returns a programmatically useful error when the message is too large. Fixes #20647 * Changes in test that is failing in pipeline (#20693) * [azservicebus, azeventhubs] Treat 'entity full' as a fatal error (#20722) When the remote entity is full we get a resource-limit-exceeded condition. This isn't something we should keep retrying on and it's best to just abort and let the user know immediately, rather than hoping it might eventually clear out. This affected both Event Hubs and Service Bus. Fixes #20647 * [azservicebus/azeventhubs] Redirect stderr and stdout to tee (#20726) * Update changelog with latest features (#20730) * Update changelog with latest features Prepare for upcoming release. * bump minor version * pass along the artifact name so we can override it later (#20732) Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> * [azeventhubs] Fixing checkpoint store race condition (#20727) The checkpoint store wasn't guarding against multiple owners claiming for the first time - fixing this by using IfNoneMatch Fixes #20717 * Fix azidentity troubleshooting guide link (#20736) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 (#20437) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 generation from spec commit: 85fb4ac6f8bfefd179e6c2632976a154b5c9ff04 * client factory * fix * fix * update * add sdk/resourcemanager/postgresql/armpostgresql live test (#20685) * add sdk/resourcemanager/postgresql/armpostgresql live test * update assets.json * set subscriptionId default value * format * add sdk/resourcemanager/eventhub/armeventhub live test (#20686) * add sdk/resourcemanager/eventhub/armeventhub live test * update assets * add sdk/resourcemanager/compute/armcompute live test (#20048) * add sdk/resourcemanager/compute/armcompute live test * skus filter * fix subscriptionId default value * fix * gofmt * update recording * sdk/resourcemanager/network/armnetwork live test (#20331) * sdk/resourcemanager/network/armnetwork live test * update subscriptionId default value * update recording * add sdk/resourcemanager/cosmos/armcosmos live test (#20705) * add sdk/resourcemanager/cosmos/armcosmos live test * update assets.json * update assets.json * update assets.json * update assets.json * Increment package version after release of azcore (#20740) * [azeventhubs] Improperly resetting etag in the checkpoint store (#20737) We shouldn't be resetting the etag to nil - it's what we use to enforce a "single winner" when doing ownership claims. The bug here was two-fold: I had bad logic in my previous claim ownership, which I fixed in a previous PR, but we need to reflect that same constraint properly in our in-memory checkpoint store for these tests. * Eng workflows sync and branch cleanup additions (#20743) Co-authored-by: James Suplizio * [azeventhubs] Latest start position can also be inclusive (ie, get the latest message) (#20744) * Update GitHubEventProcessor version and remove pull_request_review procesing (#20751) Co-authored-by: James Suplizio * Rename DisableAuthorityValidationAndInstanceDiscovery (#20746) * fix (#20707) * AzFile (#20739) * azfile: Fixing connection string parsing logic (#20798) * Fixing connection string parse logic * Update README * [azadmin] fix flaky test (#20758) * fix flaky test * charles suggestion * Prepare azidentity v1.3.0 for release (#20756) * Fix broken podman link (#20801) Co-authored-by: Wes Haggard * [azquery] update doc comments (#20755) * update doc comments * update statistics and visualization generation * prep-for-release * Fixed contribution section (#20752) Co-authored-by: Bob Tabor * [azeventhubs,azservicebus] Some API cleanup, renames (#20754) * Adding options to UpdateCheckpoint(), just for future potential expansion * Make Offset an int64, not a *int64 (it's not optional, it'll always come back with ReceivedEvents) * Adding more logging into the checkpoint store. * Point all imports at the production go-amqp * Add supporting features to enable distributed tracing (#20301) (#20708) * Add supporting features to enable distributed tracing This includes new internal pipeline policies and other supporting types. See the changelog for a full description. Added some missing doc comments. * fix linter issue * add net.peer.name trace attribute sequence custom HTTP header policy before logging policy. sequence logging policy after HTTP trace policy. keep body download policy at the end. * add span for iterating over pages * Restore ARM CAE support for azcore beta (#20657) This reverts commit 902097226ff3fe2fc6c3e7fc50d3478350253614. * Upgrade to stable azcore (#20808) * Increment package version after release of data/azcosmos (#20807) * Updating changelog (#20810) * Add fake package to azcore (#20711) * Add fake package to azcore This is the supporting infrastructure for the generated SDK fakes. * fix doc comment * Updating CHANGELOG.md (#20809) * changelog (#20811) * Increment package version after release of storage/azfile (#20813) * Update changelog (azblob) (#20815) * Updating CHANGELOG.md * Update the changelog with correct version * [azquery] migration guide (#20742) * migration guide * Charles feedback * Richard feedback --------- Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> * Increment package version after release of monitor/azquery (#20820) * [keyvault] prep for release (#20819) * prep for release * perf tests * update date * added apis and models * cleanup * cleanup + block blob client * added tests * added tests * added tests * added more tests * added more tests * dir block client * sas test * sas test --------- Co-authored-by: Joel Hendrix Co-authored-by: Matias Quaranta Co-authored-by: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Co-authored-by: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Co-authored-by: Scott Beddall Co-authored-by: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> Co-authored-by: Peng Jiahui <46921893+Alancere@users.noreply.github.com> Co-authored-by: James Suplizio Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> Co-authored-by: gracewilcox <43627800+gracewilcox@users.noreply.github.com> Co-authored-by: Wes Haggard Co-authored-by: Bob Tabor Co-authored-by: Bob Tabor * [AzDatalake] Cleanup + Improvements (#21222) * Enable gocritic during linting (#20715) Enabled gocritic's evalOrder to catch dependencies on undefined behavior on return statements. Updated to latest version of golangci-lint. Fixed issue in azblob flagged by latest linter. * Cosmos DB: Enable merge support (#20716) * Adding header and value * Wiring and tests * format * Fixing value * change log * [azservicebus, azeventhubs] Stress test and logging improvement (#20710) Logging improvements: * Updating the logging to print more tracing information (per-link) in prep for the bigger release coming up. * Trimming out some of the verbose logging, seeing if I can get it a bit more reasonable. Stress tests: * Add a timestamp to the log name we generate and also default to append, not overwrite. * Use 0.5 cores, 0.5GB as our baseline. Some pods use more and I'll tune them more later. * update proxy version (#20712) Co-authored-by: Scott Beddall * Return an error when you try to send a message that's too large. (#20721) This now works just like the message batch - you'll get an ErrMessageTooLarge if you attempt to send a message that's too large for the link's configured size. NOTE: there's a patch to `internal/go-amqp/Sender.go` to match what's in go-amqp's main so it returns a programmatically useful error when the message is too large. Fixes #20647 * Changes in test that is failing in pipeline (#20693) * [azservicebus, azeventhubs] Treat 'entity full' as a fatal error (#20722) When the remote entity is full we get a resource-limit-exceeded condition. This isn't something we should keep retrying on and it's best to just abort and let the user know immediately, rather than hoping it might eventually clear out. This affected both Event Hubs and Service Bus. Fixes #20647 * [azservicebus/azeventhubs] Redirect stderr and stdout to tee (#20726) * Update changelog with latest features (#20730) * Update changelog with latest features Prepare for upcoming release. * bump minor version * pass along the artifact name so we can override it later (#20732) Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> * [azeventhubs] Fixing checkpoint store race condition (#20727) The checkpoint store wasn't guarding against multiple owners claiming for the first time - fixing this by using IfNoneMatch Fixes #20717 * Fix azidentity troubleshooting guide link (#20736) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 (#20437) * [Release] sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/0.1.0 generation from spec commit: 85fb4ac6f8bfefd179e6c2632976a154b5c9ff04 * client factory * fix * fix * update * add sdk/resourcemanager/postgresql/armpostgresql live test (#20685) * add sdk/resourcemanager/postgresql/armpostgresql live test * update assets.json * set subscriptionId default value * format * add sdk/resourcemanager/eventhub/armeventhub live test (#20686) * add sdk/resourcemanager/eventhub/armeventhub live test * update assets * add sdk/resourcemanager/compute/armcompute live test (#20048) * add sdk/resourcemanager/compute/armcompute live test * skus filter * fix subscriptionId default value * fix * gofmt * update recording * sdk/resourcemanager/network/armnetwork live test (#20331) * sdk/resourcemanager/network/armnetwork live test * update subscriptionId default value * update recording * add sdk/resourcemanager/cosmos/armcosmos live test (#20705) * add sdk/resourcemanager/cosmos/armcosmos live test * update assets.json * update assets.json * update assets.json * update assets.json * Increment package version after release of azcore (#20740) * [azeventhubs] Improperly resetting etag in the checkpoint store (#20737) We shouldn't be resetting the etag to nil - it's what we use to enforce a "single winner" when doing ownership claims. The bug here was two-fold: I had bad logic in my previous claim ownership, which I fixed in a previous PR, but we need to reflect that same constraint properly in our in-memory checkpoint store for these tests. * Eng workflows sync and branch cleanup additions (#20743) Co-authored-by: James Suplizio * [azeventhubs] Latest start position can also be inclusive (ie, get the latest message) (#20744) * Update GitHubEventProcessor version and remove pull_request_review procesing (#20751) Co-authored-by: James Suplizio * Rename DisableAuthorityValidationAndInstanceDiscovery (#20746) * fix (#20707) * AzFile (#20739) * azfile: Fixing connection string parsing logic (#2079… * [storage][azblob]Content validation test for DownloadFile/DownloadBuffer functions (#21347) * Content validation test for DownloadFile/Buffer functions * Fix formatting * Change test file size to ~200 * Fix formatting * Fix formatting * [storage][azblob]DownloadFile: Download large files serially (#21259) * Move Buffer manager to shared * Serialize downloading to a file * Move DownloadFile to new func * Add special handling for small files * Fix build * Fix build * Lint error * Fix tab spaces * Fix lint again :( * Address comments * Update comment * Doc comment for default concurrency * Fix formatting * Fix formatting * Fix file read performUploadAndDownloadFileTest() method Seek to zero in performUploadAndDownloadFileTest before reading. * Fix testcase TestBasicDoBatchTransfer * Fix testcase * Increment package version after release of storage/azdatalake (#21388) * [keyvault] upgraded dependencies (#21376) * upgraded dependencies * update perf tests * update azidentity * sdk/resourcemanager/kusto/armkusto live test (#21393) * sdk/resourcemanager/kusto/armkusto live test * go mod tidy * Add doc links to fakes example (#21008) * Add doc links to fakes example * fix relative paths * switch to absolute links * Update cosmos_container.go PatchItem function to respect enableContentResponseOnWrite option (#21395) Update cosmos_container.go: PatchItem function to respect enableContentResponseOnWrite option similar to how it is handled in CreateItem * Cosmos DB: Changelog for 0.3.6 bugfix release (#21397) * Increment package version after release of data/azcosmos (#21398) * Suppress nested SDK method spans (#21251) * Suppress nested SDK method spans The inner SDK span must be omitted. However, any REST span it creates must be a child of the outer SDK method span. * only suppress client and internal spans * prep-for-release (#21401) * Customer APIs should not be in the runtime package (#21406) The runtime package is intended for consumption by SDK authors and generated code. Renamed context key to match its helper function. Added examples some missing examples. * Simplify NewDefaultAzureCredential constructor error handling (#21315) * Validate and encode query parameters (#21296) * Validate and encode query parameters If the endpoint passed to runtime.NewRequest contains query parameters they must be validated and encoded. The typical case is when a paged operation's nextLink value contains query parameters. * add test with no query params * consolidate creating PagingHandler[T].Fetchers * make EncodeQueryParams its own func * fix bag merge * rename * update proxy version to one with fixed logging (#21400) Co-authored-by: Scott Beddall (from Dev Box) * Implement stable CAE design (#21333) * Add links to monitor/azingest README (#21416) * [keyvault] fix doc comments (#21410) * update keys * update certs * charles fix * Increment package version after release of security/keyvault/azsecrets (#21420) * [Release] sdk/resourcemanager/maintenance/armmaintenance/1.2.0 generation from spec commit: 4cd95123fb961c68740565a1efcaa5e43bd35802 (#21309) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/chaos/armchaos/0.7.0 generation from spec commit: 4cd95123fb961c68740565a1efcaa5e43bd35802 (#21308) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/containerservice/armcontainerservice/4.2.0-beta.2 (#21411) * [Release] sdk/resourcemanager/containerservice/armcontainerservice/4.2.0-beta.2 generation from spec commit: 64ffad1a3042017e07f8a47df17d6acaa2c1e609 * fix fake * update assets.json * [Release] sdk/resourcemanager/apicenter/armapicenter/0.1.0 generation from spec commit: 4cd95123fb961c68740565a1efcaa5e43bd35802 (#21306) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/redhatopenshift/armredhatopenshift/1.3.0 generation from spec commit: 4cd95123fb961c68740565a1efcaa5e43bd35802 (#21311) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/maps/armmaps/1.0.0 generation from spec commit: b9403296f0b0e112b0d8222ad05fd1d79ee10e03 (#21334) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/avs/armavs/1.3.0 (#21338) * [Release] sdk/resourcemanager/avs/armavs/2.0.0 generation from spec commit: a5e7ff51c8af3781e7f6dd3b82a3fc922e2f6f93 * add removeUnreferencedTypes flag * fix --------- Co-authored-by: ReleaseHelper Co-authored-by: Alancere <804873052@qq.com> * [Release] sdk/resourcemanager/storage/armstorage/1.4.0 (#21329) * [Release] sdk/resourcemanager/storage/armstorage/1.4.0 generation from spec commit: 0baf811c3c76c87b3c127d098519bd97141222dd * stable remove fake and update assets.json * remove fake_example_test.go link stable version broken --------- Co-authored-by: ReleaseHelper Co-authored-by: Alancere <804873052@qq.com> * [Release] sdk/resourcemanager/network/armnetwork/4.1.0 (#21358) * [Release] sdk/resourcemanager/network/armnetwork/4.1.0 generation from spec commit: baac183ffa684d94f697f0fc6f480e02cfb00f3d * update assets.json * remove README.md fake_example_test.go broken link * Add FetcherForNextLinkOptions for extensibility (#21418) * Add FetcherForNextLinkOptions for extensibility This includes support for paged operations that use next link method instead of a vanilla HTTP GET on the next link URL. * add error test case for NextReq * update date (#21423) * Sync eng/common directory with azure-sdk-tools for PR 6782 (#21391) * Create Epic work item type as Service or product when running prepare release script * Updated epic type field name * Additional change to create release plan work item * Exclude work items created from release planner test * Fix issue in params * Updated as per review comments --------- Co-authored-by: praveenkuttappan * Fixed issue where customers could not capture response of directory and file GetProperties calls (#21407) * change region (#21425) * change location (#21427) * Increment package version after release of security/keyvault/azkeys (#21430) * Sync eng/common directory with azure-sdk-tools for PR 6632 (#21428) * Docs Onboarding 2 - Add eng/common changes * Dictionary Syntax * Remove $UpdatePackageMetadata, it can be handled in other places * Set exit code to 0 on success. The last executable to run (pip or docker or other) may be passed through * Add optional _DocsOnboardingOrdinal sorting to work around onboarding sequence problems * Update-DocsMsPackages2.ps1 -> Update-DocsMsPackages.ps1 --------- Co-authored-by: Daniel Jurek * Use emitter-package-lock.json and @local feed view (#21419) Co-authored-by: Patrick Hallisey * [Release] sdk/resourcemanager/containerservice/armcontainerservice/4.2.0 (#21422) * [Release] sdk/resourcemanager/containerservice/armcontainerservice/4.2.0 generation from spec commit: ad6484fee29013ab0b3619217970b106a1f44cf0 * update assets.json * remove fake_example_test.go link * [Release] sdk/resourcemanager/apimanagement/armapimanagement/2.0.0 generation from spec commit: 4cd95123fb961c68740565a1efcaa5e43bd35802 (#21307) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/appcontainers/armappcontainers/2.0.0 generation from spec commit: 58be094c6b365f8d4d73a91e293dfb4818e57cf6 (#21318) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/resources/armdeploymentstacks/v0.1.0 (#21340) * update armapimanagement live test (#21434) * [Release] sdk/resourcemanager/dynatrace/armdynatrace/2.0.0 generation from spec commit: baac183ffa684d94f697f0fc6f480e02cfb00f3d (#21359) * [Release] sdk/resourcemanager/hdinsightcontainers/armhdinsightcontainers/v0.1.0 (#21403) * [Release] sdk/resourcemanager/hdinsightcontainers/v0.10 * go mod tidy * gofmt * [Release] sdk/resourcemanager/containerservice/armcontainerservice/4.3.0 (#21435) * [Release] sdk/resourcemanager/containerservice/armcontainerservice/4.3.0 generation from spec commit: 1d2b8c05b55be5dd98ce94c835d7e96ee1ea7f5d * update assets.json * date (#21440) * Increment package version after release of security/keyvault/azadmin (#21442) * [Release] sdk/resourcemanager/resourceconnector/armresourceconnector/1.0.0 generation from spec commit: 5f700acd3d094d8eedca381932f2e7916afd2e55 (#21354) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/networkcloud/armnetworkcloud/1.0.0 generation from spec commit: 4cd95123fb961c68740565a1efcaa5e43bd35802 (#21310) Co-authored-by: ReleaseHelper * Fail fast on variable conflicts with subscription config (#21446) Co-authored-by: Ben Broderick Phillips * Do not refer to global CHANGELOG.md (#21278) * Update CI to latest versions of Go (#21450) * Update CI to latest versions of Go Update golangci-lint to latest version. * add patch version for 1.21 * fix test due to change in Go 1.21 * [keyvault] change managed hsms to run weekly (#21429) * weekly azadmin * fix yml * update azkeys * live tests * fix format * update azadmin * charles suggestion Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> --------- Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> * Plumb EnvVars to subscription config builder to find duplicates (#21448) * Handle Docker Desktop 403 response from IMDS endpoint (#21432) * [azopenai] Adding in support for using Azure Chat Extensions with external data sources (#21426) Adding in support for chat extensions which allow you (in Azure OpenAI) to use your own data from a Cognitive Search index. Also, updated the example files to use the `context.TODO()` consistently, and to use our new "comment + panic" in testable examples. Fixes #21373 * Increment package version after release of ai/azopenai (#21456) * Check for DocsMsPackagesAllValid before running validation step (#21457) Co-authored-by: Daniel Jurek * azfile: STG 87 (#21452) * Updating AzBlob to STG 87-90 (#21454) * regenerating azblob to stg 87-90 (#21384) * Update AzBlob Service Version to 2023-08-03 (#21409) * updating service version for stg 87-90 * Adding mock test to check request header * fixing linting issues * return fake response * High Throughput Append Blob (#21424) * adding test for highthroughput appendblob * recorded test * Unrecord file, update CHANGELOG.md * ArchieveStatus - RehydratePendingToCold (#21441) * Adding new rehydrate enum * Added new enum, test, updated CHANGELOG.md * Use the published azcore@v1.8.0-beta.2, which removes json.RawMessage in favor of []byte. (#21460) Co-authored-by: Richard Park * Remove duplicate identity test variables (#21461) * Remove duplicate identity test variables * Add empty bicep file * Add option to use azcore from main in CI (#21466) * Add option to use azcore from main in CI Off by default, set Use.AzcoreFromMain to true to enable. * fix for relative path, avoid potential infinite loop * disable release when Use.AzcoreFromMain is set * Monitor Ingestion Troubleshooting Guide (#21459) * added troubleshooting guide * feedback * typo * link (#21475) * sdk/resourcemanager/mobilenetwork/armmobilenetwork live test (#21437) * Execute go mod tidy for perf tests when using live azcore (#21471) * Execute go mod tidy for perf tests when using live azcore This ensures that any updated dependencies are propagated. * set default value and fix devops syntax * runtime expression * switch param to string * stricter check, fixed some logging * debugging * fix syntax * define task var, clean up lint * fix syntax * define default from a runtime expression * syntax * more syntax * switch back to bool, remove debug logging * Rename "send_and_receive drain.go" to remove space (#21474) Signed-off-by: W. Michael Petullo * sdk/resourcemanager/mariadb/armmariadb live test (#21473) * sdk/resourcemanager/mariadb/armmariadb live test * fix * add sdk/resourcemanager/dynatrace/armdynatrace live test (#21458) * add sdk/resourcemanager/dynatrace/armdynatrace live test * update assets.json * add sdk/resourcemanager/signalr/armsignalr live test (#21490) * Transport dialer: setting nil for wasm build (#21451) * Transport dialer: setting nil for wasm build * license * Add changelog entry for WASM fix (#21493) * [azservicebus] Add a helper function to get a Message from a ReceivedMessage (#21472) Fixes #21469 * Cleaning up CHANGELOG.md and README.md (#21494) * sdk/resourcemanager/appconfiguration/armappconfiguration live test (#21500) * Revert autorest core version from build scripts (#21503) * Client Creation Tests for Blob Clients (#21478) * adding tests for blob clients * Record test * Updating tests and recording * [azservicebus] Fixing issue where the body was populated incorrectly, making it empty on retries since it can't be rewound. (#21496) Previously we were setting request.Raw().Body directly, instead of using the request.SetBody() function. This made it so the request body itself was no longer rewindable, which made subsequent requests send an empty body instead. Fixes #21489 * Fix error checks in tests (#21470) * Fix error checks in tests Use Error() and NoError() checks instead of NotNil() and Nil() as they provide better diagnostics when the conditions aren't met. Cleaned up some ordering of imports in the tests. * fix up azqueue * fix up azdatalake * Use mariner go image tag for service bus stress (#21477) * [azservicebus] Update to the latest go-amqp (#21465) Upgrade to the new go-amqp, which fixes a potential race condition that can hang senders, even when contexts have been cancelled. * Prep azcore for v1.8.0-beta.3 release (#21508) * Update live test 0907 (#21514) * apimanagement live test * cdn live test * containerregistry live test * eventgrid live test * network live test * monitor live test * operationalinsights live test * servicebus live test * redis live test * storage live test * remove live test Code generated context * Increment package version after release of azcore (#21516) * Sync eng/common directory with azure-sdk-tools for PR 6903 (#21499) * fixes * ongoing * ongoing * add top-level throw/catches showing exception info * fix handling of cases when there is 1 link and when there is no RetryAfter.Delta * handle lack of Exception.Headers property * handle gracefully obtaining status code from $_.Exception.InnerException.ErrorCode --------- Co-authored-by: Konrad Jamrozik * Update azappconfig to a more recent code generator (#21518) Moved autorest-specific content to the internal directory. Use a file prefix for generated content. Consolidate client construction. Update dependencies. * Prepare azidentity v1.4.0-beta.5 for release (#21524) * Set confidential client region at construction (#21523) * prep-for-release (#21519) * Skip getting module properties for **/testdata/* (#21510) * Some refactoring of azappconfig (#21526) * Some refactoring of azappconfig Moved options and response types to their respective files. Moved methods on Setting to its respective file. Inlined various from* conversion funcs to their call sites. Renamed paged response types to have the Response suffix per guidelines. Fixed an issue parsing the time value returned in the Last-Modified header. The expected format was incorrect and the error was previously silently dropped. * a bit more cleanup * move constants to their respective file * Remove autorest core version from build scripts (#21531) * Sync eng/common directory with azure-sdk-tools repository (#21537) * armstorageimportexport - clean up client constructors (#21522) * armstorageimportexport - clean up client constructors We don't allow optional client constructor parameters for ARM. Use an autorest transform until the OpenAPI has been fixed. * update changelog * [azeventgrid] Adding in a Publisher client to use with Event Grid topics (#21521) * Event Grid publisher client - can publish to topics. * Fixing some issues in the publisher client and adding in examples. * Add function specific examples. * Adding a very basic readme for the publisher package. * Updating changelog * Bump the minor revision as well. * Disable live tests if we're in a CI environment. * Plumb in recording infra * Rearrange client constructors. * Test resources should work now * Fixing tests to just get skipped in non-recording mode. * Remove unused fakeVars * Remove en-us * Temp replace dead links. * Another one failing the dead link checker. * (comparing with others) Looks like I was using an incorrect inputSchema for the topic. * The error code when releasing an expired lock token has changed. Documenting for now, will pose a question for an ongoing discussion. * Skipping tests that are related to #21530 * Making our template look more like Python's with the scope/role assignment. * The CloudEvent part of this test was getting set at too high a level and would affect other parts of the HTTP pipeline (including token authentication). * Was missing an explicit set of variables so the EnvironmentCredential works. * testing * EnvVars should be _under_ parameters! * A little too much copying... * Remove the old content-header code now that we're auto-generating it in the right spot. --------- Co-authored-by: Richard Park * Increment package version after release of azidentity (#21541) * azfile: STG 87 preview (#21542) * [azeventgrid] Prep for release (#21544) * Increment package version after release of messaging/azeventgrid (#21546) * Increment package version after release of messaging/azservicebus (#21547) * Increment package version after release of security/keyvault/azcertificates (#21549) * Convert client test to use recordings (#21540) * Convert client test to use recordings A little clean-up of the test code. * don't defer in the same func as os.Exit * Some azappconfig cleanup (#21538) Improved docs on some APIs. Simplify handling of optional params type. Use context.Background() in tests. Added test for setting with nil value. Fix sort order of fields in options and response types. * [Release] sdk/resourcemanager/iothub/armiothub/1.2.0-beta.2 (#21480) * [Release] sdk/resourcemanager/iothub/armiothub/1.2.0-beta.2 generation from spec commit: 80c21c17b4a7aa57f637ee594f7cfd653255a7e0 * update assets.json --------- Co-authored-by: ReleaseHelper Co-authored-by: Peng Jiahui <804873052@qq.com> * [Release] sdk/resourcemanager/recoveryservices/armrecoveryservices/1.5.0 (#21482) * [Release] sdk/resourcemanager/recoveryservices/armrecoveryservices/1.5.0 generation from spec commit: 80c21c17b4a7aa57f637ee594f7cfd653255a7e0 * update assets.json --------- Co-authored-by: ReleaseHelper Co-authored-by: Peng Jiahui <804873052@qq.com> * [Release] sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/0.2.0 generation from spec commit: a29126ca8200a6c981a4e908e41fe55730df4cad (#21512) Co-authored-by: ReleaseHelper * Increment package version after release of storage/azfile (#21545) * Sync eng/common directory with azure-sdk-tools for PR 6895 (#21552) * Add legacy moniker migration logic * Add functionality from Java testing --------- Co-authored-by: Daniel Jurek * [Release] sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/3.0.0 (#21486) * [Release] sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/3.0.0 generation from spec commit: 80c21c17b4a7aa57f637ee594f7cfd653255a7e0 * remove duplicate interface * update --------- Co-authored-by: ReleaseHelper Co-authored-by: Peng Jiahui <804873052@qq.com> * Upgrade the module version used in live test (#21464) * Upgrade the module version used in live test when the sdk has major version bump * fix * [Cosmos DB] Fixing Cosmos emulator CI (#21564) * Fixing Cosmos emulator CI * Updating version * Fix string-to-sign when path contains URL-encoded values (#21563) URL.Path contains the decoded path which can be different from the path used in the HTTP request. As a result, the string-to-sign doesn't match the request, causing it to fail with a 401 unauthorized. * Add KeyCredential and SASCredential types (#21553) * Add KeyCredential and SASCredential types Includes supporting pipeline policies, config options, etc. * add tests * change Format func to Prefix string * remove error return value from constructors * remove error return for Update method * update proxy version (#21566) Co-authored-by: Scott Beddall (from Dev Box) * chore: Update instructions on how to get SDK version (#21571) * chore: Update instructions on how to get SDK version * Update bug_report.md * Updating Module Version + Changelog (#21565) * Updating package version * Fixing module version * azblob: STG 90 Preview (#21574) * Serilaize with depth (#21568) Co-authored-by: Daniel Jurek * Clean up azdatalake pending version number (#21575) The beta suffix isn't required for prerelease versions. * Move the HMAC auth policy to an internal package (#21579) No functional changes. * generator tools add --force-stable-version flag (#21582) * generator tools add --force-stable-version flag * fix * fix * Deprecated sdk/resourcemanager/servicefabricmesh/armservicefabricmesh (#21583) * Deprecated sdk/resourcemanager/servicefabricmesh/armservicefabricmesh * remove locale * Don't recreate body after reading (#21580) * Don't recreate body after reading Rewind the body instead. And if it was nil, leave it as nil. Removed some unnecessary local vars. * capitalize HMAC * Return specific errors when parsing connection strings (#21586) Include failure details instead of a generic error message. Some other minor cleanup. * [Release] sdk/resourcemanager/compute/armcompute/5.2.0 (#21533) * [Release] sdk/resourcemanager/compute/armcompute/5.2.0 generation from spec commit: c78b5d8bd3aff2d82a5f034d9164b1a9ac030e09 * update go.mod * update assets.json * remove README.md fake example link * [Release] sdk/resourcemanager/signalr/armsignalr/1.2.0-beta.1 (#21535) * [Release] sdk/resourcemanager/signalr/armsignalr/1.2.0-beta.1 generation from spec commit: c78b5d8bd3aff2d82a5f034d9164b1a9ac030e09 * update assets.json * [Release] sdk/resourcemanager/iothub/armiothub/1.2.0 (#21485) * [Release] sdk/resourcemanager/iothub/armiothub/1.2.0 generation from spec commit: 80c21c17b4a7aa57f637ee594f7cfd653255a7e0 * update assets.json --------- Co-authored-by: ReleaseHelper Co-authored-by: Alancere <804873052@qq.com> * [Release] sdk/resourcemanager/containerservice/armcontainerservice/4.4.0-beta.1 (#21484) * [Release] sdk/resourcemanager/containerservice/armcontainerservice/4.4.0-beta.1 generation from spec commit: 80c21c17b4a7aa57f637ee594f7cfd653255a7e0 * update assets.json --------- Co-authored-by: ReleaseHelper Co-authored-by: Alancere <804873052@qq.com> * [Release] sdk/resourcemanager/communication/armcommunication/2.1.0-beta.1 generation from spec commit: 0d7b535d1273b18623ca0d63a6ebb0456dab95ba (#21591) * [Release] sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration/2.1.0 generation from spec commit: 80c21c17b4a7aa57f637ee594f7cfd653255a7e0 (#21487) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/sql/armsql/2.0.0-beta.2 generation from spec commit: c78b5d8bd3aff2d82a5f034d9164b1a9ac030e09 (#21536) * [Release] sdk/resourcemanager/network/armnetwork/4.2.0 (#21481) * [Release] sdk/resourcemanager/network/armnetwork/4.2.0 generation from spec commit: 80c21c17b4a7aa57f637ee594f7cfd653255a7e0 * update assets.json * update assets.json --------- Co-authored-by: ReleaseHelper Co-authored-by: Alancere <804873052@qq.com> * [Release] sdk/resourcemanager/solutions/armmanagedapplications/2.0.0 (#21462) * [Release] sdk/resourcemanager/solutions/armmanagedapplications/2.0.0 generation from spec commit: 5fb045bd44f143bae17da2e01552ae531f77d0ba * changelog response 404 * [Release] sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/2.1.0 generation from spec commit: a29126ca8200a6c981a4e908e41fe55730df4cad (#21513) Co-authored-by: ReleaseHelper * Rewrite if-else chain as switch (#21594) * Refactor handling of sync tokens (#21589) * Refactor handling of sync tokens Added internal package synctoken that contains the sync token cache and pipeline policy implementations. Renamed UpdateSyncToken to setSyncToken so it follows the design guidelines. In addition, it returns an error on malformed sync tokens. Removed setting sync token from test as it's not necessary (the policy already does this). * update recordings * more updates to changelog * doc fixes * add SyncToken type * prep for release * Increment package version after release of data/azappconfig (#21596) * Check for Sync-Token before updating the cache (#21600) Some responses, e.g. http.StatusBadRequest, won't return a Sync-Token. * [Release] sdk/resourcemanager/redis/armredis/3.0.0 generation from spec commit: 20312e2b31df58f0ea7560e87062d62aa92f0a14 (#21520) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/containerregistry/armcontainerregistry/1.1.0 (#21527) * [Release] sdk/resourcemanager/containerregistry/armcontainerregistry/1.1.0-beta.4 generation from spec commit: bbe1ea8bf5aa6cfbfa8855e03dbb9a93f8266bcd * update assets.json * release stable * update major version * fix * remove fake_example.go link --------- Co-authored-by: ReleaseHelper Co-authored-by: Alancere <804873052@qq.com> * fix sdk/resourcemanager/redis/armredis live test import (#21603) * [Release] sdk/resourcemanager/containerregistry/armcontainerregistry/1.2.0-beta.1 (#21605) * [Release] sdk/resourcemanager/containerregistry/armcontainerregistry/1.2.0-beta.1 generation from spec commit: 68d03f91ea7c30e1ab28fb9d35c13f81bc85b724 * fake * update assets.json * [Release] sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/1.0.0 generation from spec commit: 80c21c17b4a7aa57f637ee594f7cfd653255a7e0 (#21488) Co-authored-by: ReleaseHelper * [Release] sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/1.0.0 (#21483) * [Release] sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/1.0.0 generation from spec commit: 80c21c17b4a7aa57f637ee594f7cfd653255a7e0 * update changelog --------- Co-authored-by: ReleaseHelper Co-authored-by: Alancere <804873052@qq.com> * Add another error code to the list of unregistered RP errors (#21606) * [azopenai] Add in whisper (audio transcription and translation) support (#21599) - Support whisper/audio APIs + example - Fix issue with prompt_annotations being renamed to prompt_filter_results (but could be either). * Sync eng/common directory with azure-sdk-tools for PR 7002 (#21610) * Add LockDeletionForDays parameter to set PodDisruptionBudget and cleanup job * Use matrix for parallel tests. PDB improvements+docs. * Fix kubectl namespace context preservation on login --------- Co-authored-by: Ben Broderick Phillips * Sync eng/common directory with azure-sdk-tools for PR 6919 (#21611) * Add autorest-preview pipeline * Add emitternpminstall * Always install * Use shorter leg name * Add short circuiting to emitter install * Use language matrix function * Don't look for subfolders in the matrix package folders * Revert unnecessary eng/common changes * Rewrite GetPullRequestUrl to Get-BuildSourceDescription * Remove alias from Invoke-LoggedCommand * Use invoke-expression instead of shelling out * Add better job splitting * Replace Folder with Directory --------- Co-authored-by: Patrick Hallisey * [azopenai] prep release (#21612) * Update azcore dependencies (#21621) * Use identity subscription config and pre script for live test variables (#21622) * Increment package version after release of ai/azopenai (#21623) * [azservicebus,azeventhubs] Updating stress framework #21624 * Change prod maintenance day. Fix stress watcher deploy (#21618) Co-authored-by: Ben Broderick Phillips * [Release] sdk/resourcemanager/playwrighttesting/armplaywrighttesting/0.1.0 generation from spec commit: 3eb9ec8e9c8f717c6b461c4c0f49a4662fb948fd (#21626) * Increment package version after release of storage/azblob (#21576) * [AzDatalake] Fix Path Renames with SAS (#21617) * Fixed dir and file renames with sas * added changelog entry * handled errors * Add retriable status codes for IMDS managed identity (#21628) * [azopenai] Be more resilient to messages coming back with just content filtering… (#21625) Add in better code to handle fields being optional. * [azopenai] Fixing unused variable in example. (#21634) Fixes #21629 * [azservicebus] Adding in (Queue|Topic|Subscription)Name fields. (#21632) Fixes https://github.com/Azure/azure-sdk-for-go/issues/16692 * [azopenai] Adding in a contributors guide, some documentation to explain how bits fit together. (#21609) Fixes https://github.com/Azure/azure-sdk-for-go/issues/21560 * Update Monitor labels (#21650) * [keyvault] rename pipelines (#21652) * rename certs pipeline * rename files * fix name collision * [JimBot] Remove CXP Attention (#21654) Removing config for the dead CXP Attention rule * [azeventgrid] Unskip tests now that the fix has been deployed (#21633) Fixes https://github.com/Azure/azure-sdk-for-go/issues/21530 * [azservicebus] Prep for release (#21670) (just updating changelog) * Sync eng/common directory with azure-sdk-tools for PR 7040 (#21669) * Remove codeowners resolution logic from docs scripts * Remove parameters that aren't needed * Remove auth information from update-docsms-metadata.yml --------- Co-authored-by: Daniel Jurek * Bearer token authentication requires TLS (#21673) * Use subscription configuration variables for openai live tests (#21287) * Use subscription configuration variables for openai live tests * Add bicep file * add bicep comment * Fix SetImmutabilityPolicyOptions.format() NPE (#21593) * Fix SetImmutabilityPolicyOptions.format() NPE * Fixed null pointer exception when SetImmutabilityPolicyOptions is nil --------- Co-authored-by: Tanya Sethi * Restore ARM CAE support for azcore beta (#20657) This reverts commit 902097226ff3fe2fc6c3e7fc50d3478350253614. * Adding in the CloudEvent type (#21027) The `CloudEvent` type implements the CloudEvent from https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md. This same format (and type) is used in the upcoming EventGrid SDK and is also intended to be usable with other messaging packages as well. Part of the fix for #20970 (remainder comes in a PR for Event Grid) * azcore: Removing the json.RawMessage dependency in the public API (it wasn't part of the signature (formally) but it was part of the returned type. * Improve example for runtime.WithCaptureResponse (#21302) * Improve example for runtime.WithCaptureResponse * make linter happy * fix sentence * Add TokenRequestOptions.EnableCAE (#21362) * ARM bearer auth policy opts in to CAE (#21367) * Customer APIs should not be in the runtime package (#21406) The runtime package is intended for consumption by SDK authors and generated code. Renamed context key to match its helper function. Added examples some missing examples. * Validate and encode query parameters (#21296) If the endpoint passed to runtime.NewRequest contains query parameters they must be validated and encoded. The typical case is when a paged operation's nextLink value contains query parameters. * Add FetcherForNextLinkOptions for extensibility (#21418) This includes support for paged operations that use next link method instead of a vanilla HTTP GET on the next link URL. * Update CI to latest versions of Go (#21450) Update golangci-lint to latest version. * Add KeyCredential and SASCredential types (#21553) Includes supporting pipeline policies, config options, etc. * Add another error code to the list of unregistered RP errors (#21606) * Update azcore dependencies (#21621) * Partial port of https://github.com/Azure/azure-sdk-for-go/pull/20866 * Bearer token authentication requires TLS (#21673) * prep for release * Fix MIT license comment (#21695) * Fix MIT license comment (#21695) * add missing changelog entries for CAE * additional changelog cleanup * added missing changelong entry --------- Signed-off-by: W. Michael Petullo Co-authored-by: Peng Jiahui <46921893+Alancere@users.noreply.github.com> Co-authored-by: Sourav Gupta <98318303+souravgupta-msft@users.noreply.github.com> Co-authored-by: Philipp Co-authored-by: Sourav Gupta Co-authored-by: Richard Park <51494936+richardpark-msft@users.noreply.github.com> Co-authored-by: Ben Broderick Phillips Co-authored-by: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Co-authored-by: Mikel Olasagasti Uranga Co-authored-by: Tamer Sherif <69483382+tasherif-msft@users.noreply.github.com> Co-authored-by: Bill Wert Co-authored-by: Scott Beddall Co-authored-by: gracewilcox <43627800+gracewilcox@users.noreply.github.com> Co-authored-by: Charles Lowell <10964656+chlowell@users.noreply.github.com> Co-authored-by: Heath Stewart Co-authored-by: Josh Free Co-authored-by: Ahson Khan Co-authored-by: Scott Addie <10702007+scottaddie@users.noreply.github.com> Co-authored-by: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Co-authored-by: Matias Quaranta Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com> Co-authored-by: James Suplizio Co-authored-by: Wes Haggard Co-authored-by: Bob Tabor Co-authored-by: Bob Tabor Co-authored-by: MartinForReal Co-authored-by: raychen Co-authored-by: Konrad Jamrozik Co-authored-by: Chenjie Shi Co-authored-by: Wes Haggard Co-authored-by: Sameeksha Vaity Co-authored-by: Konrad Jamrozik Co-authored-by: Mike Kistler Co-authored-by: Scott Kurtzeborn Co-authored-by: Ben Broderick Phillips Co-authored-by: guangwu Co-authored-by: Benjamin Tamasi Co-authored-by: Antonio Huete Jimenez Co-authored-by: Mike Harder Co-authored-by: Daniel Jurek Co-authored-by: Jeff Fisher Co-authored-by: Jesse Squire Co-authored-by: Rick Winter Co-authored-by: Narasimha Kulkarni Co-authored-by: Furious_steel <66680059+furious-steel@users.noreply.github.com> Co-authored-by: Alancere <804873052@qq.com> Co-authored-by: praveenkuttappan Co-authored-by: Gauri Prasad <51212198+gapra-msft@users.noreply.github.com> Co-authored-by: Patrick Hallisey Co-authored-by: Richard Park Co-authored-by: W. Michael Petullo Co-authored-by: magodo Co-authored-by: Erez Rokah Co-authored-by: Mike McKay-Dirden <93532247+KastenMike@users.noreply.github.com> Co-authored-by: Tanya Sethi --- eng/common/TestResources/README.md | 1 + .../TestResources/SubConfig-Helpers.ps1 | 6 + .../build-test-resource-config.yml | 8 + .../templates/steps/create-pull-request.yml | 12 +- .../templates/steps/docs-metadata-release.yml | 119 -- .../steps/docsms-ensure-validation.yml | 12 + .../steps/eng-common-workflow-enforcer.yml | 12 +- .../templates/steps/sparse-checkout.yml | 15 +- .../steps/update-docsms-metadata.yml | 5 +- eng/common/scripts/Delete-RemoteBranches.ps1 | 78 +- .../scripts/Get-BuildSourceDescription.ps1 | 24 + .../Helpers/CommandInvocation-Helpers.ps1 | 42 + .../Helpers/DevOps-WorkItem-Helpers.ps1 | 133 +- .../scripts/Helpers/Metadata-Helpers.ps1 | 54 +- .../scripts/Helpers/PSModule-Helpers.ps1 | 71 +- .../scripts/Helpers/Resource-Helpers.ps1 | 8 +- ...ervice-Level-Readme-Automation-Helpers.ps1 | 73 +- eng/common/scripts/New-RegenerateMatrix.ps1 | 102 + .../scripts/Save-Package-Properties.ps1 | 14 + .../Service-Level-Readme-Automation.ps1 | 91 +- eng/common/scripts/Test-SampleMetadata.ps1 | 1 + .../scripts/TypeSpec-Project-Generate.ps1 | 51 +- .../scripts/TypeSpec-Project-Process.ps1 | 228 +++ eng/common/scripts/TypeSpec-Project-Sync.ps1 | 182 +- eng/common/scripts/Update-DocsMsMetadata.ps1 | 78 +- .../scripts/Update-DocsMsPackageMonikers.ps1 | 122 ++ eng/common/scripts/Update-DocsMsPackages.ps1 | 183 +- eng/common/scripts/Update-GeneratedSdks.ps1 | 16 + eng/common/scripts/Verify-Links.ps1 | 160 +- .../Verify-RequiredDocsJsonMembers.ps1 | 10 + eng/common/scripts/X509Certificate2/README.md | 24 + .../X509Certificate2/X509Certificate2.psm1 | 339 ++++ eng/common/scripts/common.ps1 | 10 +- eng/common/scripts/get-codeowners.lib.ps1 | 133 -- eng/common/scripts/get-codeowners.ps1 | 18 - .../stress-testing/deploy-stress-tests.ps1 | 13 +- .../stress-test-deployment-lib.ps1 | 83 +- eng/common/spelling/package-lock.json | 1694 ++++++++++------- eng/common/testproxy/dotnet-devcert.crt | 33 +- eng/common/testproxy/dotnet-devcert.pfx | Bin 2445 -> 2627 bytes .../README.md => onboarding/README.me} | 12 +- .../generate-assets-json.ps1 | 50 +- eng/common/testproxy/publish-proxy-logs.yml | 4 +- eng/common/testproxy/target_version.txt | 2 +- eng/config.json | 26 +- eng/pipelines/mgmt-auto-release.yml | 2 +- .../templates/jobs/archetype-go-release.yml | 7 +- .../jobs/archetype-sdk-client-samples.yml | 18 +- .../templates/jobs/archetype-sdk-client.yml | 49 +- .../jobs/archetype-sdk-eng-client.yml | 18 +- eng/pipelines/templates/jobs/live.tests.yml | 1 + .../templates/jobs/mgmt-mock-test.yml | 2 +- .../templates/stages/platform-matrix.json | 4 +- eng/pipelines/templates/steps/build-test.yml | 15 +- eng/pipelines/templates/variables/globals.yml | 8 +- eng/scripts/Build_Perf.ps1 | 14 +- eng/scripts/Language-Settings.ps1 | 4 +- eng/scripts/MgmtTestLib.ps1 | 9 +- eng/scripts/Replace-azcore.ps1 | 41 + eng/scripts/automation_init.sh | 6 +- eng/scripts/build.ps1 | 13 +- eng/tools/generator/autorest/generation.go | 2 +- .../generator/autorest/model/changelog.go | 2 +- .../cmd/v2/common/changelogProcessor_test.go | 15 +- .../generator/cmd/v2/common/fileProcessor.go | 122 +- .../cmd/v2/common/fileProcessor_test.go | 2 +- .../generator/cmd/v2/common/generation.go | 32 +- .../generator/cmd/v2/release/releaseCmd.go | 15 +- .../template/rpName/packageName/README.md.tpl | 2 +- eng/tools/internal/report/packages.go | 8 +- eng/tools/mgmtreport/mgmtreport.tpl | 6 +- sdk/azcore/CHANGELOG.md | 26 + sdk/azcore/arm/runtime/pipeline_test.go | 27 +- sdk/azcore/arm/runtime/policy_bearer_token.go | 62 +- .../arm/runtime/policy_bearer_token_test.go | 27 +- sdk/azcore/arm/runtime/policy_register_rp.go | 1 + .../arm/runtime/policy_register_rp_test.go | 11 +- sdk/azcore/core.go | 18 + sdk/azcore/core_test.go | 8 + sdk/azcore/go.mod | 6 +- sdk/azcore/go.sum | 11 +- sdk/azcore/internal/exported/exported.go | 74 + sdk/azcore/internal/exported/exported_test.go | 22 + sdk/azcore/internal/shared/constants.go | 2 +- sdk/azcore/internal/shared/shared.go | 29 +- sdk/azcore/messaging/cloud_event.go | 290 +++ sdk/azcore/messaging/cloud_event_test.go | 227 +++ .../messaging/example_usingcloudevent_test.go | 58 + .../cloudevent_binary_with_extensions.json | 15 + .../testdata/cloudevent_required_only.json | 6 + sdk/azcore/policy/examples_test.go | 46 + sdk/azcore/policy/policy.go | 21 + sdk/azcore/policy/policy_test.go | 53 + sdk/azcore/runtime/examples_test.go | 17 - sdk/azcore/runtime/pager.go | 41 + sdk/azcore/runtime/pager_test.go | 74 + sdk/azcore/runtime/policy_bearer_token.go | 4 + .../runtime/policy_bearer_token_test.go | 22 +- sdk/azcore/runtime/policy_http_header.go | 3 +- sdk/azcore/runtime/policy_include_response.go | 5 +- .../runtime/policy_include_response_test.go | 2 +- sdk/azcore/runtime/policy_key_credential.go | 49 + .../runtime/policy_key_credential_test.go | 50 + sdk/azcore/runtime/policy_retry.go | 3 +- sdk/azcore/runtime/policy_sas_credential.go | 39 + .../runtime/polilcy_sas_credential_test.go | 34 + sdk/azcore/runtime/poller_test.go | 14 +- sdk/azcore/runtime/request.go | 14 + sdk/azcore/runtime/request_test.go | 19 + 109 files changed, 4441 insertions(+), 1758 deletions(-) delete mode 100644 eng/common/pipelines/templates/steps/docs-metadata-release.yml create mode 100644 eng/common/pipelines/templates/steps/docsms-ensure-validation.yml create mode 100644 eng/common/scripts/Get-BuildSourceDescription.ps1 create mode 100644 eng/common/scripts/Helpers/CommandInvocation-Helpers.ps1 create mode 100644 eng/common/scripts/New-RegenerateMatrix.ps1 create mode 100644 eng/common/scripts/TypeSpec-Project-Process.ps1 create mode 100644 eng/common/scripts/Update-DocsMsPackageMonikers.ps1 create mode 100644 eng/common/scripts/Update-GeneratedSdks.ps1 create mode 100644 eng/common/scripts/X509Certificate2/README.md create mode 100644 eng/common/scripts/X509Certificate2/X509Certificate2.psm1 delete mode 100644 eng/common/scripts/get-codeowners.lib.ps1 delete mode 100644 eng/common/scripts/get-codeowners.ps1 rename eng/common/testproxy/{transition-scripts/README.md => onboarding/README.me} (92%) rename eng/common/testproxy/{transition-scripts => onboarding}/generate-assets-json.ps1 (91%) create mode 100644 eng/scripts/Replace-azcore.ps1 create mode 100644 sdk/azcore/messaging/cloud_event.go create mode 100644 sdk/azcore/messaging/cloud_event_test.go create mode 100644 sdk/azcore/messaging/example_usingcloudevent_test.go create mode 100644 sdk/azcore/messaging/testdata/cloudevent_binary_with_extensions.json create mode 100644 sdk/azcore/messaging/testdata/cloudevent_required_only.json create mode 100644 sdk/azcore/policy/examples_test.go create mode 100644 sdk/azcore/policy/policy_test.go delete mode 100644 sdk/azcore/runtime/examples_test.go create mode 100644 sdk/azcore/runtime/policy_key_credential.go create mode 100644 sdk/azcore/runtime/policy_key_credential_test.go create mode 100644 sdk/azcore/runtime/policy_sas_credential.go create mode 100644 sdk/azcore/runtime/polilcy_sas_credential_test.go diff --git a/eng/common/TestResources/README.md b/eng/common/TestResources/README.md index 757c7c337ac5..b63307e24530 100644 --- a/eng/common/TestResources/README.md +++ b/eng/common/TestResources/README.md @@ -89,6 +89,7 @@ Below is an example of how `$templateFileParameters` can be used to pass data fr **Snippet from `test-resources-pre.ps1`** ```powershell +Import-Module -Name ./eng/common/scripts/X509Certificate2 $cert = New-X509Certificate2 -SubjectName 'E=opensource@microsoft.com, CN=Azure SDK, OU=Azure SDK, O=Microsoft, L=Frisco, S=TX, C=US' -ValidDays 3652 # Create new entries in $templateFileParameters $templateFileParameters['ConfidentialLedgerPrincipalPEM'] = Format-X509Certificate2 -Certificate $cert diff --git a/eng/common/TestResources/SubConfig-Helpers.ps1 b/eng/common/TestResources/SubConfig-Helpers.ps1 index 4ef744828b84..9b69c516bd02 100644 --- a/eng/common/TestResources/SubConfig-Helpers.ps1 +++ b/eng/common/TestResources/SubConfig-Helpers.ps1 @@ -109,11 +109,17 @@ function SetSubscriptionConfiguration([object]$subscriptionConfiguration) # Mark values as secret so we don't print json blobs containing secrets in the logs. # Prepend underscore to the variable name, so we can still access the variable names via environment # variables if they get set subsequently. + if ([Environment]::GetEnvironmentVariable($nestedPair.Name)) { + throw "Environment variable '$($nestedPair.Name)' is already set. Check the tests.yml/ci.yml EnvVars parameter does not conflict with the subscription config json" + } if (ShouldMarkValueAsSecret "AZURE_" $nestedPair.Name $nestedPair.Value) { Write-Host "##vso[task.setvariable variable=_$($nestedPair.Name);issecret=true;]$($nestedPair.Value)" } } } else { + if ([Environment]::GetEnvironmentVariable($pair.Name)) { + throw "Environment variable '$($pair.Name)' is already set. Check the tests.yml/ci.yml EnvVars parameter does not conflict with the subscription config json" + } if (ShouldMarkValueAsSecret "AZURE_" $pair.Name $pair.Value) { Write-Host "##vso[task.setvariable variable=_$($pair.Name);issecret=true;]$($pair.Value)" } diff --git a/eng/common/TestResources/build-test-resource-config.yml b/eng/common/TestResources/build-test-resource-config.yml index 2335f94f48db..2f158c4754cf 100644 --- a/eng/common/TestResources/build-test-resource-config.yml +++ b/eng/common/TestResources/build-test-resource-config.yml @@ -5,6 +5,10 @@ parameters: - name: SubscriptionConfigurations type: object default: null + # EnvVars is used to help diagnose variable conflict issues early + - name: EnvVars + type: object + default: null steps: - ${{ if parameters.SubscriptionConfiguration }}: @@ -16,6 +20,8 @@ steps: . ./eng/common/TestResources/SubConfig-Helpers.ps1 SetSubscriptionConfiguration $config displayName: Initialize SubscriptionConfiguration variable + ${{ if parameters.EnvVars }}: + env: ${{ parameters.EnvVars }} - ${{ if parameters.SubscriptionConfigurations }}: - pwsh: | @@ -36,3 +42,5 @@ steps: UpdateSubscriptionConfiguration $configBase $config displayName: Merge Test Resource Configurations + ${{ if parameters.EnvVars }}: + env: ${{ parameters.EnvVars }} diff --git a/eng/common/pipelines/templates/steps/create-pull-request.yml b/eng/common/pipelines/templates/steps/create-pull-request.yml index df364d447862..57e413c2db78 100644 --- a/eng/common/pipelines/templates/steps/create-pull-request.yml +++ b/eng/common/pipelines/templates/steps/create-pull-request.yml @@ -13,9 +13,9 @@ parameters: PRTitle: not-specified PRBody: '' ScriptDirectory: eng/common/scripts - GHReviewersVariable: '' - GHTeamReviewersVariable: '' - GHAssignessVariable: '' + GHReviewers: '' + GHTeamReviewers: '' + GHAssignees: '' # Multiple labels seperated by comma, e.g. "bug, APIView" PRLabels: '' SkipCheckingForChanges: false @@ -52,8 +52,8 @@ steps: -PRTitle "${{ parameters.PRTitle }}" -PRBody "${{ coalesce(parameters.PRBody, parameters.CommitMsg, parameters.PRTitle) }}" -PRLabels "${{ parameters.PRLabels }}" - -UserReviewers "$(${{ parameters.GHReviewersVariable }})" - -TeamReviewers "$(${{ parameters.GHTeamReviewersVariable }})" - -Assignees "$(${{ parameters.GHAssignessVariable }})" + -UserReviewers "${{ parameters.GHReviewers }}" + -TeamReviewers "${{ parameters.GHTeamReviewers }}" + -Assignees "${{ parameters.GHAssignees }}" -CloseAfterOpenForTesting $${{ coalesce(parameters.CloseAfterOpenForTesting, 'false') }} -OpenAsDraft $${{ parameters.OpenAsDraft }} diff --git a/eng/common/pipelines/templates/steps/docs-metadata-release.yml b/eng/common/pipelines/templates/steps/docs-metadata-release.yml deleted file mode 100644 index 7b6fb183a54e..000000000000 --- a/eng/common/pipelines/templates/steps/docs-metadata-release.yml +++ /dev/null @@ -1,119 +0,0 @@ -# intended to be used as part of a release process -parameters: - - name: ArtifactLocation - type: string - default: 'not-specified' - - name: PackageRepository - type: string - default: 'not-specified' - - name: ReleaseSha - type: string - default: 'not-specified' - - name: RepoId - type: string - default: $(Build.Repository.Name) - - name: WorkingDirectory - type: string - default: '' - - name: ScriptDirectory - type: string - default: eng/common/scripts - - name: TargetDocRepoName - type: string - default: '' - - name: TargetDocRepoOwner - type: string - default: '' - - name: PRBranchName - type: string - default: 'main-rdme' - - name: PRLabels - type: string - default: 'auto-merge' - - name: ArtifactName - type: string - default: '' - - name: Language - type: string - default: '' - - name: DocRepoDestinationPath - type: string - default: '' #usually docs-ref-services/ - - name: CIConfigs - type: string - default: '[]' - - name: GHReviewersVariable - type: string - default: '' - - name: GHTeamReviewersVariable - type: string - default: '' # externally set, as eng-common does not have the identity-resolver. Run as pre-step - - name: OnboardingBranch - type: string - default: '' - - name: CloseAfterOpenForTesting - type: boolean - default: false - - name: SkipPackageJson - type: object - default: false - - name: SparseCheckoutPaths - type: object - default: null - -steps: -- pwsh: | - if ($IsWindows) { - REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem /f /v LongPathsEnabled /t REG_DWORD /d 1 - git config --system core.longpaths true - } - else { - Write-Host "This script is not executing on Windows, skipping registry modification." - } - displayName: Enable Long Paths if Necessary - -- ${{ if not(parameters.SparseCheckoutPaths) }}: - - pwsh: | - git clone https://github.com/${{ parameters.TargetDocRepoOwner }}/${{ parameters.TargetDocRepoName }} ${{ parameters.WorkingDirectory }}/repo - displayName: Clone Documentation Repository - ignoreLASTEXITCODE: false - -- ${{ if parameters.SparseCheckoutPaths }}: - - template: /eng/common/pipelines/templates/steps/sparse-checkout.yml - parameters: - SkipCheckoutNone: true - Repositories: - - Name: ${{ parameters.TargetDocRepoOwner }}/${{ parameters.TargetDocRepoName }} - WorkingDirectory: ${{ parameters.WorkingDirectory }}/repo - Paths: ${{ parameters.SparseCheckoutPaths }} - -- template: /eng/common/pipelines/templates/steps/set-default-branch.yml - parameters: - WorkingDirectory: ${{ parameters.WorkingDirectory }}/repo -- task: PowerShell@2 - displayName: 'Apply Documentation Updates From Artifact' - inputs: - targetType: filePath - filePath: ${{ parameters.ScriptDirectory }}/update-docs-metadata.ps1 - arguments: > - -ArtifactLocation ${{ parameters.ArtifactLocation }} - -Repository ${{ parameters.PackageRepository }} - -ReleaseSHA ${{ parameters.ReleaseSha }} - -RepoId ${{ parameters.RepoId }} - -WorkDirectory "${{ parameters.WorkingDirectory }}" - -DocRepoLocation "${{ parameters.WorkingDirectory }}/repo" - -Language "${{parameters.Language}}" - -Configs "${{ parameters.CIConfigs }}" - pwsh: true - env: - GH_TOKEN: $(azuresdk-github-pat) - -- template: /eng/common/pipelines/templates/steps/git-push-changes.yml - parameters: - BaseRepoBranch: $(DefaultBranch) - BaseRepoOwner: ${{ parameters.TargetDocRepoOwner }} - CommitMsg: "Update docs metadata and targeting for release of ${{ parameters.ArtifactName }}" - TargetRepoName: ${{ parameters.TargetDocRepoName }} - TargetRepoOwner: ${{ parameters.TargetDocRepoOwner }} - WorkingDirectory: ${{ parameters.WorkingDirectory }}/repo - ScriptDirectory: ${{ parameters.WorkingDirectory }}/${{ parameters.ScriptDirectory }} diff --git a/eng/common/pipelines/templates/steps/docsms-ensure-validation.yml b/eng/common/pipelines/templates/steps/docsms-ensure-validation.yml new file mode 100644 index 000000000000..5430f3912e9c --- /dev/null +++ b/eng/common/pipelines/templates/steps/docsms-ensure-validation.yml @@ -0,0 +1,12 @@ +steps: +# Fail the build if any of the packages failed validation. Valid values are +# "true" or "false". This step will skip if $(DocsMsPackagesAllValid) is not set +- pwsh: | + if ('$(DocsMsPackagesAllValid)' -eq 'true') { + Write-Host "All packages passed validation." + } else { + Write-Error "Some packages failed validation." + exit 1 + } + displayName: Check package validation results + condition: and(succeeded(), ne(variables['DocsMsPackagesAllValid'], '')) diff --git a/eng/common/pipelines/templates/steps/eng-common-workflow-enforcer.yml b/eng/common/pipelines/templates/steps/eng-common-workflow-enforcer.yml index ff4927b8bb5f..af8b009b5825 100644 --- a/eng/common/pipelines/templates/steps/eng-common-workflow-enforcer.yml +++ b/eng/common/pipelines/templates/steps/eng-common-workflow-enforcer.yml @@ -19,5 +19,15 @@ steps: exit 1 } } - displayName: Prevent changes to eng/common outside of azure-sdk-tools repo + if ((!"$(System.PullRequest.SourceBranch)".StartsWith("sync-.github/workflows")) -and "$(System.PullRequest.TargetBranch)" -match "^(refs/heads/)?$(DefaultBranch)$") + { + $filesInCommonDir = & "eng/common/scripts/get-changedfiles.ps1" -DiffPath '.github/workflows/*' + if (($LASTEXITCODE -eq 0) -and ($filesInCommonDir.Count -gt 0)) + { + Write-Host "##vso[task.LogIssue type=error;]Changes to files under '.github/workflows' directory should not be made in this Repo`n${filesInCommonDir}" + Write-Host "##vso[task.LogIssue type=error;]Please follow workflow at https://github.com/Azure/azure-sdk-tools/blob/main/doc/workflows/engsys_workflows.md" + exit 1 + } + } + displayName: Prevent changes to eng/common and .github/workflows outside of azure-sdk-tools repo condition: and(succeeded(), ne(variables['Skip.EngCommonWorkflowEnforcer'], 'true'), not(endsWith(variables['Build.Repository.Name'], '-pr'))) \ No newline at end of file diff --git a/eng/common/pipelines/templates/steps/sparse-checkout.yml b/eng/common/pipelines/templates/steps/sparse-checkout.yml index cee1fbb2d58e..448cb2c2e313 100644 --- a/eng/common/pipelines/templates/steps/sparse-checkout.yml +++ b/eng/common/pipelines/templates/steps/sparse-checkout.yml @@ -29,7 +29,7 @@ steps: if (!$dir) { $dir = "./$($repository.Name)" } - New-Item $dir -ItemType Directory -Force + New-Item $dir -ItemType Directory -Force | Out-Null Push-Location $dir if (Test-Path .git/info/sparse-checkout) { @@ -46,6 +46,10 @@ steps: git clone --no-checkout --filter=tree:0 https://github.com/$($repository.Name) . } + # Turn off git GC for sparse checkout. Note: The devops checkout task does this by default + Write-Host "git config gc.auto 0" + git config gc.auto 0 + Write-Host "git sparse-checkout init" git sparse-checkout init @@ -66,9 +70,14 @@ steps: # sparse-checkout commands after initial checkout will auto-checkout again if (!$hasInitialized) { - Write-Host "git -c advice.detachedHead=false checkout $($repository.Commitish)" + # Remove refs/heads/ prefix from branch names + $commitish = $repository.Commitish -replace '^refs/heads/', '' + + # use -- to prevent git from interpreting the commitish as a path + Write-Host "git -c advice.detachedHead=false checkout $commitish --" + # This will use the default branch if repo.Commitish is empty - git -c advice.detachedHead=false checkout $($repository.Commitish) + git -c advice.detachedHead=false checkout $commitish -- } else { Write-Host "Skipping checkout as repo has already been initialized" } diff --git a/eng/common/pipelines/templates/steps/update-docsms-metadata.yml b/eng/common/pipelines/templates/steps/update-docsms-metadata.yml index 2635ad479432..63856f160cec 100644 --- a/eng/common/pipelines/templates/steps/update-docsms-metadata.yml +++ b/eng/common/pipelines/templates/steps/update-docsms-metadata.yml @@ -100,10 +100,7 @@ steps: -Language '${{parameters.Language}}' ` -RepoId '${{ parameters.RepoId }}' ` -DocValidationImageId '${{ parameters.DocValidationImageId }}' ` - -PackageSourceOverride '${{ parameters.PackageSourceOverride }}' ` - -TenantId '$(opensource-aad-tenant-id)' ` - -ClientId '$(opensource-aad-app-id)' ` - -ClientSecret '$(opensource-aad-secret)' + -PackageSourceOverride '${{ parameters.PackageSourceOverride }}' displayName: Apply Documentation Updates - template: /eng/common/pipelines/templates/steps/git-push-changes.yml diff --git a/eng/common/scripts/Delete-RemoteBranches.ps1 b/eng/common/scripts/Delete-RemoteBranches.ps1 index 2d1c3c303316..c79ff03bd983 100644 --- a/eng/common/scripts/Delete-RemoteBranches.ps1 +++ b/eng/common/scripts/Delete-RemoteBranches.ps1 @@ -1,22 +1,23 @@ [CmdletBinding(SupportsShouldProcess)] param( - # The repo owner: e.g. Azure - $RepoOwner, - # The repo name. E.g. azure-sdk-for-java - $RepoName, # Please use the RepoOwner/RepoName format: e.g. Azure/azure-sdk-for-java - $RepoId="$RepoOwner/$RepoName", + $RepoId = "$RepoOwner/$RepoName", + # Upstream repo to check and see if there are existing open PRs from before deleting branch + $UpstreamRepoId, # CentralRepoId the original PR to generate sync PR. E.g Azure/azure-sdk-tools for eng/common $CentralRepoId, # We start from the sync PRs, use the branch name to get the PR number of central repo. E.g. sync-eng/common-()-(). Have group name on PR number. # For sync-eng/common work, we use regex as "^sync-eng/common.*-(?\d+).*$". + # For sync-.github/workflows work, we use regex as "^sync-.github/workflows.*-(?\d+).*$". $BranchRegex, # Date format: e.g. Tuesday, April 12, 2022 1:36:02 PM. Allow to use other date format. [AllowNull()] [DateTime]$LastCommitOlderThan, + [Switch]$DeleteBranchesEvenIfThereIsOpenPR = $false, [Parameter(Mandatory = $true)] $AuthToken ) +Set-StrictMode -version 3 . (Join-Path $PSScriptRoot common.ps1) @@ -43,33 +44,16 @@ foreach ($res in $responses) continue } - # Get all open sync PRs associate with branch. - try { - $head = "${RepoId}:${branchName}" - LogDebug "Operating on branch [ $branchName ]" - $pullRequests = Get-GitHubPullRequests -RepoId $RepoId -State "all" -Head $head -AuthToken $AuthToken - } - catch + # If we have a central PR that created this branch still open still don't delete the branch + if ($CentralRepoId) { - LogError "Get-GitHubPullRequests failed with exception:`n$_" - exit 1 - } - $openPullRequests = $pullRequests | ? { $_.State -eq "open" } - - if (!$CentralRepoId -and $openPullRequests.Count -gt 0) { - LogDebug "CentralRepoId is not configured and found open PRs associate with branch [ $branchName ]. Skipping..." - continue - } - - # check central PR - if ($CentralRepoId) { $pullRequestNumber = $Matches["PrNumber"] # If central PR number found, then skip if (!$pullRequestNumber) { LogError "No PR number found in the branch name. Please check the branch name [ $branchName ]. Skipping..." continue } - + try { $centralPR = Get-GitHubPullRequest -RepoId $CentralRepoId -PullRequestNumber $pullRequestNumber -AuthToken $AuthToken LogDebug "Found central PR pull request: $($centralPR.html_url)" @@ -78,7 +62,7 @@ foreach ($res in $responses) continue } } - catch + catch { # If there is no central PR for the PR number, log error and skip. LogError "Get-GitHubPullRequests failed with exception:`n$_" @@ -87,12 +71,33 @@ foreach ($res in $responses) } } - foreach ($openPullRequest in $openPullRequests) { - Write-Host "Open pull Request [ $($openPullRequest.html_url) ] will be closed after branch deletion." + # If this branch has an open PR in the repo or the upstream repo then don't delete + try + { + $head = "${RepoId}:${branchName}" + LogDebug "Operating on branch [ $branchName ]" + $pullRequests = Get-GitHubPullRequests -RepoId $RepoId -State "all" -Head $head -AuthToken $AuthToken + + # check to see if there are any PR's open in the main central repo as well. + if ($UpstreamRepoId) { + $pullRequests += Get-GitHubPullRequests -RepoId $UpstreamRepoId -State "all" -Head $head -AuthToken $AuthToken + } + } + catch + { + LogError "Get-GitHubPullRequests failed with exception:`n$_" + exit 1 + } + $openPullRequests = @($pullRequests | Where-Object { $_.State -eq "open" }) + + if ($openPullRequests.Count -gt 0 -and !$DeleteBranchesEvenIfThereIsOpenPR) { + LogDebug "CentralRepoId is not configured and found open PRs associate with branch [ $branchName ]. Skipping..." + continue } # If there is date filter, then check if branch last commit older than the date. - if ($LastCommitOlderThan) { + if ($LastCommitOlderThan) + { if (!$res.object -or !$res.object.url) { LogWarning "No commit url returned from response. Skipping... " continue @@ -107,19 +112,24 @@ foreach ($res in $responses) LogDebug "The branch $branch last commit date [ $commitDate ] is newer than the date $LastCommitOlderThan. Skipping." continue } - + LogDebug "Branch [ $branchName ] in repo [ $RepoId ] has a last commit date [ $commitDate ] that is older than $LastCommitOlderThan. " } catch { LogError "Get-GithubReferenceCommitDate failed with exception:`n$_" exit 1 } - } - - try { + } + + foreach ($openPullRequest in $openPullRequests) { + Write-Host "Open pull Request [ $($openPullRequest.html_url) ] will be closed after branch deletion." + } + + try + { if ($PSCmdlet.ShouldProcess("[ $branchName ] in [ $RepoId ]", "Deleting branches on cleanup script")) { Remove-GitHubSourceReferences -RepoId $RepoId -Ref $branch -AuthToken $AuthToken - Write-Host "The branch [ $branchName ] with sha [$($res.object.sha)] in [ $RepoId ] has been deleted." + Write-Host "The branch [ $branchName ] with sha [ $($res.object.sha) ] in [ $RepoId ] has been deleted." } } catch { diff --git a/eng/common/scripts/Get-BuildSourceDescription.ps1 b/eng/common/scripts/Get-BuildSourceDescription.ps1 new file mode 100644 index 000000000000..b0856101538d --- /dev/null +++ b/eng/common/scripts/Get-BuildSourceDescription.ps1 @@ -0,0 +1,24 @@ +param( + [string]$Variable, + [switch]$IsOutput +) + +$repoUrl = $env:BUILD_REPOSITORY_URI +$sourceBranch = $env:BUILD_SOURCEBRANCH + +$description = "[$sourceBranch]($repoUrl/tree/$sourceBranch)" +if ($sourceBranch -match "^refs/heads/(.+)$") { + $description = "Branch: [$($Matches[1])]($repoUrl/tree/$sourceBranch)" +} elseif ($sourceBranch -match "^refs/tags/(.+)$") { + $description = "Tag: [$($Matches[1])]($repoUrl/tree/$sourceBranch)" +} elseif ($sourceBranch -match "^refs/pull/(\d+)/(head|merge)$") { + $description = "Pull request: $repoUrl/pull/$($Matches[1])" +} + +if ($IsOutput) { + Write-Host "Setting output variable '$Variable' to '$description'" + Write-Host "##vso[task.setvariable variable=$Variable;isoutput=true]$description" +} else { + Write-Host "Setting variable '$Variable' to '$description'" + Write-Host "##vso[task.setvariable variable=$Variable]$description" +} diff --git a/eng/common/scripts/Helpers/CommandInvocation-Helpers.ps1 b/eng/common/scripts/Helpers/CommandInvocation-Helpers.ps1 new file mode 100644 index 000000000000..5dc0c8c7da1a --- /dev/null +++ b/eng/common/scripts/Helpers/CommandInvocation-Helpers.ps1 @@ -0,0 +1,42 @@ +function Invoke-LoggedCommand($Command, $ExecutePath, [switch]$GroupOutput) +{ + $pipelineBuild = !!$env:TF_BUILD + $startTime = Get-Date + + if($pipelineBuild -and $GroupOutput) { + Write-Host "##[group]$Command" + } else { + Write-Host "> $Command" + } + + if($ExecutePath) { + Push-Location $ExecutePath + } + + try { + Invoke-Expression $Command + + $duration = (Get-Date) - $startTime + + if($pipelineBuild -and $GroupOutput) { + Write-Host "##[endgroup]" + } + + if($LastExitCode -ne 0) + { + if($pipelineBuild) { + Write-Error "##[error]Command failed to execute ($duration): $Command`n" + } else { + Write-Error "Command failed to execute ($duration): $Command`n" + } + } + else { + Write-Host "Command succeeded ($duration)`n" + } + } + finally { + if($ExecutePath) { + Pop-Location + } + } +} diff --git a/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 b/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 index ba299856b2dc..ef730282e24a 100644 --- a/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 +++ b/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 @@ -135,7 +135,7 @@ function BuildHashKey() } $parentWorkItems = @{} -function FindParentWorkItem($serviceName, $packageDisplayName, $outputCommand = $false) +function FindParentWorkItem($serviceName, $packageDisplayName, $outputCommand = $false, $ignoreReleasePlannerTests = $true) { $key = BuildHashKey $serviceName $packageDisplayName if ($key -and $parentWorkItems.ContainsKey($key)) { @@ -154,10 +154,12 @@ function FindParentWorkItem($serviceName, $packageDisplayName, $outputCommand = else { $serviceCondition = "[ServiceName] <> ''" } - + if($ignoreReleasePlannerTests){ + $serviceCondition += " AND [Tags] NOT CONTAINS 'Release Planner App Test'" + } $query = "SELECT [ID], [ServiceName], [PackageDisplayName], [Parent] FROM WorkItems WHERE [Work Item Type] = 'Epic' AND ${serviceCondition}" - $fields = @("System.Id", "Custom.ServiceName", "Custom.PackageDisplayName", "System.Parent") + $fields = @("System.Id", "Custom.ServiceName", "Custom.PackageDisplayName", "System.Parent", "System.Tags") $workItems = Invoke-Query $fields $query $outputCommand @@ -180,13 +182,63 @@ function FindParentWorkItem($serviceName, $packageDisplayName, $outputCommand = return $null } +$releasePlanWorkItems = @{} +function FindReleasePlanWorkItem($serviceName, $packageDisplayName, $outputCommand = $false, $ignoreReleasePlannerTests = $true) +{ + $key = BuildHashKey $serviceName $packageDisplayName + if ($key -and $releasePlanWorkItems.ContainsKey($key)) { + return $releasePlanWorkItems[$key] + } + + if ($serviceName) { + $condition = "[ServiceName] = '${serviceName}'" + if ($packageDisplayName) { + $condition += " AND [PackageDisplayName] = '${packageDisplayName}'" + } + else { + $condition += " AND [PackageDisplayName] = ''" + } + } + else { + $condition = "[ServiceName] <> ''" + } + $condition += " AND [System.State] <> 'Finished'" + if($ignoreReleasePlannerTests){ + $condition += " AND [Tags] NOT CONTAINS 'Release Planner App Test'" + } + + $query = "SELECT [ID], [ServiceName], [PackageDisplayName], [Parent] FROM WorkItems WHERE [Work Item Type] = 'Release Plan' AND ${condition}" + + $fields = @("System.Id", "Custom.ServiceName", "Custom.PackageDisplayName", "System.Parent", "System.Tags") + + $workItems = Invoke-Query $fields $query $outputCommand + + foreach ($wi in $workItems) + { + $localKey = BuildHashKey $wi.fields["Custom.ServiceName"] $wi.fields["Custom.PackageDisplayName"] + if (!$localKey) { continue } + if ($releasePlanWorkItems.ContainsKey($localKey) -and $releasePlanWorkItems[$localKey].id -ne $wi.id) { + Write-Warning "Already found parent [$($releasePlanWorkItems[$localKey].id)] with key [$localKey], using that one instead of [$($wi.id)]." + } + else { + Write-Verbose "[$($wi.id)]$localKey - Cached" + $releasePlanWorkItems[$localKey] = $wi + } + } + + if ($key -and $releasePlanWorkItems.ContainsKey($key)) { + return $releasePlanWorkItems[$key] + } + return $null +} + $packageWorkItems = @{} $packageWorkItemWithoutKeyFields = @{} -function FindLatestPackageWorkItem($lang, $packageName, $outputCommand = $true) +function FindLatestPackageWorkItem($lang, $packageName, $outputCommand = $true, $ignoreReleasePlannerTests = $true) { # Cache all the versions of this package and language work items - $null = FindPackageWorkItem $lang $packageName -includeClosed $true -outputCommand $outputCommand + $null = FindPackageWorkItem $lang $packageName -includeClosed $true -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests $latestWI = $null foreach ($wi in $packageWorkItems.Values) @@ -206,7 +258,7 @@ function FindLatestPackageWorkItem($lang, $packageName, $outputCommand = $true) return $latestWI } -function FindPackageWorkItem($lang, $packageName, $version, $outputCommand = $true, $includeClosed = $false) +function FindPackageWorkItem($lang, $packageName, $version, $outputCommand = $true, $includeClosed = $false, $ignoreReleasePlannerTests = $true) { $key = BuildHashKeyNoNull $lang $packageName $version if ($key -and $packageWorkItems.ContainsKey($key)) { @@ -218,6 +270,7 @@ function FindPackageWorkItem($lang, $packageName, $version, $outputCommand = $tr $fields += "System.State" $fields += "System.AssignedTo" $fields += "System.Parent" + $fields += "System.Tags" $fields += "Custom.Language" $fields += "Custom.Package" $fields += "Custom.PackageDisplayName" @@ -251,7 +304,9 @@ function FindPackageWorkItem($lang, $packageName, $version, $outputCommand = $tr if ($version) { $query += " AND [PackageVersionMajorMinor] = '${version}'" } - + if($ignoreReleasePlannerTests){ + $query += " AND [Tags] NOT CONTAINS 'Release Planner App Test'" + } $workItems = Invoke-Query $fields $query $outputCommand foreach ($wi in $workItems) @@ -277,13 +332,13 @@ function FindPackageWorkItem($lang, $packageName, $version, $outputCommand = $tr return $null } -function InitializeWorkItemCache($outputCommand = $true, $includeClosed = $false) +function InitializeWorkItemCache($outputCommand = $true, $includeClosed = $false, $ignoreReleasePlannerTests = $true) { # Pass null to cache all service parents - $null = FindParentWorkItem -serviceName $null -packageDisplayName $null -outputCommand $outputCommand + $null = FindParentWorkItem -serviceName $null -packageDisplayName $null -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests # Pass null to cache all the package items - $null = FindPackageWorkItem -lang $null -packageName $null -version $null -outputCommand $outputCommand -includeClosed $includeClosed + $null = FindPackageWorkItem -lang $null -packageName $null -version $null -outputCommand $outputCommand -includeClosed $includeClosed -ignoreReleasePlannerTests $ignoreReleasePlannerTests } function GetCachedPackageWorkItems() @@ -490,22 +545,23 @@ function CreateOrUpdatePackageWorkItem($lang, $pkg, $verMajorMinor, $existingIte } } - $newparentItem = FindOrCreatePackageGroupParent $serviceName $pkgDisplayName -outputCommand $false + $newparentItem = FindOrCreateReleasePlanParent $serviceName $pkgDisplayName -outputCommand $false UpdateWorkItemParent $existingItem $newParentItem -outputCommand $outputCommand return $existingItem } - $parentItem = FindOrCreatePackageGroupParent $serviceName $pkgDisplayName -outputCommand $false + $parentItem = FindOrCreateReleasePlanParent $serviceName $pkgDisplayName -outputCommand $false $workItem = CreateWorkItem $title "Package" "Release" "Release" $fields $assignedTo $parentItem.id -outputCommand $outputCommand Write-Host "[$($workItem.id)]$lang - $pkgName($verMajorMinor) - Created" return $workItem } -function FindOrCreatePackageGroupParent($serviceName, $packageDisplayName, $outputCommand = $true) +function FindOrCreateReleasePlanParent($serviceName, $packageDisplayName, $outputCommand = $true, $ignoreReleasePlannerTests = $true) { - $existingItem = FindParentWorkItem $serviceName $packageDisplayName -outputCommand $outputCommand + $existingItem = FindReleasePlanWorkItem $serviceName $packageDisplayName -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests if ($existingItem) { - $newparentItem = FindOrCreateServiceParent $serviceName -outputCommand $outputCommand + Write-Host "Found existing release plan work item [$($existingItem.id)]" + $newparentItem = FindOrCreatePackageGroupParent $serviceName $packageDisplayName -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests UpdateWorkItemParent $existingItem $newParentItem return $existingItem } @@ -513,7 +569,31 @@ function FindOrCreatePackageGroupParent($serviceName, $packageDisplayName, $outp $fields = @() $fields += "`"PackageDisplayName=${packageDisplayName}`"" $fields += "`"ServiceName=${serviceName}`"" - $serviceParentItem = FindOrCreateServiceParent $serviceName -outputCommand $outputCommand + $productParentItem = FindOrCreatePackageGroupParent $serviceName $packageDisplayName -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests + $title = "Release Plan - $($packageDisplayName)" + $workItem = CreateWorkItem $title "Release Plan" "Release" "Release" $fields $null $productParentItem.id + + $localKey = BuildHashKey $serviceName $packageDisplayName + Write-Host "[$($workItem.id)]$localKey - Created release plan work item" + $releasePlanWorkItems[$localKey] = $workItem + return $workItem +} + +function FindOrCreatePackageGroupParent($serviceName, $packageDisplayName, $outputCommand = $true, $ignoreReleasePlannerTests = $true) +{ + $existingItem = FindParentWorkItem $serviceName $packageDisplayName -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests + if ($existingItem) { + Write-Host "Found existing product work item [$($existingItem.id)]" + $newparentItem = FindOrCreateServiceParent $serviceName -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests + UpdateWorkItemParent $existingItem $newParentItem + return $existingItem + } + + $fields = @() + $fields += "`"PackageDisplayName=${packageDisplayName}`"" + $fields += "`"ServiceName=${serviceName}`"" + $fields += "`"Custom.EpicType=Product`"" + $serviceParentItem = FindOrCreateServiceParent $serviceName -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests $workItem = CreateWorkItem $packageDisplayName "Epic" "Release" "Release" $fields $null $serviceParentItem.id $localKey = BuildHashKey $serviceName $packageDisplayName @@ -522,21 +602,23 @@ function FindOrCreatePackageGroupParent($serviceName, $packageDisplayName, $outp return $workItem } -function FindOrCreateServiceParent($serviceName, $outputCommand = $true) +function FindOrCreateServiceParent($serviceName, $outputCommand = $true, $ignoreReleasePlannerTests = $true) { - $serviceParent = FindParentWorkItem $serviceName -outputCommand $outputCommand + $serviceParent = FindParentWorkItem $serviceName -packageDisplayName $null -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests if ($serviceParent) { + Write-Host "Found existing service work item [$($serviceParent.id)]" return $serviceParent } $fields = @() $fields += "`"PackageDisplayName=`"" $fields += "`"ServiceName=${serviceName}`"" + $fields += "`"Custom.EpicType=Service`"" $parentId = $null $workItem = CreateWorkItem $serviceName "Epic" "Release" "Release" $fields $null $parentId -outputCommand $outputCommand $localKey = BuildHashKey $serviceName - Write-Host "[$($workItem.id)]$localKey - Created" + Write-Host "[$($workItem.id)]$localKey - Created service work item" $parentWorkItems[$localKey] = $workItem return $workItem } @@ -836,6 +918,15 @@ function UpdatePackageVersions($pkgWorkItem, $plannedVersions, $shippedVersions) $shippedVersionSet[$version.Version] = $version $updateShipped = $true } + else + { + # Check for any date update, general case would from be previous Unknown to date + if ($shippedVersionSet[$version.Version].Date -ne $version.Date) + { + $shippedVersionSet[$version.Version] = $version + $updateShipped = $true + } + } } $versionSet = @{} @@ -889,11 +980,11 @@ function UpdatePackageVersions($pkgWorkItem, $plannedVersions, $shippedVersions) # If we shipped a version after we set "In Release" state then reset the state to "Next Release Unknown" if ($pkgWorkItem.fields["System.State"] -eq "In Release") { - $lastShippedDate = [DateTime]$newShippedVersions[0].Date + $lastShippedDate = $newShippedVersions[0].Date -as [DateTime] $markedInReleaseDate = ([DateTime]$pkgWorkItem.fields["Microsoft.VSTS.Common.StateChangeDate"]) # We just shipped so lets set the state to "Next Release Unknown" - if ($markedInReleaseDate -le $lastShippedDate) + if ($lastShippedDate -and $markedInReleaseDate -le $lastShippedDate) { $fieldUpdates += @' { diff --git a/eng/common/scripts/Helpers/Metadata-Helpers.ps1 b/eng/common/scripts/Helpers/Metadata-Helpers.ps1 index bbc9eaa70c0e..3df2c0684a71 100644 --- a/eng/common/scripts/Helpers/Metadata-Helpers.ps1 +++ b/eng/common/scripts/Helpers/Metadata-Helpers.ps1 @@ -17,36 +17,6 @@ function Generate-AadToken ($TenantId, $ClientId, $ClientSecret) return $resp.access_token } -function GetMsAliasFromGithub ([string]$TenantId, [string]$ClientId, [string]$ClientSecret, [string]$GithubUser) -{ - # API documentation (out of date): https://github.com/microsoft/opensource-management-portal/blob/main/docs/api.md - $OpensourceAPIBaseURI = "https://repos.opensource.microsoft.com/api/people/links/github/$GithubUser" - - $Headers = @{ - "Content-Type" = "application/json" - "api-version" = "2019-10-01" - } - - try { - $opsAuthToken = Generate-AadToken -TenantId $TenantId -ClientId $ClientId -ClientSecret $ClientSecret - $Headers["Authorization"] = "Bearer $opsAuthToken" - Write-Host "Fetching aad identity for github user: $GithubUser" - $resp = Invoke-RestMethod $OpensourceAPIBaseURI -Method 'GET' -Headers $Headers -MaximumRetryCount 3 - } catch { - Write-Warning $_ - return $null - } - - $resp | Write-Verbose - - if ($resp.aad) { - Write-Host "Fetched aad identity $($resp.aad.alias) for github user $GithubUser. " - return $resp.aad.alias - } - Write-Warning "Failed to retrieve the aad identity from given github user: $GithubName" - return $null -} - function GetAllGithubUsers ([string]$TenantId, [string]$ClientId, [string]$ClientSecret) { # API documentation (out of date): https://github.com/microsoft/opensource-management-portal/blob/main/docs/api.md @@ -70,17 +40,6 @@ function GetAllGithubUsers ([string]$TenantId, [string]$ClientId, [string]$Clien return $resp } -function GetPrimaryCodeOwner ([string]$TargetDirectory) -{ - $codeOwnerArray = &"$PSScriptRoot/../get-codeowners.ps1" -TargetDirectory $TargetDirectory - if ($codeOwnerArray) { - Write-Host "Code Owners are $codeOwnerArray." - return $codeOwnerArray[0] - } - Write-Warning "No code owner found in $TargetDirectory." - return $null -} - function GetDocsMsService($packageInfo, $serviceName) { $service = $serviceName.ToLower().Replace(' ', '').Replace('/', '-') @@ -109,8 +68,13 @@ function compare-and-merge-metadata ($original, $updated) { return $updateMetdata } -function GenerateDocsMsMetadata($originalMetadata, $language, $languageDisplayName, $serviceName, $author, $msAuthor, $msService) -{ +function GenerateDocsMsMetadata( + $originalMetadata, + $language, + $languageDisplayName, + $serviceName, + $msService +) { $langTitle = "Azure $serviceName SDK for $languageDisplayName" $langDescription = "Reference for Azure $serviceName SDK for $languageDisplayName" $date = Get-Date -Format "MM/dd/yyyy" @@ -118,9 +82,7 @@ function GenerateDocsMsMetadata($originalMetadata, $language, $languageDisplayNa $metadataTable = [ordered]@{ "title"= $langTitle "description"= $langDescription - "author"= $author - "ms.author"= $msauthor - "ms.data"= $date + "ms.date"= $date "ms.topic"= "reference" "ms.devlang"= $language "ms.service"= $msService diff --git a/eng/common/scripts/Helpers/PSModule-Helpers.ps1 b/eng/common/scripts/Helpers/PSModule-Helpers.ps1 index d9a5afaab1b3..bfca8a4154d8 100644 --- a/eng/common/scripts/Helpers/PSModule-Helpers.ps1 +++ b/eng/common/scripts/Helpers/PSModule-Helpers.ps1 @@ -47,6 +47,7 @@ function Update-PSModulePathForCI() } } +# Manual test at eng/common-tests/psmodule-helpers/Install-Module-Parallel.ps1 # If we want to use another default repository other then PSGallery we can update the default parameters function Install-ModuleIfNotInstalled() { @@ -65,35 +66,53 @@ function Install-ModuleIfNotInstalled() if ($modules.Count -eq 0) { - $repositories = (Get-PSRepository).Where({ $_.SourceLocation -eq $repositoryUrl }) - if ($repositories.Count -eq 0) - { - Register-PSRepository -Name $repositoryUrl -SourceLocation $repositoryUrl -InstallationPolicy Trusted - $repositories = (Get-PSRepository).Where({ $_.SourceLocation -eq $repositoryUrl }) - if ($repositories.Count -eq 0) { - Write-Error "Failed to registory package repository $repositoryUrl." - return + # Use double-checked locking to avoid locking when module is already installed + $mutex = New-Object System.Threading.Mutex($false, "Install-ModuleIfNotInstalled") + $null = $mutex.WaitOne() + + try { + # Check installed modules again after acquiring lock + $modules = (Get-Module -ListAvailable $moduleName) + if ($version -as [Version]) { + $modules = $modules.Where({ [Version]$_.Version -ge [Version]$version }) } - } - $repository = $repositories[0] - - if ($repository.InstallationPolicy -ne "Trusted") { - Set-PSRepository -Name $repository.Name -InstallationPolicy "Trusted" - } - Write-Host "Installing module $moduleName with min version $version from $repositoryUrl" - # Install under CurrentUser scope so that the end up under $CurrentUserModulePath for caching - Install-Module $moduleName -MinimumVersion $version -Repository $repository.Name -Scope CurrentUser -Force - - # Ensure module installed - $modules = (Get-Module -ListAvailable $moduleName) - if ($version -as [Version]) { - $modules = $modules.Where({ [Version]$_.Version -ge [Version]$version }) + if ($modules.Count -eq 0) + { + $repositories = (Get-PSRepository).Where({ $_.SourceLocation -eq $repositoryUrl }) + if ($repositories.Count -eq 0) + { + Register-PSRepository -Name $repositoryUrl -SourceLocation $repositoryUrl -InstallationPolicy Trusted + $repositories = (Get-PSRepository).Where({ $_.SourceLocation -eq $repositoryUrl }) + if ($repositories.Count -eq 0) { + Write-Error "Failed to register package repository $repositoryUrl." + return + } + } + $repository = $repositories[0] + + if ($repository.InstallationPolicy -ne "Trusted") { + Set-PSRepository -Name $repository.Name -InstallationPolicy "Trusted" + } + + Write-Host "Installing module $moduleName with min version $version from $repositoryUrl" + # Install under CurrentUser scope so that the end up under $CurrentUserModulePath for caching + Install-Module $moduleName -MinimumVersion $version -Repository $repository.Name -Scope CurrentUser -Force + + # Ensure module installed + $modules = (Get-Module -ListAvailable $moduleName) + if ($version -as [Version]) { + $modules = $modules.Where({ [Version]$_.Version -ge [Version]$version }) + } + + if ($modules.Count -eq 0) { + Write-Error "Failed to install module $moduleName with version $version" + return + } + } } - - if ($modules.Count -eq 0) { - Write-Error "Failed to install module $moduleName with version $version" - return + finally { + $mutex.ReleaseMutex() } } diff --git a/eng/common/scripts/Helpers/Resource-Helpers.ps1 b/eng/common/scripts/Helpers/Resource-Helpers.ps1 index cbeee3bc65c6..6c02e9150e24 100644 --- a/eng/common/scripts/Helpers/Resource-Helpers.ps1 +++ b/eng/common/scripts/Helpers/Resource-Helpers.ps1 @@ -49,7 +49,7 @@ function Get-PurgeableResources { Write-Verbose "Retrieving deleted Managed HSMs from subscription $subscriptionId" # Get deleted Managed HSMs for the current subscription. - $response = Invoke-AzRestMethod -Method GET -Path "/subscriptions/$subscriptionId/providers/Microsoft.KeyVault/deletedManagedHSMs?api-version=2021-04-01-preview" -ErrorAction Ignore + $response = Invoke-AzRestMethod -Method GET -Path "/subscriptions/$subscriptionId/providers/Microsoft.KeyVault/deletedManagedHSMs?api-version=2023-02-01" -ErrorAction Ignore if ($response.StatusCode -ge 200 -and $response.StatusCode -lt 300 -and $response.Content) { $content = $response.Content | ConvertFrom-Json @@ -123,7 +123,7 @@ filter Remove-PurgeableResources { 'Key Vault' { if ($r.EnablePurgeProtection) { # We will try anyway but will ignore errors. - Write-Warning "Key Vault '$($r.VaultName)' has purge protection enabled and may not be purged for $($r.SoftDeleteRetentionInDays) days" + Write-Warning "Key Vault '$($r.VaultName)' has purge protection enabled and may not be purged until $($r.ScheduledPurgeDate)" } # Use `-AsJob` to start a lightweight, cancellable job and pass to `Wait-PurgeableResoruceJob` for consistent behavior. @@ -134,11 +134,11 @@ filter Remove-PurgeableResources { 'Managed HSM' { if ($r.EnablePurgeProtection) { # We will try anyway but will ignore errors. - Write-Warning "Managed HSM '$($r.Name)' has purge protection enabled and may not be purged for $($r.SoftDeleteRetentionInDays) days" + Write-Warning "Managed HSM '$($r.Name)' has purge protection enabled and may not be purged until $($r.ScheduledPurgeDate)" } # Use `GetNewClosure()` on the `-Action` ScriptBlock to make sure variables are captured. - Invoke-AzRestMethod -Method POST -Path "/subscriptions/$subscriptionId/providers/Microsoft.KeyVault/locations/$($r.Location)/deletedManagedHSMs/$($r.Name)/purge?api-version=2021-04-01-preview" -ErrorAction Ignore -AsJob ` + Invoke-AzRestMethod -Method POST -Path "/subscriptions/$subscriptionId/providers/Microsoft.KeyVault/locations/$($r.Location)/deletedManagedHSMs/$($r.Name)/purge?api-version=2023-02-01" -ErrorAction Ignore -AsJob ` | Wait-PurgeableResourceJob -Resource $r -Timeout $Timeout -PassThru:$PassThru -Action { param ( $response ) if ($response.StatusCode -ge 200 -and $response.StatusCode -lt 300) { diff --git a/eng/common/scripts/Helpers/Service-Level-Readme-Automation-Helpers.ps1 b/eng/common/scripts/Helpers/Service-Level-Readme-Automation-Helpers.ps1 index 75742426e91c..4382b6159f17 100644 --- a/eng/common/scripts/Helpers/Service-Level-Readme-Automation-Helpers.ps1 +++ b/eng/common/scripts/Helpers/Service-Level-Readme-Automation-Helpers.ps1 @@ -1,8 +1,15 @@ -function create-service-readme($readmeFolder, $readmeName, $moniker, $msService, $indexTableLink, $serviceName, $author, $msAuthor) -{ +function create-service-readme( + $readmeFolder, + $readmeName, + $moniker, + $msService, + $indexTableLink, + $serviceName +) { + $readmePath = Join-Path $readmeFolder -ChildPath $readmeName - $content = "" + $content = "" if (Test-Path (Join-Path $readmeFolder -ChildPath $indexTableLink)) { $content = "## Packages - $moniker`r`n" $content += "[!INCLUDE [packages]($indexTableLink)]" @@ -13,8 +20,12 @@ function create-service-readme($readmeFolder, $readmeName, $moniker, $msService, } # Generate the front-matter for docs needs # $Language, $LanguageDisplayName are the variables globally defined in Language-Settings.ps1 - $metadataString = GenerateDocsMsMetadata -language $Language -languageDisplayName $LanguageDisplayName -serviceName $serviceName ` - -author $author -msAuthor $msAuthor -msService $msService + $metadataString = GenerateDocsMsMetadata ` + -language $Language ` + -languageDisplayName $LanguageDisplayName ` + -serviceName $serviceName ` + -msService $msService + Add-Content -Path $readmePath -Value $metadataString -NoNewline # Add tables, conbined client and mgmt together. @@ -34,14 +45,20 @@ function update-metadata-table($readmeFolder, $readmeName, $serviceName, $msServ $restContent = $Matches["content"].trim() $metadata = $Matches["metadata"].trim() } + # $Language, $LanguageDisplayName are the variables globally defined in Language-Settings.ps1 - $metadataString = GenerateDocsMsMetadata -originalMetadata $metadata -language $Language -languageDisplayName $LanguageDisplayName -serviceName $serviceName ` - -author $author -msAuthor $msAuthor -msService $msService + $metadataString = GenerateDocsMsMetadata ` + -originalMetadata $metadata ` + -language $Language ` + -languageDisplayName $LanguageDisplayName ` + -serviceName $serviceName ` + -msService $msService + Set-Content -Path $readmePath -Value "$metadataString$restContent" -NoNewline } function generate-markdown-table($readmeFolder, $readmeName, $packageInfos, $moniker) { - $tableHeader = "| Reference | Package | Source |`r`n|---|---|---|`r`n" + $tableHeader = "| Reference | Package | Source |`r`n|---|---|---|`r`n" $tableContent = "" $packageInfos = $packageInfos | Sort-Object -Property Type,Package # Here is the table, the versioned value will @@ -54,7 +71,7 @@ function generate-markdown-table($readmeFolder, $readmeName, $packageInfos, $mon if (Test-Path "Function:$GetPackageLevelReadmeFn") { $packageLevelReadme = &$GetPackageLevelReadmeFn -packageMetadata $pkg } - + $referenceLink = "[$($pkg.DisplayName)]($packageLevelReadme-readme.md)" if (!(Test-Path (Join-Path $readmeFolder -ChildPath "$packageLevelReadme-readme.md"))) { $referenceLink = $pkg.DisplayName @@ -72,19 +89,41 @@ function generate-markdown-table($readmeFolder, $readmeName, $packageInfos, $mon } } -function generate-service-level-readme($docRepoLocation, $readmeBaseName, $pathPrefix, $packageInfos, $serviceName, $moniker, $author, $msAuthor, $msService) { +function generate-service-level-readme( + $docRepoLocation, + $readmeBaseName, + $pathPrefix, + $packageInfos, + $serviceName, + $moniker, + $msService +) { $readmeFolder = "$docRepoLocation/$pathPrefix/$moniker/" $serviceReadme = "$readmeBaseName.md" $indexReadme = "$readmeBaseName-index.md" + if ($packageInfos) { - generate-markdown-table -readmeFolder $readmeFolder -readmeName $indexReadme -packageInfos $packageInfos -moniker $moniker + generate-markdown-table ` + -readmeFolder $readmeFolder ` + -readmeName $indexReadme ` + -packageInfos $packageInfos ` + -moniker $moniker } + if (!(Test-Path "$readmeFolder$serviceReadme") -and $packageInfos) { - create-service-readme -readmeFolder $readmeFolder -readmeName $serviceReadme -moniker $moniker -msService $msService ` - -indexTableLink $indexReadme -serviceName $serviceName -author $author -msAuthor $msAuthor - } - elseif (Test-Path "$readmeFolder$serviceReadme") { - update-metadata-table -readmeFolder $readmeFolder -readmeName $serviceReadme -serviceName $serviceName ` - -msService $msService -author $author -msAuthor $msAuthor + create-service-readme ` + -readmeFolder $readmeFolder ` + -readmeName $serviceReadme ` + -moniker $moniker ` + -msService $msService ` + -indexTableLink $indexReadme ` + -serviceName $serviceName + + } elseif (Test-Path "$readmeFolder$serviceReadme") { + update-metadata-table ` + -readmeFolder $readmeFolder ` + -readmeName $serviceReadme ` + -serviceName $serviceName ` + -msService $msService } } \ No newline at end of file diff --git a/eng/common/scripts/New-RegenerateMatrix.ps1 b/eng/common/scripts/New-RegenerateMatrix.ps1 new file mode 100644 index 000000000000..1df97420c25d --- /dev/null +++ b/eng/common/scripts/New-RegenerateMatrix.ps1 @@ -0,0 +1,102 @@ +[CmdLetBinding()] +param ( + [Parameter()] + [string]$OutputDirectory, + + [Parameter()] + [string]$OutputVariableName, + + [Parameter()] + [int]$JobCount = 8, + + # The minimum number of items per job. If the number of items is less than this, then the number of jobs will be reduced. + [Parameter()] + [int]$MinimumPerJob = 10, + + [Parameter()] + [string]$OnlyTypespec +) + +. (Join-Path $PSScriptRoot common.ps1) + +[bool]$OnlyTypespec = $OnlyTypespec -in @("true", "t", "1", "yes", "y") + +# Divide the items into groups of approximately equal size. +function Split-Items([array]$Items) { + # given $Items.Length = 22 and $JobCount = 5 + # then $itemsPerGroup = 4 + # and $largeJobCount = 2 + # and $group.Length = 5, 5, 4, 4, 4 + $itemCount = $Items.Length + $jobsForMinimum = $itemCount -lt $MinimumPerJob ? 1 : [math]::Floor($itemCount / $MinimumPerJob) + + if ($JobCount -gt $jobsForMinimum) { + $JobCount = $jobsForMinimum + } + + $itemsPerGroup = [math]::Floor($itemCount / $JobCount) + $largeJobCount = $itemCount % $itemsPerGroup + $groups = [object[]]::new($JobCount) + + $i = 0 + for ($g = 0; $g -lt $JobCount; $g++) { + $groupLength = if ($g -lt $largeJobCount) { $itemsPerGroup + 1 } else { $itemsPerGroup } + $group = [object[]]::new($groupLength) + $groups[$g] = $group + for ($gi = 0; $gi -lt $groupLength; $gi++) { + $group[$gi] = $Items[$i++] + } + } + + Write-Host "$itemCount items split into $JobCount groups of approximately $itemsPerGroup items each." + + return , $groups +} + +# ensure the output directory exists +New-Item -ItemType Directory -Path $OutputDirectory -Force | Out-Null + +if (Test-Path "Function:$GetDirectoriesForGenerationFn") { + $directoriesForGeneration = &$GetDirectoriesForGenerationFn +} +else { + $directoriesForGeneration = Get-ChildItem "$RepoRoot/sdk" -Directory | Get-ChildItem -Directory +} + +if ($OnlyTypespec) { + $directoriesForGeneration = $directoriesForGeneration | Where-Object { Test-Path "$_/tsp-location.yaml" } +} + +[array]$packageDirectories = $directoriesForGeneration +| Sort-Object -Property FullName +| ForEach-Object { + [ordered]@{ + "PackageDirectory" = "$($_.Parent.Name)/$($_.Name)" + "ServiceArea" = $_.Parent.Name + } +} + +$batches = Split-Items -Items $packageDirectories + +$matrix = [ordered]@{} +for ($i = 0; $i -lt $batches.Length; $i++) { + $batch = $batches[$i] + $json = $batch.PackageDirectory | ConvertTo-Json -AsArray + + $firstPrefix = $batch[0].ServiceArea.Substring(0, 2) + $lastPrefix = $batch[-1].ServiceArea.Substring(0, 2) + + $key = "$firstPrefix`_$lastPrefix`_$i" + $fileName = "$key.json" + + Write-Host "`n`n==================================" + Write-Host $fileName + Write-Host "==================================" + $json | Out-Host + $json | Out-File "$OutputDirectory/$fileName" + + $matrix[$key] = [ordered]@{ "JobKey" = $key; "DirectoryList" = $fileName } +} + +$compressed = ConvertTo-Json $matrix -Depth 100 -Compress +Write-Output "##vso[task.setVariable variable=$OutputVariableName;isOutput=true]$compressed" diff --git a/eng/common/scripts/Save-Package-Properties.ps1 b/eng/common/scripts/Save-Package-Properties.ps1 index 6fb9e61ee0f2..44f622357753 100644 --- a/eng/common/scripts/Save-Package-Properties.ps1 +++ b/eng/common/scripts/Save-Package-Properties.ps1 @@ -10,6 +10,10 @@ an artifact name property is available in the package properties. Can optionally add a dev version property which can be used logic for daily builds. +In cases of collisions where track 2 packages (IsNewSdk = true) have the same +filename as track 1 packages (e.g. same artifact name or package name), the +track 2 package properties will be written. + .PARAMETER serviceDirectory Service directory in which to search for packages @@ -87,6 +91,7 @@ function GetRelativePath($path) { return $relativePath } +$exportedPaths = @{} $allPackageProperties = Get-AllPkgProperties $serviceDirectory if ($allPackageProperties) { @@ -114,6 +119,15 @@ if ($allPackageProperties) Write-Host "Creating directory $($outDir) for json property file" New-Item -ItemType Directory -Path $outDir } + + # If package properties for a track 2 (IsNewSdk = true) package has + # already been written, skip writing to that same path. + if ($exportedPaths.ContainsKey($outputPath) -and $exportedPaths[$outputPath].IsNewSdk -eq $true) { + Write-Host "Track 2 package info with file name $($outputPath) already exported. Skipping export." + continue + } + $exportedPaths[$outputPath] = $pkg + SetOutput $outputPath $pkg } diff --git a/eng/common/scripts/Service-Level-Readme-Automation.ps1 b/eng/common/scripts/Service-Level-Readme-Automation.ps1 index 2d0e5c67920a..10dbee36edff 100644 --- a/eng/common/scripts/Service-Level-Readme-Automation.ps1 +++ b/eng/common/scripts/Service-Level-Readme-Automation.ps1 @@ -1,27 +1,18 @@ <# .SYNOPSIS -The script is to generate service level readme if it is missing. +The script is to generate service level readme if it is missing. For exist ones, we do 2 things here: 1. Generate the client but not import to the existing service level readme. 2. Update the metadata of service level readme .DESCRIPTION -Given a doc repo location, and the credential for fetching the ms.author. +Given a doc repo location, and the credential for fetching the ms.author. Generate missing service level readme and updating metadata of the existing ones. .PARAMETER DocRepoLocation Location of the documentation repo. This repo may be sparsely checked out depending on the requirements for the domain -.PARAMETER TenantId -The aad tenant id/object id for ms.author. - -.PARAMETER ClientId -The add client id/application id for ms.author. - -.PARAMETER ClientSecret -The client secret of add app for ms.author. - .PARAMETER ReadmeFolderRoot The readme folder root path, use default value here for backward compability. E.g. docs-ref-services in Java, JS, Python, api/overview/azure #> @@ -31,16 +22,10 @@ param( [string] $DocRepoLocation, [Parameter(Mandatory = $false)] - [string]$TenantId, + [string]$ReadmeFolderRoot = "docs-ref-services", [Parameter(Mandatory = $false)] - [string]$ClientId, - - [Parameter(Mandatory = $false)] - [string]$ClientSecret, - - [Parameter(Mandatory = $false)] - [string]$ReadmeFolderRoot = "docs-ref-services" + [array]$Monikers = @('latest', 'preview', 'legacy') ) . $PSScriptRoot/common.ps1 . $PSScriptRoot/Helpers/Service-Level-Readme-Automation-Helpers.ps1 @@ -50,12 +35,11 @@ param( Set-StrictMode -Version 3 $fullMetadata = Get-CSVMetadata -$monikers = @("latest", "preview") -foreach($moniker in $monikers) { +foreach($moniker in $Monikers) { # The onboarded packages return is key-value pair, which key is the package index, and value is the package info from {metadata}.json - # E.g. + # E.g. # Key as: @azure/storage-blob - # Value as: + # Value as: # { # "Name": "@azure/storage-blob", # "Version": "12.10.0-beta.1", @@ -73,22 +57,38 @@ foreach($moniker in $monikers) { $onboardedPackages = &$GetOnboardedDocsMsPackagesForMonikerFn ` -DocRepoLocation $DocRepoLocation -moniker $moniker $csvMetadata = @() + foreach($metadataEntry in $fullMetadata) { if ($metadataEntry.Package -and $metadataEntry.Hide -ne 'true') { $pkgKey = GetPackageKey $metadataEntry - if($onboardedPackages.ContainsKey($pkgKey)) { - if ($onboardedPackages[$pkgKey] -and $onboardedPackages[$pkgKey].DirectoryPath) { - if (!($metadataEntry.PSObject.Members.Name -contains "DirectoryPath")) { - Add-Member -InputObject $metadataEntry ` - -MemberType NoteProperty ` - -Name DirectoryPath ` - -Value $onboardedPackages[$pkgKey].DirectoryPath - } - } + + if (!$onboardedPackages.ContainsKey($pkgKey)) { + continue + } + + $package = $onboardedPackages[$pkgKey] + + if (!$package) { $csvMetadata += $metadataEntry + continue + } + + # If the metadata JSON entry has a DirectoryPath, but the CSV entry + # does not, add the DirectoryPath to the CSV entry + if (($package.PSObject.Members.Name -contains 'DirectoryPath') ` + -and !($metadataEntry.PSObject.Members.Name -contains "DirectoryPath") ) { + + Add-Member -InputObject $metadataEntry ` + -MemberType NoteProperty ` + -Name DirectoryPath ` + -Value $package.DirectoryPath } + + $csvMetadata += $metadataEntry + } } + $packagesForService = @{} $allPackages = GetPackageLookup $csvMetadata foreach ($metadataKey in $allPackages.Keys) { @@ -114,26 +114,17 @@ foreach($moniker in $monikers) { Write-Host "Building service: $service" $servicePackages = $packagesForService.Values.Where({ $_.ServiceName -eq $service }) $serviceReadmeBaseName = ServiceLevelReadmeNameStyle -serviceName $service - # Github url for source code: e.g. https://github.com/Azure/azure-sdk-for-js - $serviceBaseName = ServiceLevelReadmeNameStyle $service - $author = GetPrimaryCodeOwner -TargetDirectory "/sdk/$serviceBaseName/" - $msauthor = "" - if (!$author) { - LogError "Cannot fetch the author from CODEOWNER file." - $author = "" - } - elseif ($TenantId -and $ClientId -and $ClientSecret) { - $msauthor = GetMsAliasFromGithub -TenantId $tenantId -ClientId $clientId -ClientSecret $clientSecret -GithubUser $author - } - # Default value - if (!$msauthor) { - LogError "No ms.author found for $author. " - $msauthor = $author - } + # Add ability to override # Fetch the service readme name $msService = GetDocsMsService -packageInfo $servicePackages[0] -serviceName $service - generate-service-level-readme -docRepoLocation $DocRepoLocation -readmeBaseName $serviceReadmeBaseName -pathPrefix $ReadmeFolderRoot ` - -packageInfos $servicePackages -serviceName $service -moniker $moniker -author $author -msAuthor $msauthor -msService $msService + generate-service-level-readme ` + -docRepoLocation $DocRepoLocation ` + -readmeBaseName $serviceReadmeBaseName ` + -pathPrefix $ReadmeFolderRoot ` + -packageInfos $servicePackages ` + -serviceName $service ` + -moniker $moniker ` + -msService $msService } } diff --git a/eng/common/scripts/Test-SampleMetadata.ps1 b/eng/common/scripts/Test-SampleMetadata.ps1 index c20396b0a96b..d0a4670113a8 100644 --- a/eng/common/scripts/Test-SampleMetadata.ps1 +++ b/eng/common/scripts/Test-SampleMetadata.ps1 @@ -247,6 +247,7 @@ begin { "azure-network-watcher", "azure-notebooks", "azure-notification-hubs", + "azure-openai", "azure-open-datasets", "azure-personalizer", "azure-pipelines", diff --git a/eng/common/scripts/TypeSpec-Project-Generate.ps1 b/eng/common/scripts/TypeSpec-Project-Generate.ps1 index feba00d37ed8..05a0e0bdfd45 100644 --- a/eng/common/scripts/TypeSpec-Project-Generate.ps1 +++ b/eng/common/scripts/TypeSpec-Project-Generate.ps1 @@ -5,12 +5,13 @@ param ( [Parameter(Position=0)] [ValidateNotNullOrEmpty()] [string] $ProjectDirectory, - [Parameter(Position=1)] - [string] $typespecAdditionalOptions ## addtional typespec emitter options, separated by semicolon if more than one, e.g. option1=value1;option2=value2 + [string] $TypespecAdditionalOptions = $null, ## addtional typespec emitter options, separated by semicolon if more than one, e.g. option1=value1;option2=value2 + [switch] $SaveInputs = $false ## saves the temporary files during execution, default false ) $ErrorActionPreference = "Stop" . $PSScriptRoot/Helpers/PSModule-Helpers.ps1 +. $PSScriptRoot/Helpers/CommandInvocation-Helpers.ps1 . $PSScriptRoot/common.ps1 Install-ModuleIfNotInstalled "powershell-yaml" "0.4.1" | Import-Module @@ -21,31 +22,51 @@ function NpmInstallForProject([string]$workingDirectory) { Write-Host "Generating from $currentDur" if (Test-Path "package.json") { + Write-Host "Removing existing package.json" Remove-Item -Path "package.json" -Force } if (Test-Path ".npmrc") { + Write-Host "Removing existing .nprc" Remove-Item -Path ".npmrc" -Force } if (Test-Path "node_modules") { + Write-Host "Removing existing node_modules" Remove-Item -Path "node_modules" -Force -Recurse } if (Test-Path "package-lock.json") { + Write-Host "Removing existing package-lock.json" Remove-Item -Path "package-lock.json" -Force } - #default to root/eng/emitter-package.json but you can override by writing - #Get-${Language}-EmitterPackageJsonPath in your Language-Settings.ps1 - $replacementPackageJson = "$PSScriptRoot/../../emitter-package.json" - if (Test-Path "Function:$GetEmitterPackageJsonPathFn") { - $replacementPackageJson = &$GetEmitterPackageJsonPathFn - } + $replacementPackageJson = Join-Path $PSScriptRoot "../../emitter-package.json" Write-Host("Copying package.json from $replacementPackageJson") Copy-Item -Path $replacementPackageJson -Destination "package.json" -Force - npm install --no-lock-file + $emitterPackageLock = Join-Path $PSScriptRoot "../../emitter-package-lock.json" + $usingLockFile = Test-Path $emitterPackageLock + + if ($usingLockFile) { + Write-Host("Copying package-lock.json from $emitterPackageLock") + Copy-Item -Path $emitterPackageLock -Destination "package-lock.json" -Force + } + + $useAlphaNpmRegistry = (Get-Content $replacementPackageJson -Raw).Contains("-alpha.") + + if($useAlphaNpmRegistry) { + Write-Host "Package.json contains '-alpha.' in the version, Creating .npmrc using public/azure-sdk-for-js-test-autorest feed." + "registry=https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-js-test-autorest@local/npm/registry/ `n`nalways-auth=true" | Out-File '.npmrc' + } + + if ($usingLockFile) { + Invoke-LoggedCommand "npm ci" + } + else { + Invoke-LoggedCommand "npm install" + } + if ($LASTEXITCODE) { exit $LASTEXITCODE } } finally { @@ -80,12 +101,17 @@ try { } } $typespecCompileCommand = "npx tsp compile $mainTypeSpecFile --emit $emitterName$emitterAdditionalOptions" - if ($typespecAdditionalOptions) { - $options = $typespecAdditionalOptions.Split(";"); + if ($TypespecAdditionalOptions) { + $options = $TypespecAdditionalOptions.Split(";"); foreach ($option in $options) { $typespecCompileCommand += " --option $emitterName.$option" } } + + if ($SaveInputs) { + $typespecCompileCommand += " --option $emitterName.save-inputs=true" + } + Write-Host($typespecCompileCommand) Invoke-Expression $typespecCompileCommand @@ -95,7 +121,8 @@ finally { Pop-Location } -$shouldCleanUp = $configuration["cleanup"] ?? $true +$shouldCleanUp = !$SaveInputs if ($shouldCleanUp) { Remove-Item $tempFolder -Recurse -Force } +exit 0 diff --git a/eng/common/scripts/TypeSpec-Project-Process.ps1 b/eng/common/scripts/TypeSpec-Project-Process.ps1 new file mode 100644 index 000000000000..7b894379e925 --- /dev/null +++ b/eng/common/scripts/TypeSpec-Project-Process.ps1 @@ -0,0 +1,228 @@ +# For details see https://github.com/Azure/azure-sdk-tools/blob/main/doc/common/TypeSpec-Project-Scripts.md + +[CmdletBinding()] +param ( + [Parameter(Position = 0)] + [ValidateNotNullOrEmpty()] + [string] $TypeSpecProjectDirectory, # A directory of `tspconfig.yaml` or a remoteUrl of `tspconfig.yaml` + [Parameter(Position = 1)] + [string] $CommitHash, + [Parameter(Position = 2)] + [string] $RepoUrl, + [switch] $SkipSyncAndGenerate +) + +. $PSScriptRoot/common.ps1 +. $PSScriptRoot/Helpers/PSModule-Helpers.ps1 +Install-ModuleIfNotInstalled "powershell-yaml" "0.4.1" | Import-Module + +function CreateUpdate-TspLocation([System.Object]$tspConfig, [string]$TypeSpecProjectDirectory, [string]$CommitHash, [string]$repo, [string]$repoRoot, [ref]$isNewSdkProject) { + $additionalDirs = @() + if ($tspConfig["parameters"]["dependencies"] -and $tspConfig["parameters"]["dependencies"]["additionalDirectories"]) { + $additionalDirs = $tspConfig["parameters"]["dependencies"]["additionalDirectories"]; + } + + # Create service-dir if not exist + $serviceDir = Get-ServiceDir $tspConfig $repoRoot + if (!(Test-Path -Path $serviceDir)) { + New-Item -Path $serviceDir -ItemType Directory | Out-Null + Write-Host "created service folder $serviceDir" + } + + # Create package-dir if not exist + $packageDir = Get-PackageDir $tspConfig + $packageDir = Join-Path $serviceDir $packageDir + if (!(Test-Path -Path $packageDir)) { + New-Item -Path $packageDir -ItemType Directory | Out-Null + Write-Host "created package folder $packageDir" + $isNewSdkProject.Value = $true + } + + # Load tsp-location.yaml if exist + $tspLocationYamlPath = Join-Path $packageDir "tsp-location.yaml" + $tspLocationYaml = @{} + if (Test-Path -Path $tspLocationYamlPath) { + $tspLocationYaml = Get-Content -Path $tspLocationYamlPath -Raw | ConvertFrom-Yaml + } + else { + Write-Host "creating tsp-location.yaml in $packageDir" + } + + # Update tsp-location.yaml + $tspLocationYaml["commit"] = $CommitHash + Write-Host "updated tsp-location.yaml commit to $CommitHash" + $tspLocationYaml["repo"] = $repo + Write-Host "updated tsp-location.yaml repo to $repo" + $tspLocationYaml["directory"] = $TypeSpecProjectDirectory + Write-Host "updated tsp-location.yaml directory to $TypeSpecProjectDirectory" + $tspLocationYaml["additionalDirectories"] = $additionalDirs + Write-Host "updated tsp-location.yaml additionalDirectories to $additionalDirs" + $tspLocationYaml |ConvertTo-Yaml | Out-File $tspLocationYamlPath + Write-Host "finished updating tsp-location.yaml in $packageDir" + return $packageDir +} + +function Get-ServiceDir([System.Object]$tspConfig, [string]$repoRoot) { + $serviceDir = "" + if ($tspConfig["parameters"] -and $tspConfig["parameters"]["service-dir"]) { + $serviceDir = $tspConfig["parameters"]["service-dir"]["default"]; + } + else { + Write-Error "Missing service-dir in parameters section of tspconfig.yaml. Please refer to https://github.com/Azure/azure-rest-api-specs/blob/main/specification/contosowidgetmanager/Contoso.WidgetManager/tspconfig.yaml for the right schema." + exit 1 + } + + # Create service-dir if not exist + $serviceDir = Join-Path $repoRoot $serviceDir + return $serviceDir +} +function Get-PackageDir([System.Object]$tspConfig) { + $emitterName = "" + if (Test-Path "Function:$GetEmitterNameFn") { + $emitterName = &$GetEmitterNameFn + } + else { + Write-Error "Missing $GetEmitterNameFn function in {$Language} SDK repo script." + exit 1 + } + $packageDir = "" + if ($tspConfig["options"] -and $tspConfig["options"]["$emitterName"] -and $tspConfig["options"]["$emitterName"]["package-dir"]) { + $packageDir = $tspConfig["options"]["$emitterName"]["package-dir"] + } + else { + Write-Error "Missing package-dir in $emitterName options of tspconfig.yaml. Please refer to https://github.com/Azure/azure-rest-api-specs/blob/main/specification/contosowidgetmanager/Contoso.WidgetManager/tspconfig.yaml for the right schema." + exit 1 + } + return $packageDir +} + +function Get-TspLocationFolder([System.Object]$tspConfig, [string]$repoRoot) { + $serviceDir = Get-ServiceDir $tspConfig $repoRoot + $packageDir = Get-PackageDir $tspConfig + $packageDir = Join-Path $serviceDir $packageDir + return $packageDir +} + +$sdkRepoRootPath = (Join-Path $PSScriptRoot .. .. ..) +$sdkRepoRootPath = Resolve-Path $sdkRepoRootPath +$sdkRepoRootPath = $sdkRepoRootPath -replace "\\", "/" +$tspConfigPath = Join-Path $sdkRepoRootPath 'tspconfig.yaml' +$tmpTspConfigPath = $tspConfigPath +$repo = "" +$specRepoRoot = "" +$generateFromLocalTypeSpec = $false +$isNewSdkProject = $false +# remote url scenario +# example url of tspconfig.yaml: https://github.com/Azure/azure-rest-api-specs-pr/blob/724ccc4d7ef7655c0b4d5c5ac4a5513f19bbef35/specification/containerservice/Fleet.Management/tspconfig.yaml +if ($TypeSpecProjectDirectory -match '^https://github.com/(?[^/]*/azure-rest-api-specs(-pr)?)/blob/(?[0-9a-f]{40})/(?.*)/tspconfig.yaml$') { + try { + $TypeSpecProjectDirectory = $TypeSpecProjectDirectory -replace "https://github.com/(.*)/(tree|blob)", "https://raw.githubusercontent.com/`$1" + Invoke-WebRequest $TypeSpecProjectDirectory -OutFile $tspConfigPath -MaximumRetryCount 3 + } + catch { + Write-Host "Failed to download '$TypeSpecProjectDirectory'" + Write-Error $_.Exception.Message + return + } + $repo = $Matches["repo"] + $TypeSpecProjectDirectory = $Matches["path"] + $CommitHash = $Matches["commit"] + # TODO support the branch name in url then get the commithash from branch name +} else { + # local path scenario + $tspConfigPath = Join-Path $TypeSpecProjectDirectory "tspconfig.yaml" + if (!(Test-Path $tspConfigPath)) { + Write-Error "Failed to find tspconfig.yaml in '$TypeSpecProjectDirectory'" + exit 1 + } + $TypeSpecProjectDirectory = $TypeSpecProjectDirectory.Replace("\", "/") + if ($TypeSpecProjectDirectory -match "(?^.*)/(?specification/.*)$") { + $TypeSpecProjectDirectory = $Matches["path"] + $specRepoRoot = $Matches["repoRoot"] + } else { + Write-Error "$TypeSpecProjectDirectory doesn't have 'specification' in path." + exit 1 + } + if (!$CommitHash -or !$RepoUrl) { + Write-Warning "Parameter of Commithash or RepoUrl are not provided along with the local path of tspconfig.yaml, trying to re-generate sdk code based on the local type specs." + $generateFromLocalTypeSpec = $true + } + + if ($RepoUrl) { + if ($RepoUrl -match "^(https://github.com/|git@github.com:)(?[^/]*/azure-rest-api-specs(-pr)?).*") { + $repo = $Matches["repo"] + } + else { + Write-Error "Parameter 'RepoUrl' has incorrect value:$RepoUrl. It should be similar like 'https://github.com/Azure/azure-rest-api-specs'" + exit 1 + } + } +} + +$tspConfigYaml = Get-Content $tspConfigPath -Raw | ConvertFrom-Yaml + +# delete the tmporary tspconfig.yaml downloaded from github +if (Test-Path $tmpTspConfigPath) { + Remove-Item $tspConfigPath +} + +$sdkProjectFolder = "" +if ($generateFromLocalTypeSpec) { + Write-Host "Generating sdk code based on local type specs at specRepoRoot: $specRepoRoot." + $sdkProjectFolder = Get-TspLocationFolder $tspConfigYaml $sdkRepoRootPath + $tspLocationYamlPath = Join-Path $sdkProjectFolder "tsp-location.yaml" + if (!(Test-Path -Path $tspLocationYamlPath)) { + # try to create tsp-location.yaml using HEAD commit of the local spec repo + Write-Warning "Failed to find tsp-location.yaml in '$sdkProjectFolder'. Trying to create tsp-location.yaml using HEAD commit of the local spec repo then proceed the sdk generation based upon local typespecs at $specRepoRoot. Alternatively, please make sure to provide CommitHash and RepoUrl parameters when running this script." + # set default repo to Azure/azure-rest-api-specs + $repo = "Azure/azure-rest-api-specs" + try { + Push-Location $specRepoRoot + $CommitHash = $(git rev-parse HEAD) + $gitOriginUrl = (git remote get-url origin) + if ($gitOriginUrl -and $gitOriginUrl -match '(.*)?github.com:(?[^/]*/azure-rest-api-specs(-pr)?)(.git)?') { + $repo = $Matches["repo"] + Write-Host "Found git origin repo: $repo" + } + else { + Write-Warning "Failed to find git origin repo of the local spec repo at specRepoRoot: $specRepoRoot. Using default repo: $repo" + } + } + catch { + Write-Error "Failed to get HEAD commit or remote origin of the local spec repo at specRepoRoot: $specRepoRoot." + exit 1 + } + finally { + Pop-Location + } + $sdkProjectFolder = CreateUpdate-TspLocation $tspConfigYaml $TypeSpecProjectDirectory $CommitHash $repo $sdkRepoRootPath -isNewSdkProject ([ref]$isNewSdkProject) + } +} else { + # call CreateUpdate-TspLocation function + $sdkProjectFolder = CreateUpdate-TspLocation $tspConfigYaml $TypeSpecProjectDirectory $CommitHash $repo $sdkRepoRootPath -isNewSdkProject ([ref]$isNewSdkProject) +} + +# checking skip switch, only skip when it's not a new sdk project as project scaffolding is supported by emitter +if ($SkipSyncAndGenerate -and !$isNewSdkProject) { + Write-Host "Skip calling TypeSpec-Project-Sync.ps1 and TypeSpec-Project-Generate.ps1." +} else { + # call TypeSpec-Project-Sync.ps1 + $syncScript = Join-Path $PSScriptRoot TypeSpec-Project-Sync.ps1 + Write-Host "Calling TypeSpec-Project-Sync.ps1" + & $syncScript $sdkProjectFolder $specRepoRoot | Out-Null + if ($LASTEXITCODE) { + Write-Error "Failed to sync sdk project from $specRepoRoot to $sdkProjectFolder" + exit $LASTEXITCODE + } + + # call TypeSpec-Project-Generate.ps1 + Write-Host "Calling TypeSpec-Project-Generate.ps1" + $generateScript = Join-Path $PSScriptRoot TypeSpec-Project-Generate.ps1 + & $generateScript $sdkProjectFolder | Out-Null + if ($LASTEXITCODE) { + Write-Error "Failed to generate sdk project at $sdkProjectFolder" + exit $LASTEXITCODE + } +} + +return $sdkProjectFolder \ No newline at end of file diff --git a/eng/common/scripts/TypeSpec-Project-Sync.ps1 b/eng/common/scripts/TypeSpec-Project-Sync.ps1 index 0cf2700e6810..0c7427af4ce5 100644 --- a/eng/common/scripts/TypeSpec-Project-Sync.ps1 +++ b/eng/common/scripts/TypeSpec-Project-Sync.ps1 @@ -2,9 +2,11 @@ [CmdletBinding()] param ( - [Parameter(Position=0)] - [ValidateNotNullOrEmpty()] - [string] $ProjectDirectory + [Parameter(Position = 0)] + [ValidateNotNullOrEmpty()] + [string] $ProjectDirectory, + [Parameter(Position = 1)] + [string] $LocalSpecRepoPath ) $ErrorActionPreference = "Stop" @@ -13,115 +15,133 @@ Install-ModuleIfNotInstalled "powershell-yaml" "0.4.1" | Import-Module $sparseCheckoutFile = ".git/info/sparse-checkout" function AddSparseCheckoutPath([string]$subDirectory) { - if (!(Test-Path $sparseCheckoutFile) -or !((Get-Content $sparseCheckoutFile).Contains($subDirectory))) { - Write-Output $subDirectory >> .git/info/sparse-checkout - } + if (!(Test-Path $sparseCheckoutFile) -or !((Get-Content $sparseCheckoutFile).Contains($subDirectory))) { + Write-Output $subDirectory >> .git/info/sparse-checkout + } } function CopySpecToProjectIfNeeded([string]$specCloneRoot, [string]$mainSpecDir, [string]$dest, [string[]]$specAdditionalSubDirectories) { - $source = "$specCloneRoot/$mainSpecDir" - Copy-Item -Path $source -Destination $dest -Recurse -Force - Write-Host "Copying spec from $source to $dest" + $source = Join-Path $specCloneRoot $mainSpecDir + Copy-Item -Path $source -Destination $dest -Recurse -Force + Write-Host "Copying spec from $source to $dest" - foreach ($additionalDir in $specAdditionalSubDirectories) { - $source = "$specCloneRoot/$additionalDir" - Write-Host "Copying spec from $source to $dest" - Copy-Item -Path $source -Destination $dest -Recurse -Force - } + foreach ($additionalDir in $specAdditionalSubDirectories) { + $source = Join-Path $specCloneRoot $additionalDir + Write-Host "Copying spec from $source to $dest" + Copy-Item -Path $source -Destination $dest -Recurse -Force + } } function UpdateSparseCheckoutFile([string]$mainSpecDir, [string[]]$specAdditionalSubDirectories) { - AddSparseCheckoutPath $mainSpecDir - foreach ($subDir in $specAdditionalSubDirectories) { - AddSparseCheckoutPath $subDir - } + AddSparseCheckoutPath $mainSpecDir + foreach ($subDir in $specAdditionalSubDirectories) { + Write-Host "Adding $subDir to sparse checkout" + AddSparseCheckoutPath $subDir + } } function GetGitRemoteValue([string]$repo) { - Push-Location $ProjectDirectory - $result = "" - try { - $gitRemotes = (git remote -v) - foreach ($remote in $gitRemotes) { - if ($remote.StartsWith("origin")) { - if ($remote -match 'https://github.com/\S+') { - $result = "https://github.com/$repo.git" - break - } elseif ($remote -match "git@github.com:\S+"){ - $result = "git@github.com:$repo.git" - break - } else { - throw "Unknown git remote format found: $remote" - } - } + Push-Location $ProjectDirectory + $result = "" + try { + $gitRemotes = (git remote -v) + foreach ($remote in $gitRemotes) { + Write-Host "Checking remote $remote" + if ($remote.StartsWith("origin") -or $remote.StartsWith("main")) { + if ($remote -match 'https://(.*)?github.com/\S+') { + $result = "https://github.com/$repo.git" + break } + elseif ($remote -match "(.*)?git@github.com:\S+") { + $result = "git@github.com:$repo.git" + break + } + else { + throw "Unknown git remote format found: $remote" + } + } } - finally { - Pop-Location - } - - return $result + } + finally { + Pop-Location + } + Write-Host "Found git remote $result" + return $result } function InitializeSparseGitClone([string]$repo) { - git clone --no-checkout --filter=tree:0 $repo . - if ($LASTEXITCODE) { exit $LASTEXITCODE } - git sparse-checkout init - if ($LASTEXITCODE) { exit $LASTEXITCODE } - Remove-Item $sparseCheckoutFile -Force + git clone --no-checkout --filter=tree:0 $repo . + if ($LASTEXITCODE) { exit $LASTEXITCODE } + git sparse-checkout init + if ($LASTEXITCODE) { exit $LASTEXITCODE } + Remove-Item $sparseCheckoutFile -Force } function GetSpecCloneDir([string]$projectName) { - Push-Location $ProjectDirectory - try { - $root = git rev-parse --show-toplevel - } - finally { - Pop-Location - } - - $sparseSpecCloneDir = "$root/../sparse-spec/$projectName" - New-Item $sparseSpecCloneDir -Type Directory -Force | Out-Null - $createResult = Resolve-Path $sparseSpecCloneDir - return $createResult + Push-Location $ProjectDirectory + try { + $root = git rev-parse --show-toplevel + } + finally { + Pop-Location + } + + $sparseSpecCloneDir = "$root/../sparse-spec/$projectName" + New-Item $sparseSpecCloneDir -Type Directory -Force | Out-Null + $createResult = Resolve-Path $sparseSpecCloneDir + return $createResult } $typespecConfigurationFile = Resolve-Path "$ProjectDirectory/tsp-location.yaml" Write-Host "Reading configuration from $typespecConfigurationFile" $configuration = Get-Content -Path $typespecConfigurationFile -Raw | ConvertFrom-Yaml -$pieces = $typespecConfigurationFile.Path.Replace("\","/").Split("/") +$pieces = $typespecConfigurationFile.Path.Replace("\", "/").Split("/") $projectName = $pieces[$pieces.Count - 2] $specSubDirectory = $configuration["directory"] -if ( $configuration["repo"] -and $configuration["commit"]) { - $specCloneDir = GetSpecCloneDir $projectName - $gitRemoteValue = GetGitRemoteValue $configuration["repo"] - - Write-Host "Setting up sparse clone for $projectName at $specCloneDir" - - Push-Location $specCloneDir.Path - try { - if (!(Test-Path ".git")) { - InitializeSparseGitClone $gitRemoteValue - } - UpdateSparseCheckoutFile $specSubDirectory $configuration["additionalDirectories"] - git checkout $configuration["commit"] - if ($LASTEXITCODE) { exit $LASTEXITCODE } - } - finally { - Pop-Location +# use local spec repo if provided +if ($LocalSpecRepoPath) { + $specCloneDir = $LocalSpecRepoPath +} +elseif ($configuration["repo"] -and $configuration["commit"]) { + # use sparse clone if repo and commit are provided + $specCloneDir = GetSpecCloneDir $projectName + $gitRemoteValue = GetGitRemoteValue $configuration["repo"] + + Write-Host "from tsplocation.yaml 'repo' is:"$configuration["repo"] + Write-Host "Setting up sparse clone for $projectName at $specCloneDir" + + Push-Location $specCloneDir.Path + try { + if (!(Test-Path ".git")) { + Write-Host "Initializing sparse clone for repo: $gitRemoteValue" + InitializeSparseGitClone $gitRemoteValue } -} elseif ( $configuration["spec-root-dir"] ) { - $specCloneDir = $configuration["spec-root-dir"] + Write-Host "Updating sparse checkout file with directory:$specSubDirectory" + UpdateSparseCheckoutFile $specSubDirectory $configuration["additionalDirectories"] + $commit = $configuration["commit"] + Write-Host "git checkout commit: $commit" + git checkout $configuration["commit"] + if ($LASTEXITCODE) { exit $LASTEXITCODE } + } + finally { + Pop-Location + } +} +else { + # write error if neither local spec repo nor repo and commit are provided + Write-Error "Must contain both 'repo' and 'commit' in tsp-location.yaml or input 'localSpecRepoPath' parameter." + exit 1 } - $tempTypeSpecDir = "$ProjectDirectory/TempTypeSpecFiles" New-Item $tempTypeSpecDir -Type Directory -Force | Out-Null CopySpecToProjectIfNeeded ` - -specCloneRoot $specCloneDir ` - -mainSpecDir $specSubDirectory ` - -dest $tempTypeSpecDir ` - -specAdditionalSubDirectories $configuration["additionalDirectories"] + -specCloneRoot $specCloneDir ` + -mainSpecDir $specSubDirectory ` + -dest $tempTypeSpecDir ` + -specAdditionalSubDirectories $configuration["additionalDirectories"] + +exit 0 diff --git a/eng/common/scripts/Update-DocsMsMetadata.ps1 b/eng/common/scripts/Update-DocsMsMetadata.ps1 index 8026a5a6e08d..817407f4bc18 100644 --- a/eng/common/scripts/Update-DocsMsMetadata.ps1 +++ b/eng/common/scripts/Update-DocsMsMetadata.ps1 @@ -32,14 +32,6 @@ GitHub repository ID of the SDK. Typically of the form: 'Azure/azure-sdk-for-js' The docker image id in format of '$containerRegistry/$imageName:$tag' e.g. azuresdkimages.azurecr.io/jsrefautocr:latest -.PARAMETER TenantId -The aad tenant id/object id. - -.PARAMETER ClientId -The add client id/application id. - -.PARAMETER ClientSecret -The client secret of add app. #> param( @@ -59,16 +51,7 @@ param( [string]$DocValidationImageId, [Parameter(Mandatory = $false)] - [string]$PackageSourceOverride, - - [Parameter(Mandatory = $false)] - [string]$TenantId, - - [Parameter(Mandatory = $false)] - [string]$ClientId, - - [Parameter(Mandatory = $false)] - [string]$ClientSecret + [string]$PackageSourceOverride ) Set-StrictMode -Version 3 . (Join-Path $PSScriptRoot common.ps1) @@ -105,28 +88,10 @@ function GetAdjustedReadmeContent($ReadmeContent, $PackageInfo, $PackageMetadata $ReadmeContent = $ReadmeContent -replace $releaseReplaceRegex, $replacementPattern } - # Get the first code owners of the package. - Write-Host "Retrieve the code owner from $($PackageInfo.DirectoryPath)." - $author = GetPrimaryCodeOwner -TargetDirectory $PackageInfo.DirectoryPath - if (!$author) { - $author = "ramya-rao-a" - $msauthor = "ramyar" - } - else { - $msauthor = GetMsAliasFromGithub -TenantId $TenantId -ClientId $ClientId -ClientSecret $ClientSecret -GithubUser $author - } - # Default value - if (!$msauthor) { - $msauthor = $author - } - Write-Host "The author of package: $author" - Write-Host "The ms author of package: $msauthor" $header = @" --- title: $foundTitle keywords: Azure, $Language, SDK, API, $($PackageInfo.Name), $service -author: $author -ms.author: $msauthor ms.date: $date ms.topic: reference ms.devlang: $Language @@ -205,7 +170,7 @@ function UpdateDocsMsMetadataForPackage($packageInfoJsonLocation) { Write-Host "The docs metadata json $packageMetadataName does not exist, creating a new one to docs repo..." New-Item -ItemType Directory -Path $packageInfoLocation -Force } - $packageInfoJson = ConvertTo-Json $packageInfo + $packageInfoJson = ConvertTo-Json $packageInfo -Depth 100 Set-Content ` -Path $packageInfoLocation/$packageMetadataName ` -Value $packageInfoJson @@ -230,17 +195,40 @@ function UpdateDocsMsMetadataForPackage($packageInfoJsonLocation) { Set-Content -Path $readmeLocation -Value $outputReadmeContent } -# For daily update and release, validate DocsMS publishing using the language-specific validation function -if ($ValidateDocsMsPackagesFn -and (Test-Path "Function:$ValidateDocsMsPackagesFn")) { - Write-Host "Validating the packages..." - - $packageInfos = @($PackageInfoJsonLocations | ForEach-Object { GetPackageInfoJson $_ }) +$allSucceeded = $true +foreach ($packageInfoLocation in $PackageInfoJsonLocations) { - &$ValidateDocsMsPackagesFn -PackageInfos $packageInfos -PackageSourceOverride $PackageSourceOverride -DocValidationImageId $DocValidationImageId -DocRepoLocation $DocRepoLocation -} + if ($ValidateDocsMsPackagesFn -and (Test-Path "Function:$ValidateDocsMsPackagesFn")) { + Write-Host "Validating the packages..." + + $packageInfo = GetPackageInfoJson $packageInfoLocation + # This calls a function named "Validate-${Language}-DocMsPackages" + # declared in common.ps1, implemented in Language-Settings.ps1 + $isValid = &$ValidateDocsMsPackagesFn ` + -PackageInfos $packageInfo ` + -PackageSourceOverride $PackageSourceOverride ` + -DocValidationImageId $DocValidationImageId ` + -DocRepoLocation $DocRepoLocation + + if (!$isValid) { + Write-Host "Package validation failed for package: $packageInfoLocation" + $allSucceeded = $false + + # Skip the later call to UpdateDocsMsMetadataForPackage because this + # package has not passed validation + continue + } + } -foreach ($packageInfoLocation in $PackageInfoJsonLocations) { Write-Host "Updating metadata for package: $packageInfoLocation" # Convert package metadata json file to metadata json property. UpdateDocsMsMetadataForPackage $packageInfoLocation } + +# Set a variable which will be used by the pipeline later to fail the build if +# any packages failed validation +if ($allSucceeded) { + Write-Host "##vso[task.setvariable variable=DocsMsPackagesAllValid;]$true" +} else { + Write-Host "##vso[task.setvariable variable=DocsMsPackagesAllValid;]$false" +} diff --git a/eng/common/scripts/Update-DocsMsPackageMonikers.ps1 b/eng/common/scripts/Update-DocsMsPackageMonikers.ps1 new file mode 100644 index 000000000000..f1f282a6b372 --- /dev/null +++ b/eng/common/scripts/Update-DocsMsPackageMonikers.ps1 @@ -0,0 +1,122 @@ +<# +.SYNOPSIS +Move metadata JSON and package-level overview markdown files for deprecated packages to the legacy folder. + +.DESCRIPTION +Move onboarding information to the "legacy" moniker for whose support is "deprecated" in the Metadata CSV. +Only one version of a package can be documented in the "legacy" moniker. If multiple versions are available, +the "latest" version will be used and the "preview" version will be deleted. + +.PARAMETER DocRepoLocation +The location of the target docs repository. +#> + +param( + [Parameter(Mandatory = $true)] + [string] $DocRepoLocation +) + +. (Join-Path $PSScriptRoot common.ps1) + +Set-StrictMode -Version 3 + +function getPackageMetadata($moniker) { + $jsonFiles = Get-ChildItem -Path (Join-Path $DocRepoLocation "metadata/$moniker") -Filter *.json + $metadata = @{} + + foreach ($jsonFile in $jsonFiles) { + $packageMetadata = Get-Content $jsonFile -Raw | ConvertFrom-Json -AsHashtable + $packageIdentity = $packageMetadata.Name + if (Test-Path "Function:$GetPackageIdentity") { + $packageIdentity = &$GetPackageIdentity $packageMetadata + } + + $metadata[$packageIdentity] = @{ File = $jsonFile; Metadata = $packageMetadata } + } + + return $metadata +} + +function getPackageInfoFromLookup($packageIdentity, $version, $lookupTable) { + if ($lookupTable.ContainsKey($packageIdentity)) { + if ($lookupTable[$packageIdentity]['Metadata'].Version -eq $version) { + # Only return if the version matches + return $lookupTable[$packageIdentity] + } + } + + return $null +} + +function moveToLegacy($packageInfo) { + $docsMsMetadata = &$GetDocsMsMetadataForPackageFn -PackageInfo $packageInfo['Metadata'] + + Write-Host "Move to legacy: $($packageInfo['Metadata'].Name)" + $packageInfoPath = $packageInfo['File'] + Move-Item "$($packageInfoPath.Directory)/$($packageInfoPath.BaseName).*" "$DocRepoLocation/metadata/legacy/" -Force + + $readmePath = "$DocRepoLocation/$($docsMsMetadata.PreviewReadMeLocation)/$($docsMsMetadata.DocsMsReadMeName)-readme.md" + if (Test-Path $readmePath) { + Move-Item ` + $readmePath ` + "$DocRepoLocation/$($docsMsMetadata.LegacyReadMeLocation)/" ` + -Force + } +} + +function deletePackageInfo($packageInfo) { + $docsMsMetadata = &$GetDocsMsMetadataForPackageFn -PackageInfo $packageInfo['Metadata'] + + Write-Host "Delete superseded package: $($packageInfo['Metadata'].Name)" + $packageInfoPath = $packageInfo['File'] + Remove-Item "$($packageInfoPath.Directory)/$($packageInfoPath.BaseName).*" -Force + + $readmePath = "$DocRepoLocation/$($docsMsMetadata.PreviewReadMeLocation)/$($docsMsMetadata.DocsMsReadMeName)-readme.md" + if (Test-Path $readmePath) { + Remove-Item $readmePath -Force + } +} + +$metadataLookup = @{ + 'latest' = getPackageMetadata 'latest' + 'preview' = getPackageMetadata 'preview' +} +$deprecatedPackages = (Get-CSVMetadata).Where({ $_.Support -eq 'deprecated' }) + +foreach ($package in $deprecatedPackages) { + $packageIdentity = $package.Package + if (Test-Path "Function:$GetPackageIdentityFromCsvMetadata") { + $packageIdentity = &$GetPackageIdentityFromCsvMetadata $package + } + + $packageInfoPreview = $packageInfoLatest = $null + if ($package.VersionPreview) { + $packageInfoPreview = getPackageInfoFromLookup ` + -packageIdentity $packageIdentity ` + -version $package.VersionPreview ` + -lookupTable $metadataLookup['preview'] + } + + if ($package.VersionGA) { + $packageInfoLatest = getPackageInfoFromLookup ` + -packageIdentity $packageIdentity ` + -version $package.VersionGA ` + -lookupTable $metadataLookup['latest'] + } + + if (!$packageInfoPreview -and !$packageInfoLatest) { + # Nothing to move or delete + continue + } + + if ($packageInfoPreview -and $packageInfoLatest) { + # Delete metadata JSON and package-level overview markdown files for + # the preview version instead of moving both. This mitigates situations + # where the "latest" verison doesn't have a package-level overview + # markdown file and the "preview" version does. + deletePackageInfo $packageInfoPreview + moveToLegacy $packageInfoLatest + } else { + moveToLegacy ($packageInfoPreview ?? $packageInfoLatest) + } +} diff --git a/eng/common/scripts/Update-DocsMsPackages.ps1 b/eng/common/scripts/Update-DocsMsPackages.ps1 index ccd531d3bd40..00ab4b458d43 100644 --- a/eng/common/scripts/Update-DocsMsPackages.ps1 +++ b/eng/common/scripts/Update-DocsMsPackages.ps1 @@ -3,16 +3,12 @@ Update docs.microsoft.com CI configuration with provided metadata .DESCRIPTION -Update docs.microsoft.com CI configuration with metadata in the Azure/azure-sdk -metadata CSV file and information in the docs.microsoft.com repo's own /metadata -folder. The docs.microsoft.com repo's /metadata folder allows onboarding of +Update docs.microsoft.com CI configuration with metadata in the docs.microsoft.com repo's +/metadata folder. The docs.microsoft.com repo's /metadata folder allows onboarding of packages which have not released to a central package manager. -* Use packages in the Azure/azure-sdk metadata CSV where New == true and - Hide != true -* Add metadata from files in the metadata/ folder to the CSV metadata * Onboard new packages, update existing tracked packages, leave other packages - in place. (This is implemented on a per-language basis by + in place. (This is implemented on a per-language basis by $UpdateDocsMsPackagesFn) .PARAMETER DocRepoLocation @@ -25,7 +21,7 @@ variable is meant to be used in the domain-specific business logic in &$UpdateDocsMsPackagesFn .PARAMETER ImageId -Optional The docker image for package validation in format of '$containerRegistry/$imageName:$tag'. +Optional The docker image for package validation in format of '$containerRegistry/$imageName:$tag'. e.g. azuresdkimages.azurecr.io/jsrefautocr:latest #> @@ -41,120 +37,93 @@ param ( ) . (Join-Path $PSScriptRoot common.ps1) - -function GetDocsMetadataForMoniker($moniker) { - $searchPath = Join-Path $DocRepoLocation 'metadata' $moniker - if (!(Test-Path $searchPath)) { - return @() - } - $paths = Get-ChildItem -Path $searchPath -Filter *.json - - $metadata = @() - foreach ($path in $paths) { - $fileContents = Get-Content $path -Raw - $fileObject = ConvertFrom-Json -InputObject $fileContents - $versionGa = '' - $versionPreview = '' - if ($moniker -eq 'latest') { - $versionGa = $fileObject.Version - } else { - $versionPreview = $fileObject.Version - } - - $entry = @{ - Package = $fileObject.Name; - VersionGA = $versionGa; - VersionPreview = $versionPreview; - RepoPath = $fileObject.ServiceDirectory; - Type = $fileObject.SdkType; - New = $fileObject.IsNewSdk; - } - if ($fileObject.PSObject.Members.Name -contains "Group") - { - $entry.Add("GroupId", $fileObject.Group) - } - $metadata += $entry +. "$PSScriptRoot/../../scripts/docs/Docs-Onboarding.ps1" + +Set-StrictMode -Version 3 + +function GetMetadata($moniker) { + $jsonFiles = Get-ChildItem -Path (Join-Path $DocRepoLocation "metadata/$moniker") -Filter *.json + $metadata = @() + foreach ($jsonFile in $jsonFiles) { + # Converting to a hashtable gives more beneficial semantics for handling + # metadata (easier to check existence of property, easier to add new + # properties) + $metadata += Get-Content $jsonFile -Raw | ConvertFrom-Json -AsHashtable } return $metadata } -function GetDocsMetadata() { - # Read metadata from CSV - $csvMetadata = (Get-CSVMetadata).Where({ ($_.New -eq 'true' -or $_.MSDocService -ne '') -and $_.Hide -ne 'true'}) - - # Read metadata from docs repo - $metadataByPackage = @{} - foreach ($package in GetDocsMetadataForMoniker 'latest') { - if ($metadataByPackage.ContainsKey($package.Package)) { - LogWarning "Duplicate package in latest metadata: $($package.Package)" - } - Write-Host "Adding latest package: $($package.Package)" - $metadataByPackage[$package.Package] = $package - } - foreach ($package in GetDocsMetadataForMoniker 'preview') { - if ($metadataByPackage.ContainsKey($package.Package)) { - # Merge VersionPreview of each object - Write-Host "Merging preview package version for $($package.Package))" - $metadataByPackage[$package.Package].VersionPreview = $package.VersionPreview - } else { - Write-Host "Adding preview package: $($package.Package)" - $metadataByPackage[$package.Package] = $package - } +function ValidatePackageForOnboarding2($package) { + if (!(Test-Path "Function:$ValidateDocsMsPackagesFn")) { + return $true } - # Override CSV metadata version information before returning - $outputMetadata = @() - foreach ($item in $csvMetadata) { - if ($metadataByPackage.ContainsKey($item.Package)) { - Write-Host "Overriding CSV metadata from docs repo for $($item.Package)" - $matchingPackage = $metadataByPackage[$item.Package] - - # Only update the version from metadata present in the docs repo IF there - # is a specified version. The absence of package metadata in the docs repo - # (e.g. no GA version) does not imply that the CSV metadata is incorrect. - if ($matchingPackage.VersionGA) { - $item.VersionGA = $matchingPackage.VersionGA + return &$ValidateDocsMsPackagesFn ` + -PackageInfo $package ` + -DocValidationImageId $ImageId ` + -DocRepoLocation $DocRepoLocation +} + +$MONIKERS = @('latest', 'preview', 'legacy') +foreach ($moniker in $MONIKERS) { + try { + Write-Host "Onboarding packages for moniker: $moniker" + $metadata = GetMetadata $moniker + $alreadyOnboardedPackages = &$GetDocsPackagesAlreadyOnboarded $DocRepoLocation $moniker + + # Sort the metadata entries by package name so that the output is + # deterministic (more simple diffs) + $sortedMetadata = $metadata | Sort-Object -Property '_DocsOnboardingOrdinal', 'Name' + + $outputPackages = @() + foreach ($package in $sortedMetadata) { + $packageIdentity = $package.Name + if (Test-Path "Function:$GetPackageIdentity") { + $packageIdentity = &$GetPackageIdentity $package } - if ($matchingPackage.VersionPreview) { - $item.VersionPreview = $matchingPackage.VersionPreview + + if (!($alreadyOnboardedPackages.ContainsKey($packageIdentity))) { + Write-Host "Evaluating package for onboarding: $($packageIdentity)" + if ($package.ContainsKey('_SkipDocsValidation') -and $true -eq $package['_SkipDocsValidation']) { + Write-Host "Skip validation for package: $($packageIdentity)" + } + elseif (!(ValidatePackageForOnboarding2 $package)) { + LogWarning "Skip adding package that did not pass validation: $($packageIdentity)" + continue + } + + Write-Host "Add new package: $($packageIdentity)@$($package.Version)" + $outputPackages += $package + continue } - } - $outputMetadata += $item - } - # Add entries present in the docs repo which are not present in CSV. These are - # usually packages which have not yet published a preview or GA version. - foreach ($item in $metadataByPackage.Values) { - $matchingPackagesInCsvMetadata = $csvMetadata.Where({ $_.Package -eq $item.Package }) - if (!$matchingPackagesInCsvMetadata) { - Write-Host "Adding package from docs metadata that is not found in CSV metadata: $($item.Package)" - $outputMetadata += $item - } - } + $oldPackage = $alreadyOnboardedPackages[$packageIdentity] - return $outputMetadata -} + if ($oldPackage.Version -ne $package.Version) { + if (!(ValidatePackageForOnboarding2 $package)) { + LogWarning "Omitting package that failed validation: $($packageIdentity)@$($package.Version)" + continue + } -if ($UpdateDocsMsPackagesFn -and (Test-Path "Function:$UpdateDocsMsPackagesFn")) { + Write-Host "Update package: $($packageIdentity)@$($oldPackage.Version) to $($packageIdentity)@$($package.Version)" + $outputPackages += $package + continue + } - try { - $docsMetadata = GetDocsMetadata - &$UpdateDocsMsPackagesFn -DocsRepoLocation $DocRepoLocation -DocsMetadata $docsMetadata -PackageSourceOverride $PackageSourceOverride -DocValidationImageId $ImageId - } catch { - LogError "Exception while updating docs.ms packages" - LogError $_ - LogError $_.ScriptStackTrace + Write-Host "Unchanged package: $($packageIdentity)@$($package.Version)" + $outputPackages += $package + } + + &$SetDocsPackageOnboarding $moniker $outputPackages $DocRepoLocation $PackageSourceOverride + } + catch { + Write-Host "Error onboarding packages for moniker: $moniker" + Write-Host "Error: $_" + Write-Host "Stacktrace: $($_.ScriptStackTrace)" + Write-Error $_ exit 1 } - -} else { - LogError "The function for '$UpdateFn' was not found.` - Make sure it is present in eng/scripts/Language-Settings.ps1 and referenced in eng/common/scripts/common.ps1.` - See https://github.com/Azure/azure-sdk-tools/blob/main/doc/common/common_engsys.md#code-structure" - exit 1 } -# Exit 0 so DevOps doesn't fail the build when the last command called by the -# domain-specific function exited with a non-zero exit code. exit 0 diff --git a/eng/common/scripts/Update-GeneratedSdks.ps1 b/eng/common/scripts/Update-GeneratedSdks.ps1 new file mode 100644 index 000000000000..dd671f6d8ad8 --- /dev/null +++ b/eng/common/scripts/Update-GeneratedSdks.ps1 @@ -0,0 +1,16 @@ +[CmdLetBinding()] +param( + [Parameter(Mandatory)] + [string]$PackageDirectoriesFile +) + +. $PSScriptRoot/common.ps1 +. $PSScriptRoot/Helpers/CommandInvocation-Helpers.ps1 + +$ErrorActionPreference = 'Stop' + +if (Test-Path "Function:$UpdateGeneratedSdksFn") { + &$UpdateGeneratedSdksFn $PackageDirectoriesFile +} else { + Write-Error "Function $UpdateGeneratedSdksFn not implemented in Language-Settings.ps1" +} diff --git a/eng/common/scripts/Verify-Links.ps1 b/eng/common/scripts/Verify-Links.ps1 index 4bfc2124366d..a77f57133f24 100644 --- a/eng/common/scripts/Verify-Links.ps1 +++ b/eng/common/scripts/Verify-Links.ps1 @@ -12,13 +12,14 @@ Specifies the file that contains a set of links to ignore when verifying. .PARAMETER devOpsLogging - Switch that will enable devops specific logging for warnings + Switch that will enable devops specific logging for warnings. .PARAMETER recursive - Check the links recurisvely based on recursivePattern. + Check the links recurisvely. Applies to links starting with 'baseUrl' parameter. Defaults to true. .PARAMETER baseUrl Recursively check links for all links verified that begin with this baseUrl, defaults to the folder the url is contained in. + If 'recursive' parameter is set to false, this parameter has no effect. .PARAMETER rootUrl Path to the root of the site for resolving rooted relative links, defaults to host root for http and file directory for local files. @@ -74,6 +75,8 @@ param ( [string] $requestTimeoutSec = 15 ) +Set-StrictMode -Version 3.0 + $ProgressPreference = "SilentlyContinue"; # Disable invoke-webrequest progress dialog # Regex of the locale keywords. $locale = "/en-us/" @@ -184,11 +187,15 @@ function ParseLinks([string]$baseUri, [string]$htmlContent) #$hrefs | Foreach-Object { Write-Host $_ } Write-Verbose "Found $($hrefs.Count) raw href's in page $baseUri"; - $links = $hrefs | ForEach-Object { ResolveUri $baseUri $_.Groups["href"].Value } + [string[]] $links = $hrefs | ForEach-Object { ResolveUri $baseUri $_.Groups["href"].Value } #$links | Foreach-Object { Write-Host $_ } - return $links + if ($null -eq $links) { + $links = @() + } + + return ,$links } function CheckLink ([System.Uri]$linkUri, $allowRetry=$true) @@ -239,11 +246,27 @@ function CheckLink ([System.Uri]$linkUri, $allowRetry=$true) } } catch { - $statusCode = $_.Exception.Response.StatusCode.value__ + + $responsePresent = $_.Exception.psobject.Properties.name -contains "Response" + if ($responsePresent) { + $statusCode = $_.Exception.Response.StatusCode.value__ + } else { + $statusCode = $null + } - if(!$statusCode) { + if (!$statusCode) { # Try to pull the error code from any inner SocketException we might hit - $statusCode = $_.Exception.InnerException.ErrorCode + + $innerExceptionPresent = $_.Exception.psobject.Properties.name -contains "InnerException" + + $errorCodePresent = $false + if ($innerExceptionPresent) { + $errorCodePresent = $_.Exception.InnerException.psobject.Properties.name -contains "ErrorCode" + } + + if ($errorCodePresent) { + $statusCode = $_.Exception.InnerException.ErrorCode + } } if ($statusCode -in $errorStatusCodes) { @@ -257,13 +280,30 @@ function CheckLink ([System.Uri]$linkUri, $allowRetry=$true) $linkValid = $false } else { + if ($null -ne $statusCode) { + # For 429 rate-limiting try to pause if possible - if ($allowRetry -and $_.Exception.Response -and $statusCode -eq 429) { - $retryAfter = $_.Exception.Response.Headers.RetryAfter.Delta.TotalSeconds + if ($allowRetry -and $responsePresent -and $statusCode -eq 429) { + + $headersPresent = $_.Exception.psobject.Properties.name -contains "Headers" + + $retryAfterPresent = $false + if ($headersPresent) { + $retryAfterPresent = $_.Exception.Headers.psobject.Properties.name -contains "RetryAfter" + } + + $retryAfterDeltaPresent = $false + if ($retryAfterPresent) { + $retryAfterDeltaPresent = $_.Exception.Headers.RetryAfter.psobject.Properties.name -contains "Delta" + } + + if ($retryAfterDeltaPresent) { + $retryAfter = $_.Exception.Response.Headers.RetryAfter.Delta.TotalSeconds + } # Default retry after 60 (arbitrary) seconds if no header given - if (!$retryAfter -or $retryAfter -gt 60) { $retryAfter = 60 } + if (!$retryAfterDeltaPresent -or $retryAfter -gt 60) { $retryAfter = 60 } Write-Host "Rate-Limited for $retryAfter seconds while requesting $linkUri" Start-Sleep -Seconds $retryAfter @@ -366,9 +406,9 @@ function GetLinks([System.Uri]$pageUri) LogError "Don't know how to process uri $pageUri" } - $links = ParseLinks $pageUri $content + [string[]] $links = ParseLinks $pageUri $content - return $links; + return ,$links; } if ($urls) { @@ -433,59 +473,71 @@ if ($devOpsLogging) { while ($pageUrisToCheck.Count -ne 0) { $pageUri = $pageUrisToCheck.Dequeue(); - if ($checkedPages.ContainsKey($pageUri)) { continue } - $checkedPages[$pageUri] = $true; - - $linkUris = GetLinks $pageUri - Write-Host "Checking $($linkUris.Count) links found on page $pageUri"; - $badLinksPerPage = @(); - foreach ($linkUri in $linkUris) { - $isLinkValid = CheckLink $linkUri - if (!$isLinkValid -and !$badLinksPerPage.Contains($linkUri)) { - if (!$linkUri.ToString().Trim()) { - $linkUri = $emptyLinkMessage + Write-Verbose "Processing pageUri $pageUri" + try { + if ($checkedPages.ContainsKey($pageUri)) { continue } + $checkedPages[$pageUri] = $true; + + [string[]] $linkUris = GetLinks $pageUri + Write-Host "Checking $($linkUris.Count) links found on page $pageUri"; + $badLinksPerPage = @(); + foreach ($linkUri in $linkUris) { + $isLinkValid = CheckLink $linkUri + if (!$isLinkValid -and !$badLinksPerPage.Contains($linkUri)) { + if (!$linkUri.ToString().Trim()) { + $linkUri = $emptyLinkMessage + } + $badLinksPerPage += $linkUri } - $badLinksPerPage += $linkUri - } - if ($recursive -and $isLinkValid) { - if ($linkUri.ToString().StartsWith($baseUrl) -and !$checkedPages.ContainsKey($linkUri)) { - $pageUrisToCheck.Enqueue($linkUri); + if ($recursive -and $isLinkValid) { + if ($linkUri.ToString().StartsWith($baseUrl) -and !$checkedPages.ContainsKey($linkUri)) { + $pageUrisToCheck.Enqueue($linkUri); + } } } + if ($badLinksPerPage.Count -gt 0) { + $badLinks[$pageUri] = $badLinksPerPage + } + } catch { + Write-Host "Exception encountered while processing pageUri $pageUri : $($_.Exception)" + throw } - if ($badLinksPerPage.Count -gt 0) { - $badLinks[$pageUri] = $badLinksPerPage - } -} -if ($devOpsLogging) { - Write-Host "##[endgroup]" } -if ($badLinks.Count -gt 0) { - Write-Host "Summary of broken links:" -} -foreach ($pageLink in $badLinks.Keys) { - Write-Host "'$pageLink' has $($badLinks[$pageLink].Count) broken link(s):" - foreach ($brokenLink in $badLinks[$pageLink]) { - Write-Host " $brokenLink" +try { + if ($devOpsLogging) { + Write-Host "##[endgroup]" } -} -$linksChecked = $checkedLinks.Count - $cachedLinksCount + if ($badLinks.Count -gt 0) { + Write-Host "Summary of broken links:" + } + foreach ($pageLink in $badLinks.Keys) { + Write-Host "'$pageLink' has $($badLinks[$pageLink].Count) broken link(s):" + foreach ($brokenLink in $badLinks[$pageLink]) { + Write-Host " $brokenLink" + } + } -if ($badLinks.Count -gt 0) { - Write-Host "Checked $linksChecked links with $($badLinks.Count) broken link(s) found." -} -else { - Write-Host "Checked $linksChecked links. No broken links found." -} + $linksChecked = $checkedLinks.Count - $cachedLinksCount -if ($outputCacheFile) -{ - $goodLinks = $checkedLinks.Keys.Where({ "True" -eq $checkedLinks[$_].ToString() }) | Sort-Object + if ($badLinks.Count -gt 0) { + Write-Host "Checked $linksChecked links with $($badLinks.Count) broken link(s) found." + } + else { + Write-Host "Checked $linksChecked links. No broken links found." + } + + if ($outputCacheFile) + { + $goodLinks = $checkedLinks.Keys.Where({ "True" -eq $checkedLinks[$_].ToString() }) | Sort-Object - Write-Host "Writing the list of validated links to $outputCacheFile" - $goodLinks | Set-Content $outputCacheFile + Write-Host "Writing the list of validated links to $outputCacheFile" + $goodLinks | Set-Content $outputCacheFile + } +} catch { + Write-Host "Exception encountered after all pageUris have been processed : $($_.Exception)" + throw } exit $badLinks.Count diff --git a/eng/common/scripts/Verify-RequiredDocsJsonMembers.ps1 b/eng/common/scripts/Verify-RequiredDocsJsonMembers.ps1 index 4bdd5adfaf8c..8875d80e4348 100644 --- a/eng/common/scripts/Verify-RequiredDocsJsonMembers.ps1 +++ b/eng/common/scripts/Verify-RequiredDocsJsonMembers.ps1 @@ -91,6 +91,16 @@ function Test-RequiredDocsJsonMembers($moniker) { $script:FoundError = $true } + if ($fileObject.PSObject.Members.Name -contains 'DirectoryPath') { + if ($null -eq $fileObject.DirectoryPath) { + Write-Host "$path has a null DirectoryPath member. If the DirectoryPath is unknown please use the value `"`"." + $script:FoundError = $true + } + } else { + Write-Host "$path is missing its DirectoryPath member. If the DirectoryPath is unknown please use the value `"`"." + $script:FoundError = $true + } + if ($Language -eq "java") { if ($fileObject.PSObject.Members.Name -contains "Group") { diff --git a/eng/common/scripts/X509Certificate2/README.md b/eng/common/scripts/X509Certificate2/README.md new file mode 100644 index 000000000000..9941994c1c99 --- /dev/null +++ b/eng/common/scripts/X509Certificate2/README.md @@ -0,0 +1,24 @@ +Powershell module for generating self-signed x509 certificates + +Usage: + +```powershell +Import-Module -Name ./eng/common/scripts/X509Certificate2 # assumes $PWD is repo root + +$cert1 = New-X509Certificate2 -SubjectName 'E=opensource@microsoft.com, CN=Azure SDK, OU=Azure SDK, O=Microsoft, L=Redmond, S=WA, C=US' -ValidDays 3652 + +$CaPublicKeyBase64 = $cert1 | Format-X509Certificate2 -Type CertificateBase64 +$CaPrivateKeyPem = $cert1 | Format-X509Certificate2 -Type Pkcs1 +$CaKeyPairPkcs12Base64 = $cert1 | Format-X509Certificate2 -Type Pkcs12Base64 +``` + +With V3 extensions + +```powershell +Import-Module -Name eng/scripts/X509Certificate2.psm1 # assumes $PWD is repo root + +$cert2 = New-X509Certificate2 -SubjectName 'CN=Azure SDK' -SubjectAlternativeNames (New-X509Certificate2SubjectAlternativeNames -EmailAddress azuresdk@microsoft.com) -KeyUsageFlags KeyEncipherment, NonRepudiation, DigitalSignature -CA -TLS -ValidDays 3652 + +$PemCertificateWithV3Extensions = ($cert2 | Format-X509Certificate2 -Type Certificate) + "`n" + ($cert2 | Format-X509Certificate2 -Type Pkcs8) +$CertificateWithV3ExtensionsBase64 = $cert2 | Format-X509Certificate2 -Type CertificateBase64 + ``` diff --git a/eng/common/scripts/X509Certificate2/X509Certificate2.psm1 b/eng/common/scripts/X509Certificate2/X509Certificate2.psm1 new file mode 100644 index 000000000000..f37ba1d58406 --- /dev/null +++ b/eng/common/scripts/X509Certificate2/X509Certificate2.psm1 @@ -0,0 +1,339 @@ +#Requires -Version 6.0 + +using namespace System.Security.Cryptography +using namespace System.Security.Cryptography.X509Certificates +using namespace System.Text + +<# +.Synopsis +Generate an X509 v3 certificate. + +.Description +Generates an [X509Certificate2] from either a subject name, or individual X500 distinguished names. + +.Parameter SubjectName +The entire X500 subject name. + +.Parameter Country +The country e.g., "US". + +.Parameter State +The state or province e.g., "WA". + +.Parameter City +The city or locality e.g., "Redmond". + +.Parameter Organization +The organization e.g., "Microsoft". + +.Parameter Department +The department e.g., "Azure SDK". + +.Parameter CommonName +A common name e.g., "www.microsoft.com". + +.Parameter SubjectAlternativeNames +Additional subject names from New-X509Certificate2SubjectAlternativeNames. + +.Parameter KeySize +Size of the RSA key. + +.Parameter KeyUsageFlags +Additional key usage flags. + +.Parameter CA +Create self-signed certificate authority. + +.Parameter TLS +Create self-signed certificate suitable for TLS. + +.Parameter NotBefore +The start date when the certificate is valid. The default is the current time. + +.Parameter ValidDays +How many days from NotBefore until the certificate expires. + +.Example +New-X509Certificate2 -SubjectName 'E=opensource@microsoft.com, CN=Azure SDK, OU=Azure SDK, O=Microsoft, L=Redmond, S=WA, C=US' -ValidDays 3652 + +Create a self-signed certificate valid for 10 years from now. + +.Example +New-X509Certificate2 -SubjectName 'CN=Azure SDK' -SubjectAlternativeNames (New-X509Certificate2SubjectAlternativeNames -EmailAddress azuresdk@microsoft.com) -KeyUsageFlags KeyEncipherment, NonRepudiation, DigitalSignature -CA -TLS -ValidDays 3652 + +Create a self-signed certificate valid for 10 years from now with an alternative name, additional key usages including TLS connections, and that can sign other certificate requests. +#> +function New-X509Certificate2 { + [CmdletBinding(DefaultParameterSetName='SubjectName')] + [OutputType([System.Security.Cryptography.X509Certificates.X509Certificate2])] + param ( + [Parameter(ParameterSetName='SubjectName', Mandatory=$true, Position=0)] + [string] $SubjectName, + + [Parameter(ParameterSetName='Builder', HelpMessage='Country Name (2 letter code)')] + [Alias('C')] + [string] $Country, + + [Parameter(ParameterSetName='Builder', HelpMessage='State or Province Name (full name)')] + [Alias('S', 'Province')] + [string] $State, + + [Parameter(ParameterSetName='Builder', HelpMessage='Locality Name (eg, city)')] + [Alias('L', 'Locality')] + [string] $City, + + [Parameter(ParameterSetName='Builder', HelpMessage='Organization Name (eg, company)')] + [Alias('O')] + [string] $Organization, + + [Parameter(ParameterSetName='Builder', HelpMessage='Organizational Unit Name (eg, section)')] + [Alias('OU')] + [string] $Department, + + [Parameter(ParameterSetName='Builder', HelpMessage='Common Name (e.g. server FQDN or YOUR name)')] + [Alias('CN')] + [string] $CommonName, + + [Parameter()] + [ValidateNotNull()] + [SubjectAlternativeNameBuilder] $SubjectAlternativeNames, + + [Parameter()] + [ValidateSet(1024, 2048, 4096)] + [int] $KeySize = 2048, + + [Parameter()] + [X509KeyUsageFlags] $KeyUsageFlags, + + [Parameter()] + [switch] $CA, + + [Parameter()] + [switch] $TLS, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [DateTimeOffset] $NotBefore = [DateTimeOffset]::Now, + + [Parameter()] + [ValidateRange(1, [int]::MaxValue)] + [int] $ValidDays = 365 + ) + + if ($PSCmdlet.ParameterSetName -eq 'Builder') { + $sb = [StringBuilder]::new() + if ($Country) { $null = $sb.Append("C=$Country,") } + if ($State) { $null = $sb.Append("S=$State, ") } + if ($City) { $null = $sb.Append("L=$City, ") } + if ($Organization) { $null = $sb.Append("O=$Organization, ") } + if ($Department) { $null = $sb.Append("OU=$Department, ") } + if ($CommonName) { $null = $sb.Append("CN=$CommonName, ") } + + $SubjectName = [X500DistinguishedName]::new($sb.ToString()).Format($false) + } + + $rsa = [RSA]::Create($KeySize) + try { + $req = [CertificateRequest]::new( + [string] $SubjectName, + $rsa, + [HashAlgorithmName]::SHA256, + [RSASignaturePadding]::Pkcs1 + ) + + $req.CertificateExtensions.Add( + [X509BasicConstraintsExtension]::new( + $CA, + $false, + 0, + $true + ) + ) + + if ($SubjectAlternativeNames) { + $req.CertificateExtensions.Add( + $SubjectAlternativeNames.Build($false) + ) + } + + if ($KeyUsageFlags) { + $req.CertificateExtensions.Add( + [X509KeyUsageExtension]::new( + $KeyUsageFlags, + $true + ) + ) + } + + if ($TLS) { + $oids = [OidCollection]::new() + $null = $oids.Add([Oid]::new('1.3.6.1.5.5.7.3.1')) + + $req.CertificateExtensions.Add( + [X509EnhancedKeyUsageExtension]::new( + $oids, + $false + ) + ) + } + + $req.CreateSelfSigned($NotBefore, $NotBefore.AddDays($ValidDays)) + } + finally { + $rsa.Dispose() + } +} + +<# +.Synopsis +Create subject alternative names for New-X509Certificate2. + +.Description +Subject alternative names include DNS names, email addresses, and IP addresses for which a certificate may also authenticate connections. + +.Parameter DnsName +One or more DNS names e.g., "www.microsoft.com". + +.Parameter EmailAddress +One or more email addresses e.g., "opensource@microsoft.com". + +.Parameter IpAddress +One or more IP addresses. + +.Parameter Uri +Additional URIs not covered by other options. + +.Parameter UserPrincipalName +Additional user names not covered by other options. +#> +function New-X509Certificate2SubjectAlternativeNames { + [CmdletBinding()] + [OutputType([System.Security.Cryptography.X509Certificates.SubjectAlternativeNameBuilder])] + param ( + [Parameter()] + [ValidateNotNullOrEmpty()] + [string[]] $DnsName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [string[]] $EmailAddress, + + [Parameter()] + [ValidateScript({[System.Net.IPAddress]::TryParse($_, [ref] $null)})] + [string[]] $IpAddress, + + [Parameter()] + [ValidateScript({[System.Uri]::TryParse($_, [ref] $null)})] + [string[]] $Uri, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [string[]] $UserPrincipalName + ) + + $subjectAlternativeNames = [SubjectAlternativeNameBuilder]::new() + + foreach ($value in $DnsName) { + $subjectAlternativeNames.AddDnsName($value) + } + + foreach ($value in $EmailAddress) { + $subjectAlternativeNames.AddEmailAddress($value) + } + + foreach ($value in $IpAddress) { + $subjectAlternativeNames.AddIpAddress($value) + } + + foreach ($value in $Uri) { + $subjectAlternativeNames.AddUri($value) + } + + foreach ($value in $UserPrincipalName) { + $subjectAlternativeNames.AddUserPrincipalName($value) + } + + $subjectAlternativeNames +} + +<# +.Synopsis +Exports a certificate to a file. + +.Description +Exports an X509Certificate2 to a file in one of the given formats. + +.Parameter Path +The path to the file to save. + +.Parameter Type +The type of encoding for the file to save. + +.Parameter Certificate +The certificate to save. +#> +function Export-X509Certificate2 { + [CmdletBinding()] + param ( + [Parameter(Mandatory=$true, Position=0)] + [string] $Path, + + [Parameter(Position=1)] + [ValidateSet('Certificate', 'CertificateBase64', 'Pfx', 'Pkcs1', 'Pkcs12', 'Pkcs12Base64', 'Pkcs8', 'PrivateKey')] + [string] $Type = 'Pfx', + + [Parameter(Mandatory=$true, ValueFromPipeline=$true)] + [X509Certificate2] $Certificate + ) + + if ($Type -in 'Pfx', 'Pkcs12') { + $Certificate.Export([X509ContentType]::Pfx) | Set-Content $Path -AsByteStream + } else { + Format-X509Certificate2 -Type $Type -Certificate $Certificate | Set-Content $Path -Encoding ASCII + } +} + +<# +.Synopsis +Formats a certificate. + +.Description +Formats a certificate and prints it to the output buffer e.g., console. Useful for piping to clip.exe in Windows and pasting into code (additional formatting may be required). + +.Parameter Type +The type of encoding for the output. + +.Parameter Certificate +The certificate to format. +#> +function Format-X509Certificate2 { + [CmdletBinding()] + param ( + [Parameter(Position=0)] + [ValidateSet('Certificate', 'CertificateBase64', 'Pkcs1', 'Pkcs12Base64', 'Pkcs8', 'PrivateKey')] + [string] $Type = 'Certificate', + + [Parameter(Mandatory=$true, ValueFromPipeline=$true)] + [X509Certificate2] $Certificate + ) + + function ConvertTo-Pem($tag, $data) { + @" +-----BEGIN $tag----- +$([Convert]::ToBase64String($data, 'InsertLineBreaks')) +-----END $tag----- +"@ + } + + if ($Type -eq 'Certificate') { + ConvertTo-Pem 'CERTIFICATE' $Certificate.RawData + } elseif ($Type -eq 'CertificateBase64') { + [Convert]::ToBase64String($Certificate.RawData, 'InsertLineBreaks') + } elseif ($Type -eq 'Pkcs1') { + ConvertTo-Pem 'RSA PRIVATE KEY' $Certificate.PrivateKey.ExportRSAPrivateKey() + } elseif ($Type -eq 'Pkcs12Base64') { + [Convert]::ToBase64String($Certificate.Export([X509ContentType]::Pfx), 'InsertLineBreaks') + } elseif ($Type -in 'Pkcs8', 'PrivateKey') { + ConvertTo-Pem 'PRIVATE KEY' $Certificate.PrivateKey.ExportPkcs8PrivateKey() + } +} diff --git a/eng/common/scripts/common.ps1 b/eng/common/scripts/common.ps1 index 8f9c707ee29e..cef0b23c5620 100644 --- a/eng/common/scripts/common.ps1 +++ b/eng/common/scripts/common.ps1 @@ -40,6 +40,7 @@ if (!(Get-Variable -Name "LanguageDisplayName" -ValueOnly -ErrorAction "Ignore") } # Transformed Functions +# Expected to be set in eng/scripts/Language-Settings.ps1 $GetPackageInfoFromRepoFn = "Get-${Language}-PackageInfoFromRepo" $GetPackageInfoFromPackageFileFn = "Get-${Language}-PackageInfoFromPackageFile" $PublishGithubIODocsFn = "Publish-${Language}-GithubIODocs" @@ -59,4 +60,11 @@ $GetPackageLevelReadmeFn = "Get-${Language}-PackageLevelReadme" $GetRepositoryLinkFn = "Get-${Language}-RepositoryLink" $GetEmitterAdditionalOptionsFn = "Get-${Language}-EmitterAdditionalOptions" $GetEmitterNameFn = "Get-${Language}-EmitterName" -$GetEmitterPackageJsonPathFn = "Get-${Language}-EmitterPackageJsonPath" +$GetDirectoriesForGenerationFn = "Get-${Language}-DirectoriesForGeneration" +$UpdateGeneratedSdksFn = "Update-${Language}-GeneratedSdks" + +# Expected to be set in eng/scripts/docs/Docs-Onboarding.ps1 +$SetDocsPackageOnboarding = "Set-${Language}-DocsPackageOnboarding" +$GetDocsPackagesAlreadyOnboarded = "Get-${Language}-DocsPackagesAlreadyOnboarded" +$GetPackageIdentity = "Get-${Language}-PackageIdentity" +$GetPackageIdentityFromCsvMetadata = "Get-${Language}-PackageIdentityFromCsvMetadata" diff --git a/eng/common/scripts/get-codeowners.lib.ps1 b/eng/common/scripts/get-codeowners.lib.ps1 deleted file mode 100644 index c34f28bb225b..000000000000 --- a/eng/common/scripts/get-codeowners.lib.ps1 +++ /dev/null @@ -1,133 +0,0 @@ -function Get-CodeownersTool([string] $ToolPath, [string] $DevOpsFeed, [string] $ToolVersion) -{ - $codeownersToolCommand = Join-Path $ToolPath "retrieve-codeowners" - # Check if the retrieve-codeowners tool exists or not. - if (Get-Command $codeownersToolCommand -errorAction SilentlyContinue) { - return $codeownersToolCommand - } - if (!(Test-Path $ToolPath)) { - New-Item -ItemType Directory -Path $ToolPath | Out-Null - } - Write-Host "Installing the retrieve-codeowners tool under tool path: $ToolPath ..." - - # Run command under tool path to avoid dotnet tool install command checking .csproj files. - # This is a bug for dotnet tool command. Issue: https://github.com/dotnet/sdk/issues/9623 - Push-Location $ToolPath - dotnet tool install --tool-path $ToolPath --add-source $DevOpsFeed --version $ToolVersion "Azure.Sdk.Tools.RetrieveCodeOwners" | Out-Null - Pop-Location - # Test to see if the tool properly installed. - if (!(Get-Command $codeownersToolCommand -errorAction SilentlyContinue)) { - Write-Error "The retrieve-codeowners tool is not properly installed. Please check your tool path: $ToolPath" - return - } - return $codeownersToolCommand -} - -<# -.SYNOPSIS -A function that given as input $TargetPath param, returns the owners -of that path, as determined by CODEOWNERS file passed in $CodeownersFileLocation -param. - -.PARAMETER TargetPath -Required*. Path to file or directory whose owners are to be determined from a -CODEOWNERS file. e.g. sdk/core/azure-amqp/ or sdk/core/foo.txt. - -*for backward compatibility, you might provide $TargetDirectory instead. - -.PARAMETER TargetDirectory -Obsolete. Replaced by $TargetPath. Kept for backward-compatibility. -If both $TargetPath and $TargetDirectory are provided, $TargetDirectory is -ignored. - -.PARAMETER CodeownersFileLocation -Optional. An absolute path to the CODEOWNERS file against which the $TargetPath param -will be checked to determine its owners. - -.PARAMETER ToolVersion -Optional. The NuGet package version of the package containing the "retrieve-codeowners" -tool, around which this script is a wrapper. - -.PARAMETER ToolPath -Optional. The place to check the "retrieve-codeowners" tool existence. - -.PARAMETER DevOpsFeed -Optional. The NuGet package feed from which the "retrieve-codeowners" tool is to be installed. - -NuGet feed: -https://dev.azure.com/azure-sdk/public/_artifacts/feed/azure-sdk-for-net/NuGet/Azure.Sdk.Tools.RetrieveCodeOwners - -Pipeline publishing the NuGet package to the feed, "tools - code-owners-parser": -https://dev.azure.com/azure-sdk/internal/_build?definitionId=3188 - -.PARAMETER VsoVariable -Optional. If provided, the determined owners, based on $TargetPath matched against CODEOWNERS file at $CodeownersFileLocation, -will be output to Azure DevOps pipeline log as variable named $VsoVariable. - -Reference: -https://learn.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch -https://learn.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands?view=azure-devops&tabs=bash#logging-command-format - -.PARAMETER IncludeNonUserAliases -Optional. Whether to include in the returned owners list aliases that are team aliases, e.g. Azure/azure-sdk-team - -.PARAMETER Test -Optional. Whether to run the script against hard-coded tests. - -#> -function Get-Codeowners( - [string] $TargetPath, - [string] $TargetDirectory, - [string] $ToolPath = (Join-Path ([System.IO.Path]::GetTempPath()) "codeowners-tool"), - [string] $DevOpsFeed = "https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-net/nuget/v3/index.json", - [string] $ToolVersion = "1.0.0-dev.20230306.3", - [string] $VsoVariable = "", - [string] $CodeownersFileLocation = "", - [switch] $IncludeNonUserAliases - ) -{ - if ([string]::IsNullOrWhiteSpace($CodeownersFileLocation)) { - # The $PSScriptRoot is assumed to be azure-sdk-tools/eng/common/scripts/get-codeowners.ps1 - $CodeownersFileLocation = (Resolve-Path $PSScriptRoot/../../../.github/CODEOWNERS) - } - - # Backward compatibility: if $TargetPath is not provided, fall-back to the legacy $TargetDirectory - if ([string]::IsNullOrWhiteSpace($TargetPath)) { - $TargetPath = $TargetDirectory - } - if ([string]::IsNullOrWhiteSpace($TargetPath)) { - Write-Error "TargetPath (or TargetDirectory) parameter must be neither null nor whitespace." - return ,@() - } - - $codeownersToolCommand = Get-CodeownersTool -ToolPath $ToolPath -DevOpsFeed $DevOpsFeed -ToolVersion $ToolVersion - Write-Host "Executing: & $codeownersToolCommand --target-path $TargetPath --codeowners-file-path-or-url $CodeownersFileLocation --exclude-non-user-aliases:$(!$IncludeNonUserAliases)" - $commandOutput = & $codeownersToolCommand ` - --target-path $TargetPath ` - --codeowners-file-path-or-url $CodeownersFileLocation ` - --exclude-non-user-aliases:$(!$IncludeNonUserAliases) ` - 2>&1 - - if ($LASTEXITCODE -ne 0) { - Write-Host "Command $codeownersToolCommand execution failed (exit code = $LASTEXITCODE). Output string: $commandOutput" - return ,@() - } else - { - Write-Host "Command $codeownersToolCommand executed successfully (exit code = 0). Command output string length: $($commandOutput.length)" - } - -# Assert: $commandOutput is a valid JSON representing: -# - a single CodeownersEntry, if the $TargetPath was a single path -# - or a dictionary of CodeownerEntries, keyes by each path resolved from a $TargetPath glob path. -# -# For implementation details, see Azure.Sdk.Tools.RetrieveCodeOwners.Program.Main - -$codeownersJson = $commandOutput | ConvertFrom-Json - - if ($VsoVariable) { - $codeowners = $codeownersJson.Owners -join "," - Write-Host "##vso[task.setvariable variable=$VsoVariable;]$codeowners" - } - - return ,@($codeownersJson.Owners) -} \ No newline at end of file diff --git a/eng/common/scripts/get-codeowners.ps1 b/eng/common/scripts/get-codeowners.ps1 deleted file mode 100644 index b40f9b4fa29f..000000000000 --- a/eng/common/scripts/get-codeowners.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -<# -.SYNOPSIS -Please see the comment on Get-Codeowners defined in ./get-codeowners.lib.ps1 -#> -param ( - [string] $TargetPath = "", - [string] $TargetDirectory = "", - [string] $CodeownersFileLocation = "", - [switch] $IncludeNonUserAliases -) - -. $PSScriptRoot/get-codeowners.lib.ps1 - -return Get-Codeowners ` - -TargetPath $TargetPath ` - -TargetDirectory $TargetDirectory ` - -CodeownersFileLocation $CodeownersFileLocation ` - -IncludeNonUserAliases:$IncludeNonUserAliases \ No newline at end of file diff --git a/eng/common/scripts/stress-testing/deploy-stress-tests.ps1 b/eng/common/scripts/stress-testing/deploy-stress-tests.ps1 index bc028f26aa10..61d8f947d800 100644 --- a/eng/common/scripts/stress-testing/deploy-stress-tests.ps1 +++ b/eng/common/scripts/stress-testing/deploy-stress-tests.ps1 @@ -1,16 +1,14 @@ -# Set a default parameter set here so we can call this script without requiring -Login and -Subscription, -# but if it IS called with either of those, then both parameters need to be required. Not defining a -# default parameter set makes Login/Subscription required all the time. +# Not defining a default parameter set makes SkipLogin/Subscription required all the time. [CmdletBinding(DefaultParameterSetName = 'Default')] param( [string]$SearchDirectory, [hashtable]$Filters, [string]$Environment, [string]$Repository, - [switch]$PushImages, + [switch]$SkipPushImages, [string]$ClusterGroup, [string]$DeployId, - [switch]$Login, + [switch]$SkipLogin, [string]$Subscription, # Default to true in Azure Pipelines environments @@ -33,7 +31,10 @@ param( [Parameter(Mandatory=$False)][string]$MatrixDisplayNameFilter, [Parameter(Mandatory=$False)][array]$MatrixFilters, [Parameter(Mandatory=$False)][array]$MatrixReplace, - [Parameter(Mandatory=$False)][array]$MatrixNonSparseParameters + [Parameter(Mandatory=$False)][array]$MatrixNonSparseParameters, + + # Prevent kubernetes from deleting nodes or rebalancing pods related to this test for N days + [Parameter(Mandatory=$False)][ValidateRange(1, 14)][int]$LockDeletionForDays ) . $PSScriptRoot/stress-test-deployment-lib.ps1 diff --git a/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 b/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 index 5ad163c6a848..dde43649a391 100644 --- a/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 +++ b/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 @@ -43,7 +43,7 @@ function RunOrExitOnFailure() } } -function Login([string]$subscription, [string]$clusterGroup, [switch]$pushImages) +function Login([string]$subscription, [string]$clusterGroup, [switch]$skipPushImages) { Write-Host "Logging in to subscription, cluster and container registry" az account show *> $null @@ -59,7 +59,7 @@ function Login([string]$subscription, [string]$clusterGroup, [switch]$pushImages $kubeContext = (RunOrExitOnFailure kubectl config view -o json) | ConvertFrom-Json -AsHashtable $defaultNamespace = $null $targetContext = $kubeContext.contexts.Where({ $_.name -eq $clusterName }) | Select -First 1 - if ($targetContext -ne $null -and $targetContext.PSObject.Properties.Name -match "namespace") { + if ($targetContext -ne $null -and $targetContext.Contains('context') -and $targetContext.context.Contains('namespace')) { $defaultNamespace = $targetContext.context.namespace } @@ -73,10 +73,10 @@ function Login([string]$subscription, [string]$clusterGroup, [switch]$pushImages RunOrExitOnFailure kubectl config set-context $clusterName --namespace $defaultNamespace } - if ($pushImages) { + if (!$skipPushImages) { $registry = RunOrExitOnFailure az acr list -g $clusterGroup --subscription $subscription -o json $registryName = ($registry | ConvertFrom-Json).name - RunOrExitOnFailure az acr login -n $registryName + RunOrExitOnFailure az acr login -n $registryName --subscription $subscription } } @@ -86,10 +86,10 @@ function DeployStressTests( # Default to playground environment [string]$environment = 'pg', [string]$repository = '', - [switch]$pushImages, + [switch]$skipPushImages, [string]$clusterGroup = '', [string]$deployId = '', - [switch]$login, + [switch]$skipLogin, [string]$subscription = '', [switch]$CI, [string]$Namespace, @@ -107,7 +107,8 @@ function DeployStressTests( [Parameter(Mandatory=$False)][string]$MatrixDisplayNameFilter, [Parameter(Mandatory=$False)][array]$MatrixFilters, [Parameter(Mandatory=$False)][array]$MatrixReplace, - [Parameter(Mandatory=$False)][array]$MatrixNonSparseParameters + [Parameter(Mandatory=$False)][array]$MatrixNonSparseParameters, + [Parameter(Mandatory=$False)][int]$LockDeletionForDays ) { if ($environment -eq 'pg') { if ($clusterGroup -or $subscription) { @@ -125,8 +126,8 @@ function DeployStressTests( throw "clusterGroup and subscription parameters must be specified when deploying to an environment that is not pg or prod." } - if ($login) { - Login -subscription $subscription -clusterGroup $clusterGroup -pushImages:$pushImages + if (!$skipLogin) { + Login -subscription $subscription -clusterGroup $clusterGroup -skipPushImages:$skipPushImages } $chartRepoName = 'stress-test-charts' @@ -162,13 +163,13 @@ function DeployStressTests( -deployId $deployer ` -environment $environment ` -repositoryBase $repository ` - -pushImages:$pushImages ` - -login:$login ` + -skipPushImages:$skipPushImages ` + -skipLogin:$skipLogin ` -clusterGroup $clusterGroup ` -subscription $subscription } - if ($FailedCommands.Count -lt $pkgs.Count) { + if ($FailedCommands.Count -lt $pkgs.Count -and !$Template) { Write-Host "Releases deployed by $deployer" Run helm list --all-namespaces -l deployId=$deployer } @@ -189,8 +190,8 @@ function DeployStressPackage( [string]$deployId, [string]$environment, [string]$repositoryBase, - [switch]$pushImages, - [switch]$login, + [switch]$skipPushImages, + [switch]$skipLogin, [string]$clusterGroup, [string]$subscription ) { @@ -211,12 +212,14 @@ function DeployStressPackage( } $imageTagBase += "/$($pkg.Namespace)/$($pkg.ReleaseName)" - Write-Host "Creating namespace $($pkg.Namespace) if it does not exist..." - kubectl create namespace $pkg.Namespace --dry-run=client -o yaml | kubectl apply -f - - if ($LASTEXITCODE) {exit $LASTEXITCODE} - Write-Host "Adding default resource requests to namespace/$($pkg.Namespace)" - $limitRangeSpec | kubectl apply -n $pkg.Namespace -f - - if ($LASTEXITCODE) {exit $LASTEXITCODE} + if (!$Template) { + Write-Host "Creating namespace $($pkg.Namespace) if it does not exist..." + kubectl create namespace $pkg.Namespace --dry-run=client -o yaml | kubectl apply -f - + if ($LASTEXITCODE) {exit $LASTEXITCODE} + Write-Host "Adding default resource requests to namespace/$($pkg.Namespace)" + $limitRangeSpec | kubectl apply -n $pkg.Namespace -f - + if ($LASTEXITCODE) {exit $LASTEXITCODE} + } $dockerBuildConfigs = @() @@ -267,10 +270,13 @@ function DeployStressPackage( } $dockerfileName = ($dockerFilePath -split { $_ -in '\', '/' })[-1].ToLower() $imageTag = $imageTagBase + "/${dockerfileName}:${deployId}" - if ($pushImages) { + if (!$skipPushImages) { Write-Host "Building and pushing stress test docker image '$imageTag'" $dockerFile = Get-ChildItem $dockerFilePath + Write-Host "Setting DOCKER_BUILDKIT=1" + $env:DOCKER_BUILDKIT = 1 + $dockerBuildCmd = "docker", "build", "-t", $imageTag, "-f", $dockerFile foreach ($buildArg in $dockerBuildConfig.scenario.GetEnumerator()) { $dockerBuildCmd += "--build-arg" @@ -290,8 +296,8 @@ function DeployStressPackage( Run docker push $imageTag if ($LASTEXITCODE) { - if ($login) { - Write-Warning "If docker push is failing due to authentication issues, try calling this script with '-Login'" + if (!$skipLogin) { + Write-Warning "If docker push is failing due to authentication issues, try calling this script without '-SkipLogin'" } } } @@ -314,8 +320,18 @@ function DeployStressPackage( $generatedConfigPath = Join-Path $pkg.Directory generatedValues.yaml $subCommand = $Template ? "template" : "upgrade" - $installFlag = $Template ? "" : "--install" - $helmCommandArg = "helm", $subCommand, $releaseName, $pkg.Directory, "-n", $pkg.Namespace, $installFlag, "--set", "stress-test-addons.env=$environment", "--values", $generatedConfigPath + $subCommandFlag = $Template ? "--debug" : "--install" + $helmCommandArg = "helm", $subCommand, $releaseName, $pkg.Directory, "-n", $pkg.Namespace, $subCommandFlag, "--values", $generatedConfigPath, "--set", "stress-test-addons.env=$environment" + + if ($LockDeletionForDays) { + $date = (Get-Date).AddDays($LockDeletionForDays).ToUniversalTime() + $isoDate = $date.ToString("o") + # Tell kubernetes job to run only on this specific future time. Technically it will run once per year. + $cron = "$($date.Minute) $($date.Hour) $($date.Day) $($date.Month) *" + + Write-Host "PodDisruptionBudget will be set to prevent deletion until $isoDate" + $helmCommandArg += "--set", "PodDisruptionBudgetExpiry=$($isoDate)", "--set", "PodDisruptionBudgetExpiryCron=$cron" + } $result = (Run @helmCommandArg) 2>&1 | Write-Host @@ -339,7 +355,7 @@ function DeployStressPackage( # Helm 3 stores release information in kubernetes secrets. The only way to add extra labels around # specific releases (thereby enabling filtering on `helm list`) is to label the underlying secret resources. # There is not currently support for setting these labels via the helm cli. - if(!$Template) { + if (!$Template) { $helmReleaseConfig = RunOrExitOnFailure kubectl get secrets ` -n $pkg.Namespace ` -l "status=deployed,name=$releaseName" ` @@ -387,6 +403,21 @@ function CheckDependencies() throw "Please update helm to version >= $MIN_HELM_VERSION (current version: $helmVersionString)`nAdditional information for updating helm version can be found here: https://helm.sh/docs/intro/install/" } + # Ensure docker is running via command and handle command hangs + if (!$skipPushImages) { + $LastErrorActionPreference = $ErrorActionPreference + $ErrorActionPreference = 'Continue' + $job = Start-Job { docker ps; return $LASTEXITCODE } + $result = $job | Wait-Job -Timeout 5 | Receive-Job + + $ErrorActionPreference = $LastErrorActionPreference + $job | Remove-Job -Force + + if (($result -eq $null -and $job.State -ne "Completed") -or ($result | Select -Last 1) -ne 0) { + throw "Docker does not appear to be running. Start/restart docker or re-run this script with -SkipPushImages" + } + } + if ($shouldError) { exit 1 } diff --git a/eng/common/spelling/package-lock.json b/eng/common/spelling/package-lock.json index 73aa96879e91..a98640c417bd 100644 --- a/eng/common/spelling/package-lock.json +++ b/eng/common/spelling/package-lock.json @@ -15,30 +15,30 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -103,150 +103,164 @@ } }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.12.0.tgz", - "integrity": "sha512-myfsDwSJcAMjKbztKBG424wIp/YV9/lvxsgHFKxBGPi+nNx1p7TbOjAAO9EWk0mZVHyGKZwCFJS2ohkoqxJWoQ==", - "dependencies": { - "@cspell/dict-ada": "^2.0.1", - "@cspell/dict-aws": "^2.0.0", - "@cspell/dict-bash": "^2.0.4", - "@cspell/dict-companies": "^2.0.14", - "@cspell/dict-cpp": "^3.2.1", - "@cspell/dict-cryptocurrencies": "^2.0.0", - "@cspell/dict-csharp": "^3.0.1", - "@cspell/dict-css": "^2.1.0", - "@cspell/dict-dart": "^1.1.1", - "@cspell/dict-django": "^2.0.0", - "@cspell/dict-docker": "^1.1.1", - "@cspell/dict-dotnet": "^2.0.1", - "@cspell/dict-elixir": "^2.0.1", - "@cspell/dict-en_us": "^2.3.3", - "@cspell/dict-en-gb": "^1.1.33", - "@cspell/dict-filetypes": "^2.1.1", - "@cspell/dict-fonts": "^2.1.0", - "@cspell/dict-fullstack": "^2.0.6", - "@cspell/dict-git": "^1.0.1", - "@cspell/dict-golang": "^3.0.1", - "@cspell/dict-haskell": "^2.0.1", - "@cspell/dict-html": "^3.3.2", - "@cspell/dict-html-symbol-entities": "^3.0.0", - "@cspell/dict-java": "^3.0.7", - "@cspell/dict-latex": "^2.0.9", - "@cspell/dict-lorem-ipsum": "^2.0.1", - "@cspell/dict-lua": "^2.0.0", - "@cspell/dict-node": "^3.0.1", - "@cspell/dict-npm": "^3.1.2", - "@cspell/dict-php": "^2.0.0", - "@cspell/dict-powershell": "^2.0.0", - "@cspell/dict-public-licenses": "^1.0.6", - "@cspell/dict-python": "^3.0.6", - "@cspell/dict-r": "^1.0.3", - "@cspell/dict-ruby": "^2.0.2", - "@cspell/dict-rust": "^2.0.1", - "@cspell/dict-scala": "^2.0.0", - "@cspell/dict-software-terms": "^2.2.11", - "@cspell/dict-sql": "^1.0.4", - "@cspell/dict-swift": "^1.0.3", - "@cspell/dict-typescript": "^2.0.2", - "@cspell/dict-vue": "^2.0.2" + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.2.tgz", + "integrity": "sha512-rQ5y/U1Ah5AaduIh3NU2z371hRrOr1cmNdhhP8oiuz2E4VqmcoVHflXIct9DgY8uIJpwsSCdR6ypOQWZYXYnwA==", + "dependencies": { + "@cspell/dict-ada": "^4.0.1", + "@cspell/dict-aws": "^3.0.0", + "@cspell/dict-bash": "^4.1.1", + "@cspell/dict-companies": "^3.0.9", + "@cspell/dict-cpp": "^5.0.2", + "@cspell/dict-cryptocurrencies": "^3.0.1", + "@cspell/dict-csharp": "^4.0.2", + "@cspell/dict-css": "^4.0.5", + "@cspell/dict-dart": "^2.0.2", + "@cspell/dict-django": "^4.0.2", + "@cspell/dict-docker": "^1.1.6", + "@cspell/dict-dotnet": "^5.0.0", + "@cspell/dict-elixir": "^4.0.2", + "@cspell/dict-en_us": "^4.3.2", + "@cspell/dict-en-common-misspellings": "^1.0.2", + "@cspell/dict-en-gb": "1.1.33", + "@cspell/dict-filetypes": "^3.0.0", + "@cspell/dict-fonts": "^3.0.2", + "@cspell/dict-fullstack": "^3.1.5", + "@cspell/dict-gaming-terms": "^1.0.4", + "@cspell/dict-git": "^2.0.0", + "@cspell/dict-golang": "^6.0.1", + "@cspell/dict-haskell": "^4.0.1", + "@cspell/dict-html": "^4.0.3", + "@cspell/dict-html-symbol-entities": "^4.0.0", + "@cspell/dict-java": "^5.0.5", + "@cspell/dict-k8s": "^1.0.1", + "@cspell/dict-latex": "^4.0.0", + "@cspell/dict-lorem-ipsum": "^3.0.0", + "@cspell/dict-lua": "^4.0.1", + "@cspell/dict-node": "^4.0.2", + "@cspell/dict-npm": "^5.0.5", + "@cspell/dict-php": "^4.0.1", + "@cspell/dict-powershell": "^5.0.1", + "@cspell/dict-public-licenses": "^2.0.2", + "@cspell/dict-python": "^4.0.2", + "@cspell/dict-r": "^2.0.1", + "@cspell/dict-ruby": "^5.0.0", + "@cspell/dict-rust": "^4.0.1", + "@cspell/dict-scala": "^5.0.0", + "@cspell/dict-software-terms": "^3.1.6", + "@cspell/dict-sql": "^2.1.0", + "@cspell/dict-svelte": "^1.0.2", + "@cspell/dict-swift": "^2.0.1", + "@cspell/dict-typescript": "^3.1.1", + "@cspell/dict-vue": "^3.0.0" }, "engines": { "node": ">=14" } }, "node_modules/@cspell/cspell-pipe": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.12.0.tgz", - "integrity": "sha512-Nkm+tIJ5k+jZPovZCdmZhrWrwRFwnDq+7yCxhov0C7UX3hsSNtTJIpFuaCNEQJ+Whpvxdh1YKflvHiHYygEgTg==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.1.tgz", + "integrity": "sha512-zk1olZi4dr6GLm5PAjvsiZ01HURNSruUYFl1qSicGnTwYN8GaN4RhAwannAytcJ7zJPIcyXlid0YsB58nJf3wQ==", "engines": { "node": ">=14" } }, "node_modules/@cspell/cspell-service-bus": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.12.0.tgz", - "integrity": "sha512-GgvciSeMUekl8z8vP8//cs5/qRQJSLz9IVREf6fxQW4upjw6zXZ1KonwPqOF5uLocIMAr8eCdrJzHKuKvigJIA==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.1.tgz", + "integrity": "sha512-YyBicmJyZ1uwKVxujXw7sgs9x+Eps43OkWmCtDZmZlnq489HdTSuhF1kTbVi2yeFSeaXIS87+uHo12z97KkQpg==", "engines": { "node": ">=14" } }, "node_modules/@cspell/cspell-types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.12.0.tgz", - "integrity": "sha512-BcZTt05fNy9SGXfbPgUyxS4FfIaUpcVq8IOJ0noN+jsKsmlbssOUgJOB2ApN1h66FfWcKuFy/uNrjfcrQ7PTqg==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.1.tgz", + "integrity": "sha512-1KeTQFiHMssW1eRoF2NZIEg4gPVIfXLsL2+VSD/AV6YN7lBcuf6gRRgV5KWYarhxtEfjxhDdDTmu26l/iJEUtw==", "engines": { "node": ">=14" } }, "node_modules/@cspell/dict-ada": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-2.0.1.tgz", - "integrity": "sha512-vopTJ1oHrrFYV5GU55Sr+AzItR78Uj5YbCaspYABmYKlq4NRrcUAUsr4bWgymDcspMIHO7e7IFcj48OKs1fndA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.1.tgz", + "integrity": "sha512-/E9o3nHrXOhYmQE43deKbxZcR3MIJAsa+66IzP9TXGHheKEx8b9dVMVVqydDDH8oom1H0U20NRPtu6KRVbT9xw==" }, "node_modules/@cspell/dict-aws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-2.0.0.tgz", - "integrity": "sha512-NKz7pDZ7pwj/b33i3f4WLpC1rOOUMmENwYgftxU+giU2YBeKM2wZbMTSEIzsrel56r0UlQYmdIVlP/B4nnVaoQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz", + "integrity": "sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==" }, "node_modules/@cspell/dict-bash": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-2.0.4.tgz", - "integrity": "sha512-uK/ehmp5LYrmRH2Gv3nbvdPswpkybJUn34WYKLpeuYHQktmi+pOI1A9uPdBPnSbMDffSvwQlQohIyKawz+X8Ag==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.1.tgz", + "integrity": "sha512-8czAa/Mh96wu2xr0RXQEGMTBUGkTvYn/Pb0o+gqOO1YW+poXGQc3gx0YPqILDryP/KCERrNvkWUJz3iGbvwC2A==" }, "node_modules/@cspell/dict-companies": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-2.0.14.tgz", - "integrity": "sha512-Sq1X29Z05OZ/UNqTwVhf3/WaqvJQy4/S6gS8qYI5AQRX45gVe8CPhNBLmZOTC6z8m716bfQCxa5rRT9YNSdTZg==" + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.17.tgz", + "integrity": "sha512-vo1jbozgZWSzz2evIL26kLd35tVb+5kW/UTvTzAwaWutSWRloRyKx38nj2CaLJ2IFxBdiATteCFGTzKCvJJl6A==" }, "node_modules/@cspell/dict-cpp": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-3.2.1.tgz", - "integrity": "sha512-XcmzrKIghqFfrYLLaHtWKOp9rupiuGdc5ODONk+emsq0W5CIc3Abn27IQHwUzxzF+Cm5IfKAIJ5Kpe6hkzm0HQ==" + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.3.tgz", + "integrity": "sha512-7sx/RFsf0hB3q8chx8OHYl9Kd+g0pqA1laphwaAQ+/jPwoAreYT3kNQWbJ3bIt/rMoORetFSQxckSbaJXwwqpw==" }, "node_modules/@cspell/dict-cryptocurrencies": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-2.0.0.tgz", - "integrity": "sha512-nREysmmfOp7L2YCRAUufQahwD5/Punzb5AZ6eyg4zUamdRWHgBFphb5/9h2flt1vgdUfhc6hZcML21Ci7iXjaA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz", + "integrity": "sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==" }, "node_modules/@cspell/dict-csharp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-3.0.1.tgz", - "integrity": "sha512-xkfQu03F388w4sdVQSSjrVMkxAxpTYB2yW7nw0XYtTjl3L/jBgvTr/j1BTjdFbQhdNf10Lg0Ak1kXOjmHodVqA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz", + "integrity": "sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==" }, "node_modules/@cspell/dict-css": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-2.1.0.tgz", - "integrity": "sha512-glASAELcGhh4Ru0rTQ4G9mTQxSyPwsZOON/5BYflB6Kks8YC8nUvKrtMCoo5W7CPKPfSEa8zUNctFQ1+IUYDHA==" + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", + "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==" }, "node_modules/@cspell/dict-dart": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-1.1.1.tgz", - "integrity": "sha512-XBOCpezXrgFN18kGEwqMpTUGZdw4BjCoJrNOo6qBdcdZySCrEHLwELraLOkcSba2kM4stmTp0t59FkwtP8TKOA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.2.tgz", + "integrity": "sha512-jigcODm7Z4IFZ4vParwwP3IT0fIgRq/9VoxkXfrxBMsLBGGM2QltHBj7pl+joX+c4cOHxfyZktGJK1B1wFtR4Q==" + }, + "node_modules/@cspell/dict-data-science": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.7.tgz", + "integrity": "sha512-Q9VUFaarUpqM6CAmR8peP4o9alk0XQ4rgVoE2R2XalpC2cqPI8Hmg6QwMU2UPioSUcWMJCqLc/KzJti0gBMuxA==" }, "node_modules/@cspell/dict-django": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-2.0.0.tgz", - "integrity": "sha512-GkJdJv6cmzrKcmq2/oxTXjKF5uv71r4eTqnFmgPbNBW1t+G4VYpzOf0QrVQrhx2RC4DdW5XfcTf+iS0FxHOTmw==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.0.tgz", + "integrity": "sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==" }, "node_modules/@cspell/dict-docker": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.1.tgz", - "integrity": "sha512-UEYoeRDm7oUN9yz1mYSozz6D4+2N14S/cd2Re9et6Xzq6yi62s4ky3knF92Of2weelADjnN41UA22VBhRAf7Sw==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.6.tgz", + "integrity": "sha512-zCCiRTZ6EOQpBnSOm0/3rnKW1kCcAUDUA7SxJG3SuH6iZvKi3I8FEg8+O83WQUeXg0SyPNerD9F40JLnnJjJig==" }, "node_modules/@cspell/dict-dotnet": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-2.0.1.tgz", - "integrity": "sha512-b1n4crJRW0WZVf9Gp/52j/tDtjYiZ3N81fIyfqPlBrjsh/5AivfA697DYwQ2mr8ngNX7RsqRtYNQjealA1rEnQ==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.0.tgz", + "integrity": "sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==" }, "node_modules/@cspell/dict-elixir": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-2.0.1.tgz", - "integrity": "sha512-eTTTxZt1FqGkM780yFDxsGHvTbWqvlK8YISSccK8FyrB6ULW+uflQlNS5AnWg3uWKC48b7pQott+odYCsPJ+Ow==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz", + "integrity": "sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==" }, "node_modules/@cspell/dict-en_us": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-2.3.3.tgz", - "integrity": "sha512-csyKeaNktfpvMkmE2GOPTwsrQm3wWhLKVaDRaGU0qTcIjDiCvqv/iYgrVrKRkoddA3kdNTZ8YNCcix7lb6VkOg==" + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.4.tgz", + "integrity": "sha512-mR2yqWmFip1zTKja2SqyVMbzuqEThqkEJk9M32bMDziPJpEyOIPvLA0UPmj3cyRKJkRuVF0bhDCE33O+at38hw==" + }, + "node_modules/@cspell/dict-en-common-misspellings": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-1.0.2.tgz", + "integrity": "sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==" }, "node_modules/@cspell/dict-en-gb": { "version": "1.1.33", @@ -254,144 +268,208 @@ "integrity": "sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==" }, "node_modules/@cspell/dict-filetypes": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-2.1.1.tgz", - "integrity": "sha512-Oo0/mUbFHzsaATqRLdkV1RMoYns3aGzeKFIpVJg415GYtJ8EABXtEArYTXeMwlboyGTPvEk+PR2hBSTSfQTqmg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.1.tgz", + "integrity": "sha512-8z8mY1IbrTyTRumx2vvD9yzRhNMk9SajM/GtI5hdMM2pPpNSp25bnuauzjRf300eqlqPY2MNb5MmhBFO014DJw==" }, "node_modules/@cspell/dict-fonts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-2.1.0.tgz", - "integrity": "sha512-hk7xsbfWEUhc136Xj7I2TD7ouKAfWwzCVAQaHBxcVXAsVxu7bDOGj4FvE2jBzlkSUY8A9Ww8qS0GOFvowJshVg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.2.tgz", + "integrity": "sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==" }, "node_modules/@cspell/dict-fullstack": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-2.0.6.tgz", - "integrity": "sha512-R2E2xvbHvvRwwurxfpBJDRIJjXBMfEPF5WNV3LTOEMRqkZtoYCeJK9aqc8LHlmJMtAbnN1cx//BCDIyTJ0rO0A==" + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.1.5.tgz", + "integrity": "sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==" + }, + "node_modules/@cspell/dict-gaming-terms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.4.tgz", + "integrity": "sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==" }, "node_modules/@cspell/dict-git": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-1.0.1.tgz", - "integrity": "sha512-Rk+eTof/9inF11lvxmkCRK+gODatA3qai8kSASv6OG/JfPvpj7fTHErx/rdgPw/LOTDUafnoTjTYmj7B2MOQXg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-2.0.0.tgz", + "integrity": "sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==" }, "node_modules/@cspell/dict-golang": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-3.0.1.tgz", - "integrity": "sha512-0KNfXTbxHW2l8iVjxeOf+KFv9Qrw3z5cyKnkuYJWlBTSB5KcUBfeKCb4fsds26VdANqiy6U91b4gDx5kNEmBjQ==" + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.2.tgz", + "integrity": "sha512-5pyZn4AAiYukAW+gVMIMVmUSkIERFrDX2vtPDjg8PLQUhAHWiVeQSDjuOhq9/C5GCCEZU/zWSONkGiwLBBvV9A==" }, "node_modules/@cspell/dict-haskell": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-2.0.1.tgz", - "integrity": "sha512-ooA23qIG7InOOxlLm67CNH5O2J85QsPHEAzEU9KEqVfYG5ovFs5tx6n9pHekDVk3MpQULpqfNUYDR0KigPLg5g==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz", + "integrity": "sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==" }, "node_modules/@cspell/dict-html": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-3.3.2.tgz", - "integrity": "sha512-cM5pQSEiqjrdk6cRFLrlLdWNT/J8399f/A6DjwjfYhHrGy0e/Rsjv76HZT0GlE1OqMoq9eG9jdQsfoYYgWTIpQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz", + "integrity": "sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w==" }, "node_modules/@cspell/dict-html-symbol-entities": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-3.0.0.tgz", - "integrity": "sha512-04K7cPTcbYXmHICfiob4gZA1yaj4hpfM+Nl5WIJ1EAZsSGHdqmGEF28GuCjyQ8ZeKiJAsPt/vXuLBbjxkHqZyQ==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz", + "integrity": "sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==" }, "node_modules/@cspell/dict-java": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-3.0.7.tgz", - "integrity": "sha512-IL7ubsRvKX6dZSx++TplJCfhiS7kkEGpbTPG0gMEP50DTNAVM4icZS8zmer2UBCU5PTwF85abJjdX7mRADWKVg==" + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz", + "integrity": "sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg==" + }, + "node_modules/@cspell/dict-k8s": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz", + "integrity": "sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw==" }, "node_modules/@cspell/dict-latex": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-2.0.9.tgz", - "integrity": "sha512-d1kTK6dJb5z6UcfASQWjqQlsjZvnoVOvMWxYtLpGksYf6gM4IgqoPVNMLYYK6xBS4T/uAnLIj975A6YuAeyZpg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.0.tgz", + "integrity": "sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==" }, "node_modules/@cspell/dict-lorem-ipsum": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-2.0.1.tgz", - "integrity": "sha512-s7Ft8UiloUJwgz4z8uLeFvCkeTcZ43HQl7mSAlZd76eW+keLSsdeGmLDx2zaciqo+MftPGyzygVCwaJjTGxiew==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz", + "integrity": "sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==" }, "node_modules/@cspell/dict-lua": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-2.0.0.tgz", - "integrity": "sha512-7WUEBEspSKtsq104WdIys1+DLqAxpJPzw74Py1TuE3fI5GvlzeSZkRFP2ya54GB2lCO4C3mq4M8EnitpibVDfw==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.1.tgz", + "integrity": "sha512-j0MFmeCouSoC6EdZTbvGe1sJ9V+ruwKSeF+zRkNNNload7R72Co5kX1haW2xLHGdlq0kqSy1ODRZKdVl0e+7hg==" }, "node_modules/@cspell/dict-node": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-3.0.1.tgz", - "integrity": "sha512-sK2cpuV0EAc43Amd5xeQXkI9MeRTECMw+yjap06gKSModbgI7BqJUHeKZed+0Hii+LpaJ4TYpLGiRVsO+qSk0w==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", + "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==" }, "node_modules/@cspell/dict-npm": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-3.1.3.tgz", - "integrity": "sha512-xnGp+TMpArdMLBUSG+ZrbEuhvY016rb76Yh35/OPDDEEz4ulENxLSZJxtN2/A0tZ9FJngDNSdFh7eJsOFmciZQ==" + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.7.tgz", + "integrity": "sha512-6SegF0HsVaBTl6PlHjeErG8Av+tRYkUG1yaXUQIGWXU0A8oxhI0o4PuL65UWH5lkCKhJyGai69Cd0iytL0oVFg==" }, "node_modules/@cspell/dict-php": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-2.0.0.tgz", - "integrity": "sha512-29WgU77eTO985LvMHwPi1pcpfopfCWfTdffDyqya0JIfOSaFUrlYKzGPkE4mRxcz2G3hXsaM0SRvBNdIRwEdUg==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz", + "integrity": "sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ==" }, "node_modules/@cspell/dict-powershell": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-2.0.0.tgz", - "integrity": "sha512-6uvEhLiGmG3u9TFkM1TYcky6aL9Yk7Sk3KJwoTYBaQJY2KqrprgyQtW6yxIw9oU52VRHlq3KKvSAA9Q26+SIkQ==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.2.tgz", + "integrity": "sha512-IHfWLme3FXE7vnOmMncSBxOsMTdNWd1Vcyhag03WS8oANSgX8IZ+4lMI00mF0ptlgchf16/OU8WsV4pZfikEFw==" }, "node_modules/@cspell/dict-public-licenses": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-1.0.6.tgz", - "integrity": "sha512-Z9IUFPkkOpOsEdgPUfQOJNQ+qU6+iBAZWS/CR5sUqTX+s5VkPNVwQyVC2kdmgmE2U5qwzAPewG6nVKr2MVogwg==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.2.tgz", + "integrity": "sha512-baKkbs/WGEV2lCWZoL0KBPh3uiPcul5GSDwmXEBAsR5McEW52LF94/b7xWM0EmSAc/y8ODc5LnPYC7RDRLi6LQ==" }, "node_modules/@cspell/dict-python": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-3.0.6.tgz", - "integrity": "sha512-tzxJ4sd9ZGhAUKg/WJJpQGDNtoHvM8Wn+iS2+PnQj2/LTHBW4mnaCogsGsBtYu8C4b2+BEQs+tc5808AeEfLug==" + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.2.tgz", + "integrity": "sha512-Whcn4K8R0Ux/hcx/P9Fbx6i29GwTaXgT3LTt95AuCnV5RRLrzsqoyZkz851hcg5z4kjUQVMduDl3HECGgW/FNw==", + "dependencies": { + "@cspell/dict-data-science": "^1.0.0" + } }, "node_modules/@cspell/dict-r": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-1.0.3.tgz", - "integrity": "sha512-u2qeXd4cx/TvTVcmkvA+sK6f4K1uMAMO6QPMSr1pSvqGElPRP1mIBXmuiSuBzLO3LbsJuUEHw5Cp3/bxIB6rNA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.0.1.tgz", + "integrity": "sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==" }, "node_modules/@cspell/dict-ruby": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-2.0.2.tgz", - "integrity": "sha512-vVnUpSmGDbPjs7MHq741DsLHhQcoA4CnUCM9wsTorQ9AQRDAkDTbK/LcY8nM19MoXCb3eF8PFku5Jq+gqH0u7w==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.0.tgz", + "integrity": "sha512-ssb96QxLZ76yPqFrikWxItnCbUKhYXJ2owkoIYzUGNFl2CHSoHCb5a6Zetum9mQ/oUA3gNeUhd28ZUlXs0la2A==" }, "node_modules/@cspell/dict-rust": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-2.0.1.tgz", - "integrity": "sha512-ATDpIh0VWpQdUIZa8zqqJY4wQz3q00BTXlQCodeOmObYSb23+L6KWWzJ8mKLgpbc1lqTkogWrqxiCxlrCmqNmg==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.1.tgz", + "integrity": "sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==" }, "node_modules/@cspell/dict-scala": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-2.0.0.tgz", - "integrity": "sha512-MUwA2YKpqaQOSR4V1/CVGRNk8Ii5kf6I8Ch+4/BhRZRQXuwWbi21rDRYWPqdQWps7VNzAbbMA+PQDWsD5YY38g==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.0.tgz", + "integrity": "sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==" }, "node_modules/@cspell/dict-software-terms": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-2.3.0.tgz", - "integrity": "sha512-rl+quUw68IxjWgeX/QDMgQsImZ1DaKzFyYMSGrCNcNPp4b4SMLwHCKoJ97/uOnUnw0jaBxueXoqp2iyN/QiOVw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.0.tgz", + "integrity": "sha512-RI6sv4Bc4i42YH/ofVelv8lXpJRhCyS9IhI2BtejUoMXKhKA9gC01ATXOylx+oaQmj3t5ark4R50xKFRvC7ENA==" }, "node_modules/@cspell/dict-sql": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-1.0.4.tgz", - "integrity": "sha512-+9nMcwsCzdYH0tyv2LeuVvQ+DdecS2C1N+hw6sl0FTHWI5GwULHAGW840RBwcKw0s+dl7sc0WpZhS1EW7b0pXg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.0.tgz", + "integrity": "sha512-Bb+TNWUrTNNABO0bmfcYXiTlSt0RD6sB2MIY+rNlaMyIwug43jUjeYmkLz2tPkn3+2uvySeFEOMVYhMVfcuDKg==" + }, + "node_modules/@cspell/dict-svelte": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz", + "integrity": "sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==" }, "node_modules/@cspell/dict-swift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-1.0.3.tgz", - "integrity": "sha512-yOBLSaRD0AnkkkndJ8PuB82Evp6lA2xItf2AWsnPfCCgxp5Ojk6uUBC/WQBSkzkCAOGbXyHsu9D97tsOx2c6cw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.1.tgz", + "integrity": "sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==" }, "node_modules/@cspell/dict-typescript": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-2.0.2.tgz", - "integrity": "sha512-OIoSJsCw9WHX4eDikoF5/0QbptMPZjElOcMYdYCyV03nqV5n4ot72ysTexW95yW4+fQU6uDPNQvnrUnhXXEkTA==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz", + "integrity": "sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A==" }, "node_modules/@cspell/dict-vue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-2.0.2.tgz", - "integrity": "sha512-/MB0RS0Gn01s4pgmjy0FvsLfr3RRMrRphEuvTRserNcM8XVtoIVAtrjig/Gg0DPwDrN8Clm0L1j7iQay6S8D0g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.0.tgz", + "integrity": "sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==" }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "node_modules/@cspell/dynamic-import": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.1.tgz", + "integrity": "sha512-uliIUv9uZlnyYmjUlcw/Dm3p0xJOEnWJNczHAfqAl4Ytg6QZktw0GtUA9b1umbRXLv0KRTPtSC6nMq3cR7rRmQ==", + "dependencies": { + "import-meta-resolve": "^2.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@cspell/strong-weak-map": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.1.tgz", + "integrity": "sha512-z8AuWvUuSnugFKJOA9Ke0aiFuehcqLFqia9bk8XaQNEWr44ahPVn3sEWnAncTxPbpWuUw5UajoJa0egRAE1CCg==", + "engines": { + "node": ">=14.6" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } }, "node_modules/ansi-regex": { "version": "5.0.1", @@ -415,6 +493,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/array-timsort": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", @@ -426,11 +509,12 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -499,11 +583,11 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "engines": { - "node": "^12.20.0 || >=14" + "node": ">=14" } }, "node_modules/comment-json": { @@ -548,18 +632,17 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", "dependencies": { - "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/crypto-random-string": { @@ -571,28 +654,31 @@ } }, "node_modules/cspell": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.12.0.tgz", - "integrity": "sha512-ny4xVEPYFP2jVf5w71Mnk4HKj6RbPH+CMSzUrOMbYVVNnQUj3GLfzy5DrSFLG0zGa353ZRC4/s9MsEvnAL8mkA==", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.31.2.tgz", + "integrity": "sha512-HJcQ8jqL/1N3Mj5dufFnIZCX3ACuRoFTSVY6h3Bo5wBqd2iiJTyeQ1SY9Zymlxtb2KyJ6jQRiFmkWeFx2HVs7w==", "dependencies": { - "@cspell/cspell-pipe": "^6.12.0", + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "@cspell/dynamic-import": "6.31.1", "chalk": "^4.1.2", - "commander": "^9.4.0", - "cspell-gitignore": "^6.12.0", - "cspell-glob": "^6.12.0", - "cspell-lib": "^6.12.0", + "commander": "^10.0.0", + "cspell-gitignore": "6.31.2", + "cspell-glob": "6.31.2", + "cspell-io": "6.31.2", + "cspell-lib": "6.31.2", + "fast-glob": "^3.2.12", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^6.0.1", - "fs-extra": "^10.1.0", "get-stdin": "^8.0.0", - "glob": "^8.0.3", "imurmurhash": "^0.1.4", - "semver": "^7.3.7", + "semver": "^7.3.8", "strip-ansi": "^6.0.1", - "vscode-uri": "^3.0.6" + "vscode-uri": "^3.0.7" }, "bin": { - "cspell": "bin.js" + "cspell": "bin.js", + "cspell-esm": "bin.mjs" }, "engines": { "node": ">=14" @@ -602,39 +688,39 @@ } }, "node_modules/cspell-dictionary": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.12.0.tgz", - "integrity": "sha512-I2cXSdXndt9H7yXmJzLTjgui/SAPGghXwxFeibTbvF68gyQYD5fUXvOygEIPrOEySKlAIb+aouV77SgoURxMHw==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.1.tgz", + "integrity": "sha512-7+K7aQGarqbpucky26wled7QSCJeg6VkLUWS+hLjyf0Cqc9Zew5xsLa4QjReExWUJx+a97jbiflITZNuWxgMrg==", "dependencies": { - "@cspell/cspell-pipe": "^6.12.0", - "@cspell/cspell-types": "^6.12.0", - "cspell-trie-lib": "^6.12.0", + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "cspell-trie-lib": "6.31.1", "fast-equals": "^4.0.3", - "gensequence": "^4.0.2" + "gensequence": "^5.0.2" }, "engines": { "node": ">=14" } }, "node_modules/cspell-gitignore": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.12.0.tgz", - "integrity": "sha512-gtsN2AAvqdE8CHVzpxsQcd/Wn5GAMTjzHpDXX71g/k8IJn743poGU06O0O1WSVAgK0fWTRsfg+V5OegA1TAo7A==", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.2.tgz", + "integrity": "sha512-B1i8aiXCIbb/08u0K3xnDyXtg0qD+lb5B2itOOXi7KXlPkKvIuN4hWyXxhVDweWyYWEzyXD5wBpPrqICVrStHQ==", "dependencies": { - "cspell-glob": "^6.12.0", + "cspell-glob": "6.31.2", "find-up": "^5.0.0" }, "bin": { - "cspell-gitignore": "bin.js" + "cspell-gitignore": "bin.mjs" }, "engines": { "node": ">=14" } }, "node_modules/cspell-glob": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.12.0.tgz", - "integrity": "sha512-Q0rMGTxDyFFPm1LmHYM0ziuxQt2aXgr8Oi1glA2s0dBs0hg1DexlAEoLwLiMDUwSTvibEKIidPzlrmZ1AUDWEg==", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.2.tgz", + "integrity": "sha512-ceTjHM4HaBgvG5S3oiB+PTPYq58EQYG6MmYpycDHzpR5I2H1NurK9lxWHfANmLbi0DsHn58tIZNDMUnnQj19Jw==", "dependencies": { "micromatch": "^4.0.5" }, @@ -643,72 +729,71 @@ } }, "node_modules/cspell-grammar": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.12.0.tgz", - "integrity": "sha512-WXcDiWJ2pTW0jHY0Bf0DW5s8A9S0a+2tsVZsNxE/0CR5P/8yDSnznE+59uok/JN+GXOKQ6VIaqAZA3/XjDZuuA==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.1.tgz", + "integrity": "sha512-AsRVP0idcNFVSb9+p9XjMumFj3BUV67WIPWApaAzJl/dYyiIygQObRE+si0/QtFWGNw873b7hNhWZiKjqIdoaQ==", "dependencies": { - "@cspell/cspell-pipe": "^6.12.0", - "@cspell/cspell-types": "^6.12.0" + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1" }, "bin": { - "cspell-grammar": "bin.js" + "cspell-grammar": "bin.mjs" }, "engines": { "node": ">=14" } }, "node_modules/cspell-io": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.12.0.tgz", - "integrity": "sha512-1faxDj2OMgq61w7GaiXZD7ytks6PksJlG484LMl2USv58jDky4i2lujJs1C/+aP97Box9EcdwzydHX9GpnqqCw==", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.2.tgz", + "integrity": "sha512-Lp7LsF/f35LaOneROb/9mWiprShz2ONxjYFAt3bYP7gIxq41lWi8QhO+SN6spoqPp/wQXjSqJ7MuTZsemxPRnA==", "dependencies": { - "@cspell/cspell-service-bus": "^6.12.0", - "node-fetch": "^2.6.7" + "@cspell/cspell-service-bus": "6.31.1", + "node-fetch": "^2.6.9" }, "engines": { "node": ">=14" } }, "node_modules/cspell-lib": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.12.0.tgz", - "integrity": "sha512-IKd2MzH/zoiXohc26Lqb1b8i+41Y2xGreyAe9ihv/7Z2dscGGVy7F/2taZvZK9kJIhaz33Yatxfx3htT6w0hqg==", - "dependencies": { - "@cspell/cspell-bundled-dicts": "^6.12.0", - "@cspell/cspell-pipe": "^6.12.0", - "@cspell/cspell-types": "^6.12.0", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.2.tgz", + "integrity": "sha512-LqaB2ZfVfQHKL5aZzYoKU6/UxxAtWeXAYwpC9l+satXmajYyXtAh4kWmuW+y7kKRH2jA79rJQS3QE6ToeSqgQQ==", + "dependencies": { + "@cspell/cspell-bundled-dicts": "6.31.2", + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "@cspell/strong-weak-map": "6.31.1", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^5.0.1", - "cosmiconfig": "^7.0.1", - "cspell-dictionary": "^6.12.0", - "cspell-glob": "^6.12.0", - "cspell-grammar": "^6.12.0", - "cspell-io": "^6.12.0", - "cspell-trie-lib": "^6.12.0", + "cosmiconfig": "8.0.0", + "cspell-dictionary": "6.31.1", + "cspell-glob": "6.31.2", + "cspell-grammar": "6.31.1", + "cspell-io": "6.31.2", + "cspell-trie-lib": "6.31.1", "fast-equals": "^4.0.3", "find-up": "^5.0.0", - "fs-extra": "^10.1.0", - "gensequence": "^4.0.2", + "gensequence": "^5.0.2", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0", - "vscode-languageserver-textdocument": "^1.0.7", - "vscode-uri": "^3.0.6" + "vscode-languageserver-textdocument": "^1.0.8", + "vscode-uri": "^3.0.7" }, "engines": { - "node": ">=14" + "node": ">=14.6" } }, "node_modules/cspell-trie-lib": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.12.0.tgz", - "integrity": "sha512-SJOdb51Wy3ewaKfttZwc9NYOIXaKlhyr+ykYKBExj3qMfV1J4d4iDLE95FriaRcqnq6X/qEM9jUvZHlvadDk3A==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.1.tgz", + "integrity": "sha512-MtYh7s4Sbr1rKT31P2BK6KY+YfOy3dWsuusq9HnqCXmq6aZ1HyFgjH/9p9uvqGi/TboMqn1KOV8nifhXK3l3jg==", "dependencies": { - "@cspell/cspell-pipe": "^6.12.0", - "@cspell/cspell-types": "^6.12.0", - "fs-extra": "^10.1.0", - "gensequence": "^4.0.2" + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "gensequence": "^5.0.2" }, "engines": { "node": ">=14" @@ -758,11 +843,34 @@ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==" }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -817,28 +925,15 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/gensequence": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-4.0.2.tgz", - "integrity": "sha512-mQiFskYFPFDSUpBJ/n3ebAV2Ufu6DZGvUPXzyWYzFfJr6/DyOOZVnjx6VTWE4y0RLvYWnc5tZq5sCjzEWhRjqQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", + "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==", "engines": { "node": ">=14" } @@ -855,23 +950,35 @@ } }, "node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=12" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -884,9 +991,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/has-flag": { "version": "4.0.0", @@ -938,6 +1045,15 @@ "node": ">=4" } }, + "node_modules/import-meta-resolve": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", + "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -970,6 +1086,25 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -996,22 +1131,22 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -1057,13 +1192,21 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -1077,20 +1220,20 @@ } }, "node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" + "node": "*" } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -1205,6 +1348,25 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -1232,6 +1394,15 @@ "node": ">=8" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -1246,49 +1417,32 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "queue-microtask": "^1.2.2" } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -1361,23 +1515,15 @@ "node": ">=8" } }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" }, "node_modules/vscode-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz", - "integrity": "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, "node_modules/webidl-conversions": { "version": "3.0.1", @@ -1422,14 +1568,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -1444,24 +1582,24 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" } }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "requires": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -1513,138 +1651,152 @@ } }, "@cspell/cspell-bundled-dicts": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.12.0.tgz", - "integrity": "sha512-myfsDwSJcAMjKbztKBG424wIp/YV9/lvxsgHFKxBGPi+nNx1p7TbOjAAO9EWk0mZVHyGKZwCFJS2ohkoqxJWoQ==", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.2.tgz", + "integrity": "sha512-rQ5y/U1Ah5AaduIh3NU2z371hRrOr1cmNdhhP8oiuz2E4VqmcoVHflXIct9DgY8uIJpwsSCdR6ypOQWZYXYnwA==", "requires": { - "@cspell/dict-ada": "^2.0.1", - "@cspell/dict-aws": "^2.0.0", - "@cspell/dict-bash": "^2.0.4", - "@cspell/dict-companies": "^2.0.14", - "@cspell/dict-cpp": "^3.2.1", - "@cspell/dict-cryptocurrencies": "^2.0.0", - "@cspell/dict-csharp": "^3.0.1", - "@cspell/dict-css": "^2.1.0", - "@cspell/dict-dart": "^1.1.1", - "@cspell/dict-django": "^2.0.0", - "@cspell/dict-docker": "^1.1.1", - "@cspell/dict-dotnet": "^2.0.1", - "@cspell/dict-elixir": "^2.0.1", - "@cspell/dict-en_us": "^2.3.3", - "@cspell/dict-en-gb": "^1.1.33", - "@cspell/dict-filetypes": "^2.1.1", - "@cspell/dict-fonts": "^2.1.0", - "@cspell/dict-fullstack": "^2.0.6", - "@cspell/dict-git": "^1.0.1", - "@cspell/dict-golang": "^3.0.1", - "@cspell/dict-haskell": "^2.0.1", - "@cspell/dict-html": "^3.3.2", - "@cspell/dict-html-symbol-entities": "^3.0.0", - "@cspell/dict-java": "^3.0.7", - "@cspell/dict-latex": "^2.0.9", - "@cspell/dict-lorem-ipsum": "^2.0.1", - "@cspell/dict-lua": "^2.0.0", - "@cspell/dict-node": "^3.0.1", - "@cspell/dict-npm": "^3.1.2", - "@cspell/dict-php": "^2.0.0", - "@cspell/dict-powershell": "^2.0.0", - "@cspell/dict-public-licenses": "^1.0.6", - "@cspell/dict-python": "^3.0.6", - "@cspell/dict-r": "^1.0.3", - "@cspell/dict-ruby": "^2.0.2", - "@cspell/dict-rust": "^2.0.1", - "@cspell/dict-scala": "^2.0.0", - "@cspell/dict-software-terms": "^2.2.11", - "@cspell/dict-sql": "^1.0.4", - "@cspell/dict-swift": "^1.0.3", - "@cspell/dict-typescript": "^2.0.2", - "@cspell/dict-vue": "^2.0.2" + "@cspell/dict-ada": "^4.0.1", + "@cspell/dict-aws": "^3.0.0", + "@cspell/dict-bash": "^4.1.1", + "@cspell/dict-companies": "^3.0.9", + "@cspell/dict-cpp": "^5.0.2", + "@cspell/dict-cryptocurrencies": "^3.0.1", + "@cspell/dict-csharp": "^4.0.2", + "@cspell/dict-css": "^4.0.5", + "@cspell/dict-dart": "^2.0.2", + "@cspell/dict-django": "^4.0.2", + "@cspell/dict-docker": "^1.1.6", + "@cspell/dict-dotnet": "^5.0.0", + "@cspell/dict-elixir": "^4.0.2", + "@cspell/dict-en_us": "^4.3.2", + "@cspell/dict-en-common-misspellings": "^1.0.2", + "@cspell/dict-en-gb": "1.1.33", + "@cspell/dict-filetypes": "^3.0.0", + "@cspell/dict-fonts": "^3.0.2", + "@cspell/dict-fullstack": "^3.1.5", + "@cspell/dict-gaming-terms": "^1.0.4", + "@cspell/dict-git": "^2.0.0", + "@cspell/dict-golang": "^6.0.1", + "@cspell/dict-haskell": "^4.0.1", + "@cspell/dict-html": "^4.0.3", + "@cspell/dict-html-symbol-entities": "^4.0.0", + "@cspell/dict-java": "^5.0.5", + "@cspell/dict-k8s": "^1.0.1", + "@cspell/dict-latex": "^4.0.0", + "@cspell/dict-lorem-ipsum": "^3.0.0", + "@cspell/dict-lua": "^4.0.1", + "@cspell/dict-node": "^4.0.2", + "@cspell/dict-npm": "^5.0.5", + "@cspell/dict-php": "^4.0.1", + "@cspell/dict-powershell": "^5.0.1", + "@cspell/dict-public-licenses": "^2.0.2", + "@cspell/dict-python": "^4.0.2", + "@cspell/dict-r": "^2.0.1", + "@cspell/dict-ruby": "^5.0.0", + "@cspell/dict-rust": "^4.0.1", + "@cspell/dict-scala": "^5.0.0", + "@cspell/dict-software-terms": "^3.1.6", + "@cspell/dict-sql": "^2.1.0", + "@cspell/dict-svelte": "^1.0.2", + "@cspell/dict-swift": "^2.0.1", + "@cspell/dict-typescript": "^3.1.1", + "@cspell/dict-vue": "^3.0.0" } }, "@cspell/cspell-pipe": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.12.0.tgz", - "integrity": "sha512-Nkm+tIJ5k+jZPovZCdmZhrWrwRFwnDq+7yCxhov0C7UX3hsSNtTJIpFuaCNEQJ+Whpvxdh1YKflvHiHYygEgTg==" + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.1.tgz", + "integrity": "sha512-zk1olZi4dr6GLm5PAjvsiZ01HURNSruUYFl1qSicGnTwYN8GaN4RhAwannAytcJ7zJPIcyXlid0YsB58nJf3wQ==" }, "@cspell/cspell-service-bus": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.12.0.tgz", - "integrity": "sha512-GgvciSeMUekl8z8vP8//cs5/qRQJSLz9IVREf6fxQW4upjw6zXZ1KonwPqOF5uLocIMAr8eCdrJzHKuKvigJIA==" + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.1.tgz", + "integrity": "sha512-YyBicmJyZ1uwKVxujXw7sgs9x+Eps43OkWmCtDZmZlnq489HdTSuhF1kTbVi2yeFSeaXIS87+uHo12z97KkQpg==" }, "@cspell/cspell-types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.12.0.tgz", - "integrity": "sha512-BcZTt05fNy9SGXfbPgUyxS4FfIaUpcVq8IOJ0noN+jsKsmlbssOUgJOB2ApN1h66FfWcKuFy/uNrjfcrQ7PTqg==" + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.1.tgz", + "integrity": "sha512-1KeTQFiHMssW1eRoF2NZIEg4gPVIfXLsL2+VSD/AV6YN7lBcuf6gRRgV5KWYarhxtEfjxhDdDTmu26l/iJEUtw==" }, "@cspell/dict-ada": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-2.0.1.tgz", - "integrity": "sha512-vopTJ1oHrrFYV5GU55Sr+AzItR78Uj5YbCaspYABmYKlq4NRrcUAUsr4bWgymDcspMIHO7e7IFcj48OKs1fndA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.1.tgz", + "integrity": "sha512-/E9o3nHrXOhYmQE43deKbxZcR3MIJAsa+66IzP9TXGHheKEx8b9dVMVVqydDDH8oom1H0U20NRPtu6KRVbT9xw==" }, "@cspell/dict-aws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-2.0.0.tgz", - "integrity": "sha512-NKz7pDZ7pwj/b33i3f4WLpC1rOOUMmENwYgftxU+giU2YBeKM2wZbMTSEIzsrel56r0UlQYmdIVlP/B4nnVaoQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz", + "integrity": "sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==" }, "@cspell/dict-bash": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-2.0.4.tgz", - "integrity": "sha512-uK/ehmp5LYrmRH2Gv3nbvdPswpkybJUn34WYKLpeuYHQktmi+pOI1A9uPdBPnSbMDffSvwQlQohIyKawz+X8Ag==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.1.tgz", + "integrity": "sha512-8czAa/Mh96wu2xr0RXQEGMTBUGkTvYn/Pb0o+gqOO1YW+poXGQc3gx0YPqILDryP/KCERrNvkWUJz3iGbvwC2A==" }, "@cspell/dict-companies": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-2.0.14.tgz", - "integrity": "sha512-Sq1X29Z05OZ/UNqTwVhf3/WaqvJQy4/S6gS8qYI5AQRX45gVe8CPhNBLmZOTC6z8m716bfQCxa5rRT9YNSdTZg==" + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.17.tgz", + "integrity": "sha512-vo1jbozgZWSzz2evIL26kLd35tVb+5kW/UTvTzAwaWutSWRloRyKx38nj2CaLJ2IFxBdiATteCFGTzKCvJJl6A==" }, "@cspell/dict-cpp": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-3.2.1.tgz", - "integrity": "sha512-XcmzrKIghqFfrYLLaHtWKOp9rupiuGdc5ODONk+emsq0W5CIc3Abn27IQHwUzxzF+Cm5IfKAIJ5Kpe6hkzm0HQ==" + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.3.tgz", + "integrity": "sha512-7sx/RFsf0hB3q8chx8OHYl9Kd+g0pqA1laphwaAQ+/jPwoAreYT3kNQWbJ3bIt/rMoORetFSQxckSbaJXwwqpw==" }, "@cspell/dict-cryptocurrencies": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-2.0.0.tgz", - "integrity": "sha512-nREysmmfOp7L2YCRAUufQahwD5/Punzb5AZ6eyg4zUamdRWHgBFphb5/9h2flt1vgdUfhc6hZcML21Ci7iXjaA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz", + "integrity": "sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==" }, "@cspell/dict-csharp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-3.0.1.tgz", - "integrity": "sha512-xkfQu03F388w4sdVQSSjrVMkxAxpTYB2yW7nw0XYtTjl3L/jBgvTr/j1BTjdFbQhdNf10Lg0Ak1kXOjmHodVqA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz", + "integrity": "sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==" }, "@cspell/dict-css": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-2.1.0.tgz", - "integrity": "sha512-glASAELcGhh4Ru0rTQ4G9mTQxSyPwsZOON/5BYflB6Kks8YC8nUvKrtMCoo5W7CPKPfSEa8zUNctFQ1+IUYDHA==" + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", + "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==" }, "@cspell/dict-dart": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-1.1.1.tgz", - "integrity": "sha512-XBOCpezXrgFN18kGEwqMpTUGZdw4BjCoJrNOo6qBdcdZySCrEHLwELraLOkcSba2kM4stmTp0t59FkwtP8TKOA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.2.tgz", + "integrity": "sha512-jigcODm7Z4IFZ4vParwwP3IT0fIgRq/9VoxkXfrxBMsLBGGM2QltHBj7pl+joX+c4cOHxfyZktGJK1B1wFtR4Q==" + }, + "@cspell/dict-data-science": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.7.tgz", + "integrity": "sha512-Q9VUFaarUpqM6CAmR8peP4o9alk0XQ4rgVoE2R2XalpC2cqPI8Hmg6QwMU2UPioSUcWMJCqLc/KzJti0gBMuxA==" }, "@cspell/dict-django": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-2.0.0.tgz", - "integrity": "sha512-GkJdJv6cmzrKcmq2/oxTXjKF5uv71r4eTqnFmgPbNBW1t+G4VYpzOf0QrVQrhx2RC4DdW5XfcTf+iS0FxHOTmw==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.0.tgz", + "integrity": "sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==" }, "@cspell/dict-docker": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.1.tgz", - "integrity": "sha512-UEYoeRDm7oUN9yz1mYSozz6D4+2N14S/cd2Re9et6Xzq6yi62s4ky3knF92Of2weelADjnN41UA22VBhRAf7Sw==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.6.tgz", + "integrity": "sha512-zCCiRTZ6EOQpBnSOm0/3rnKW1kCcAUDUA7SxJG3SuH6iZvKi3I8FEg8+O83WQUeXg0SyPNerD9F40JLnnJjJig==" }, "@cspell/dict-dotnet": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-2.0.1.tgz", - "integrity": "sha512-b1n4crJRW0WZVf9Gp/52j/tDtjYiZ3N81fIyfqPlBrjsh/5AivfA697DYwQ2mr8ngNX7RsqRtYNQjealA1rEnQ==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.0.tgz", + "integrity": "sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==" }, "@cspell/dict-elixir": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-2.0.1.tgz", - "integrity": "sha512-eTTTxZt1FqGkM780yFDxsGHvTbWqvlK8YISSccK8FyrB6ULW+uflQlNS5AnWg3uWKC48b7pQott+odYCsPJ+Ow==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz", + "integrity": "sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==" }, "@cspell/dict-en_us": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-2.3.3.tgz", - "integrity": "sha512-csyKeaNktfpvMkmE2GOPTwsrQm3wWhLKVaDRaGU0qTcIjDiCvqv/iYgrVrKRkoddA3kdNTZ8YNCcix7lb6VkOg==" + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.4.tgz", + "integrity": "sha512-mR2yqWmFip1zTKja2SqyVMbzuqEThqkEJk9M32bMDziPJpEyOIPvLA0UPmj3cyRKJkRuVF0bhDCE33O+at38hw==" + }, + "@cspell/dict-en-common-misspellings": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-1.0.2.tgz", + "integrity": "sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==" }, "@cspell/dict-en-gb": { "version": "1.1.33", @@ -1652,144 +1804,193 @@ "integrity": "sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==" }, "@cspell/dict-filetypes": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-2.1.1.tgz", - "integrity": "sha512-Oo0/mUbFHzsaATqRLdkV1RMoYns3aGzeKFIpVJg415GYtJ8EABXtEArYTXeMwlboyGTPvEk+PR2hBSTSfQTqmg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.1.tgz", + "integrity": "sha512-8z8mY1IbrTyTRumx2vvD9yzRhNMk9SajM/GtI5hdMM2pPpNSp25bnuauzjRf300eqlqPY2MNb5MmhBFO014DJw==" }, "@cspell/dict-fonts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-2.1.0.tgz", - "integrity": "sha512-hk7xsbfWEUhc136Xj7I2TD7ouKAfWwzCVAQaHBxcVXAsVxu7bDOGj4FvE2jBzlkSUY8A9Ww8qS0GOFvowJshVg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.2.tgz", + "integrity": "sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==" }, "@cspell/dict-fullstack": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-2.0.6.tgz", - "integrity": "sha512-R2E2xvbHvvRwwurxfpBJDRIJjXBMfEPF5WNV3LTOEMRqkZtoYCeJK9aqc8LHlmJMtAbnN1cx//BCDIyTJ0rO0A==" + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.1.5.tgz", + "integrity": "sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==" + }, + "@cspell/dict-gaming-terms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.4.tgz", + "integrity": "sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==" }, "@cspell/dict-git": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-1.0.1.tgz", - "integrity": "sha512-Rk+eTof/9inF11lvxmkCRK+gODatA3qai8kSASv6OG/JfPvpj7fTHErx/rdgPw/LOTDUafnoTjTYmj7B2MOQXg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-2.0.0.tgz", + "integrity": "sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==" }, "@cspell/dict-golang": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-3.0.1.tgz", - "integrity": "sha512-0KNfXTbxHW2l8iVjxeOf+KFv9Qrw3z5cyKnkuYJWlBTSB5KcUBfeKCb4fsds26VdANqiy6U91b4gDx5kNEmBjQ==" + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.2.tgz", + "integrity": "sha512-5pyZn4AAiYukAW+gVMIMVmUSkIERFrDX2vtPDjg8PLQUhAHWiVeQSDjuOhq9/C5GCCEZU/zWSONkGiwLBBvV9A==" }, "@cspell/dict-haskell": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-2.0.1.tgz", - "integrity": "sha512-ooA23qIG7InOOxlLm67CNH5O2J85QsPHEAzEU9KEqVfYG5ovFs5tx6n9pHekDVk3MpQULpqfNUYDR0KigPLg5g==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz", + "integrity": "sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==" }, "@cspell/dict-html": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-3.3.2.tgz", - "integrity": "sha512-cM5pQSEiqjrdk6cRFLrlLdWNT/J8399f/A6DjwjfYhHrGy0e/Rsjv76HZT0GlE1OqMoq9eG9jdQsfoYYgWTIpQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz", + "integrity": "sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w==" }, "@cspell/dict-html-symbol-entities": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-3.0.0.tgz", - "integrity": "sha512-04K7cPTcbYXmHICfiob4gZA1yaj4hpfM+Nl5WIJ1EAZsSGHdqmGEF28GuCjyQ8ZeKiJAsPt/vXuLBbjxkHqZyQ==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz", + "integrity": "sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==" }, "@cspell/dict-java": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-3.0.7.tgz", - "integrity": "sha512-IL7ubsRvKX6dZSx++TplJCfhiS7kkEGpbTPG0gMEP50DTNAVM4icZS8zmer2UBCU5PTwF85abJjdX7mRADWKVg==" + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz", + "integrity": "sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg==" + }, + "@cspell/dict-k8s": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz", + "integrity": "sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw==" }, "@cspell/dict-latex": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-2.0.9.tgz", - "integrity": "sha512-d1kTK6dJb5z6UcfASQWjqQlsjZvnoVOvMWxYtLpGksYf6gM4IgqoPVNMLYYK6xBS4T/uAnLIj975A6YuAeyZpg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.0.tgz", + "integrity": "sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==" }, "@cspell/dict-lorem-ipsum": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-2.0.1.tgz", - "integrity": "sha512-s7Ft8UiloUJwgz4z8uLeFvCkeTcZ43HQl7mSAlZd76eW+keLSsdeGmLDx2zaciqo+MftPGyzygVCwaJjTGxiew==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz", + "integrity": "sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==" }, "@cspell/dict-lua": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-2.0.0.tgz", - "integrity": "sha512-7WUEBEspSKtsq104WdIys1+DLqAxpJPzw74Py1TuE3fI5GvlzeSZkRFP2ya54GB2lCO4C3mq4M8EnitpibVDfw==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.1.tgz", + "integrity": "sha512-j0MFmeCouSoC6EdZTbvGe1sJ9V+ruwKSeF+zRkNNNload7R72Co5kX1haW2xLHGdlq0kqSy1ODRZKdVl0e+7hg==" }, "@cspell/dict-node": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-3.0.1.tgz", - "integrity": "sha512-sK2cpuV0EAc43Amd5xeQXkI9MeRTECMw+yjap06gKSModbgI7BqJUHeKZed+0Hii+LpaJ4TYpLGiRVsO+qSk0w==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", + "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==" }, "@cspell/dict-npm": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-3.1.3.tgz", - "integrity": "sha512-xnGp+TMpArdMLBUSG+ZrbEuhvY016rb76Yh35/OPDDEEz4ulENxLSZJxtN2/A0tZ9FJngDNSdFh7eJsOFmciZQ==" + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.7.tgz", + "integrity": "sha512-6SegF0HsVaBTl6PlHjeErG8Av+tRYkUG1yaXUQIGWXU0A8oxhI0o4PuL65UWH5lkCKhJyGai69Cd0iytL0oVFg==" }, "@cspell/dict-php": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-2.0.0.tgz", - "integrity": "sha512-29WgU77eTO985LvMHwPi1pcpfopfCWfTdffDyqya0JIfOSaFUrlYKzGPkE4mRxcz2G3hXsaM0SRvBNdIRwEdUg==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz", + "integrity": "sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ==" }, "@cspell/dict-powershell": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-2.0.0.tgz", - "integrity": "sha512-6uvEhLiGmG3u9TFkM1TYcky6aL9Yk7Sk3KJwoTYBaQJY2KqrprgyQtW6yxIw9oU52VRHlq3KKvSAA9Q26+SIkQ==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.2.tgz", + "integrity": "sha512-IHfWLme3FXE7vnOmMncSBxOsMTdNWd1Vcyhag03WS8oANSgX8IZ+4lMI00mF0ptlgchf16/OU8WsV4pZfikEFw==" }, "@cspell/dict-public-licenses": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-1.0.6.tgz", - "integrity": "sha512-Z9IUFPkkOpOsEdgPUfQOJNQ+qU6+iBAZWS/CR5sUqTX+s5VkPNVwQyVC2kdmgmE2U5qwzAPewG6nVKr2MVogwg==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.2.tgz", + "integrity": "sha512-baKkbs/WGEV2lCWZoL0KBPh3uiPcul5GSDwmXEBAsR5McEW52LF94/b7xWM0EmSAc/y8ODc5LnPYC7RDRLi6LQ==" }, "@cspell/dict-python": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-3.0.6.tgz", - "integrity": "sha512-tzxJ4sd9ZGhAUKg/WJJpQGDNtoHvM8Wn+iS2+PnQj2/LTHBW4mnaCogsGsBtYu8C4b2+BEQs+tc5808AeEfLug==" + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.2.tgz", + "integrity": "sha512-Whcn4K8R0Ux/hcx/P9Fbx6i29GwTaXgT3LTt95AuCnV5RRLrzsqoyZkz851hcg5z4kjUQVMduDl3HECGgW/FNw==", + "requires": { + "@cspell/dict-data-science": "^1.0.0" + } }, "@cspell/dict-r": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-1.0.3.tgz", - "integrity": "sha512-u2qeXd4cx/TvTVcmkvA+sK6f4K1uMAMO6QPMSr1pSvqGElPRP1mIBXmuiSuBzLO3LbsJuUEHw5Cp3/bxIB6rNA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.0.1.tgz", + "integrity": "sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==" }, "@cspell/dict-ruby": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-2.0.2.tgz", - "integrity": "sha512-vVnUpSmGDbPjs7MHq741DsLHhQcoA4CnUCM9wsTorQ9AQRDAkDTbK/LcY8nM19MoXCb3eF8PFku5Jq+gqH0u7w==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.0.tgz", + "integrity": "sha512-ssb96QxLZ76yPqFrikWxItnCbUKhYXJ2owkoIYzUGNFl2CHSoHCb5a6Zetum9mQ/oUA3gNeUhd28ZUlXs0la2A==" }, "@cspell/dict-rust": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-2.0.1.tgz", - "integrity": "sha512-ATDpIh0VWpQdUIZa8zqqJY4wQz3q00BTXlQCodeOmObYSb23+L6KWWzJ8mKLgpbc1lqTkogWrqxiCxlrCmqNmg==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.1.tgz", + "integrity": "sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==" }, "@cspell/dict-scala": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-2.0.0.tgz", - "integrity": "sha512-MUwA2YKpqaQOSR4V1/CVGRNk8Ii5kf6I8Ch+4/BhRZRQXuwWbi21rDRYWPqdQWps7VNzAbbMA+PQDWsD5YY38g==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.0.tgz", + "integrity": "sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==" }, "@cspell/dict-software-terms": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-2.3.0.tgz", - "integrity": "sha512-rl+quUw68IxjWgeX/QDMgQsImZ1DaKzFyYMSGrCNcNPp4b4SMLwHCKoJ97/uOnUnw0jaBxueXoqp2iyN/QiOVw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.0.tgz", + "integrity": "sha512-RI6sv4Bc4i42YH/ofVelv8lXpJRhCyS9IhI2BtejUoMXKhKA9gC01ATXOylx+oaQmj3t5ark4R50xKFRvC7ENA==" }, "@cspell/dict-sql": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-1.0.4.tgz", - "integrity": "sha512-+9nMcwsCzdYH0tyv2LeuVvQ+DdecS2C1N+hw6sl0FTHWI5GwULHAGW840RBwcKw0s+dl7sc0WpZhS1EW7b0pXg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.0.tgz", + "integrity": "sha512-Bb+TNWUrTNNABO0bmfcYXiTlSt0RD6sB2MIY+rNlaMyIwug43jUjeYmkLz2tPkn3+2uvySeFEOMVYhMVfcuDKg==" + }, + "@cspell/dict-svelte": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz", + "integrity": "sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==" }, "@cspell/dict-swift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-1.0.3.tgz", - "integrity": "sha512-yOBLSaRD0AnkkkndJ8PuB82Evp6lA2xItf2AWsnPfCCgxp5Ojk6uUBC/WQBSkzkCAOGbXyHsu9D97tsOx2c6cw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.1.tgz", + "integrity": "sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==" }, "@cspell/dict-typescript": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-2.0.2.tgz", - "integrity": "sha512-OIoSJsCw9WHX4eDikoF5/0QbptMPZjElOcMYdYCyV03nqV5n4ot72ysTexW95yW4+fQU6uDPNQvnrUnhXXEkTA==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz", + "integrity": "sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A==" }, "@cspell/dict-vue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-2.0.2.tgz", - "integrity": "sha512-/MB0RS0Gn01s4pgmjy0FvsLfr3RRMrRphEuvTRserNcM8XVtoIVAtrjig/Gg0DPwDrN8Clm0L1j7iQay6S8D0g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.0.tgz", + "integrity": "sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==" }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "@cspell/dynamic-import": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.1.tgz", + "integrity": "sha512-uliIUv9uZlnyYmjUlcw/Dm3p0xJOEnWJNczHAfqAl4Ytg6QZktw0GtUA9b1umbRXLv0KRTPtSC6nMq3cR7rRmQ==", + "requires": { + "import-meta-resolve": "^2.2.2" + } + }, + "@cspell/strong-weak-map": { + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.1.tgz", + "integrity": "sha512-z8AuWvUuSnugFKJOA9Ke0aiFuehcqLFqia9bk8XaQNEWr44ahPVn3sEWnAncTxPbpWuUw5UajoJa0egRAE1CCg==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } }, "ansi-regex": { "version": "5.0.1", @@ -1804,6 +2005,11 @@ "color-convert": "^2.0.1" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "array-timsort": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", @@ -1815,11 +2021,12 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "braces": { @@ -1867,9 +2074,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" }, "comment-json": { "version": "4.2.3", @@ -1907,15 +2114,14 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", "requires": { - "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "path-type": "^4.0.0" } }, "crypto-random-string": { @@ -1924,111 +2130,112 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, "cspell": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.12.0.tgz", - "integrity": "sha512-ny4xVEPYFP2jVf5w71Mnk4HKj6RbPH+CMSzUrOMbYVVNnQUj3GLfzy5DrSFLG0zGa353ZRC4/s9MsEvnAL8mkA==", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.31.2.tgz", + "integrity": "sha512-HJcQ8jqL/1N3Mj5dufFnIZCX3ACuRoFTSVY6h3Bo5wBqd2iiJTyeQ1SY9Zymlxtb2KyJ6jQRiFmkWeFx2HVs7w==", "requires": { - "@cspell/cspell-pipe": "^6.12.0", + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "@cspell/dynamic-import": "6.31.1", "chalk": "^4.1.2", - "commander": "^9.4.0", - "cspell-gitignore": "^6.12.0", - "cspell-glob": "^6.12.0", - "cspell-lib": "^6.12.0", + "commander": "^10.0.0", + "cspell-gitignore": "6.31.2", + "cspell-glob": "6.31.2", + "cspell-io": "6.31.2", + "cspell-lib": "6.31.2", + "fast-glob": "^3.2.12", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^6.0.1", - "fs-extra": "^10.1.0", "get-stdin": "^8.0.0", - "glob": "^8.0.3", "imurmurhash": "^0.1.4", - "semver": "^7.3.7", + "semver": "^7.3.8", "strip-ansi": "^6.0.1", - "vscode-uri": "^3.0.6" + "vscode-uri": "^3.0.7" } }, "cspell-dictionary": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.12.0.tgz", - "integrity": "sha512-I2cXSdXndt9H7yXmJzLTjgui/SAPGghXwxFeibTbvF68gyQYD5fUXvOygEIPrOEySKlAIb+aouV77SgoURxMHw==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.1.tgz", + "integrity": "sha512-7+K7aQGarqbpucky26wled7QSCJeg6VkLUWS+hLjyf0Cqc9Zew5xsLa4QjReExWUJx+a97jbiflITZNuWxgMrg==", "requires": { - "@cspell/cspell-pipe": "^6.12.0", - "@cspell/cspell-types": "^6.12.0", - "cspell-trie-lib": "^6.12.0", + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "cspell-trie-lib": "6.31.1", "fast-equals": "^4.0.3", - "gensequence": "^4.0.2" + "gensequence": "^5.0.2" } }, "cspell-gitignore": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.12.0.tgz", - "integrity": "sha512-gtsN2AAvqdE8CHVzpxsQcd/Wn5GAMTjzHpDXX71g/k8IJn743poGU06O0O1WSVAgK0fWTRsfg+V5OegA1TAo7A==", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.2.tgz", + "integrity": "sha512-B1i8aiXCIbb/08u0K3xnDyXtg0qD+lb5B2itOOXi7KXlPkKvIuN4hWyXxhVDweWyYWEzyXD5wBpPrqICVrStHQ==", "requires": { - "cspell-glob": "^6.12.0", + "cspell-glob": "6.31.2", "find-up": "^5.0.0" } }, "cspell-glob": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.12.0.tgz", - "integrity": "sha512-Q0rMGTxDyFFPm1LmHYM0ziuxQt2aXgr8Oi1glA2s0dBs0hg1DexlAEoLwLiMDUwSTvibEKIidPzlrmZ1AUDWEg==", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.2.tgz", + "integrity": "sha512-ceTjHM4HaBgvG5S3oiB+PTPYq58EQYG6MmYpycDHzpR5I2H1NurK9lxWHfANmLbi0DsHn58tIZNDMUnnQj19Jw==", "requires": { "micromatch": "^4.0.5" } }, "cspell-grammar": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.12.0.tgz", - "integrity": "sha512-WXcDiWJ2pTW0jHY0Bf0DW5s8A9S0a+2tsVZsNxE/0CR5P/8yDSnznE+59uok/JN+GXOKQ6VIaqAZA3/XjDZuuA==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.1.tgz", + "integrity": "sha512-AsRVP0idcNFVSb9+p9XjMumFj3BUV67WIPWApaAzJl/dYyiIygQObRE+si0/QtFWGNw873b7hNhWZiKjqIdoaQ==", "requires": { - "@cspell/cspell-pipe": "^6.12.0", - "@cspell/cspell-types": "^6.12.0" + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1" } }, "cspell-io": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.12.0.tgz", - "integrity": "sha512-1faxDj2OMgq61w7GaiXZD7ytks6PksJlG484LMl2USv58jDky4i2lujJs1C/+aP97Box9EcdwzydHX9GpnqqCw==", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.2.tgz", + "integrity": "sha512-Lp7LsF/f35LaOneROb/9mWiprShz2ONxjYFAt3bYP7gIxq41lWi8QhO+SN6spoqPp/wQXjSqJ7MuTZsemxPRnA==", "requires": { - "@cspell/cspell-service-bus": "^6.12.0", - "node-fetch": "^2.6.7" + "@cspell/cspell-service-bus": "6.31.1", + "node-fetch": "^2.6.9" } }, "cspell-lib": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.12.0.tgz", - "integrity": "sha512-IKd2MzH/zoiXohc26Lqb1b8i+41Y2xGreyAe9ihv/7Z2dscGGVy7F/2taZvZK9kJIhaz33Yatxfx3htT6w0hqg==", + "version": "6.31.2", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.2.tgz", + "integrity": "sha512-LqaB2ZfVfQHKL5aZzYoKU6/UxxAtWeXAYwpC9l+satXmajYyXtAh4kWmuW+y7kKRH2jA79rJQS3QE6ToeSqgQQ==", "requires": { - "@cspell/cspell-bundled-dicts": "^6.12.0", - "@cspell/cspell-pipe": "^6.12.0", - "@cspell/cspell-types": "^6.12.0", + "@cspell/cspell-bundled-dicts": "6.31.2", + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "@cspell/strong-weak-map": "6.31.1", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^5.0.1", - "cosmiconfig": "^7.0.1", - "cspell-dictionary": "^6.12.0", - "cspell-glob": "^6.12.0", - "cspell-grammar": "^6.12.0", - "cspell-io": "^6.12.0", - "cspell-trie-lib": "^6.12.0", + "cosmiconfig": "8.0.0", + "cspell-dictionary": "6.31.1", + "cspell-glob": "6.31.2", + "cspell-grammar": "6.31.1", + "cspell-io": "6.31.2", + "cspell-trie-lib": "6.31.1", "fast-equals": "^4.0.3", "find-up": "^5.0.0", - "fs-extra": "^10.1.0", - "gensequence": "^4.0.2", + "gensequence": "^5.0.2", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0", - "vscode-languageserver-textdocument": "^1.0.7", - "vscode-uri": "^3.0.6" + "vscode-languageserver-textdocument": "^1.0.8", + "vscode-uri": "^3.0.7" } }, "cspell-trie-lib": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.12.0.tgz", - "integrity": "sha512-SJOdb51Wy3ewaKfttZwc9NYOIXaKlhyr+ykYKBExj3qMfV1J4d4iDLE95FriaRcqnq6X/qEM9jUvZHlvadDk3A==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.1.tgz", + "integrity": "sha512-MtYh7s4Sbr1rKT31P2BK6KY+YfOy3dWsuusq9HnqCXmq6aZ1HyFgjH/9p9uvqGi/TboMqn1KOV8nifhXK3l3jg==", "requires": { - "@cspell/cspell-pipe": "^6.12.0", - "@cspell/cspell-types": "^6.12.0", - "fs-extra": "^10.1.0", - "gensequence": "^4.0.2" + "@cspell/cspell-pipe": "6.31.1", + "@cspell/cspell-types": "6.31.1", + "gensequence": "^5.0.2" } }, "dot-prop": { @@ -2062,11 +2269,31 @@ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==" }, + "fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "requires": { + "reusify": "^1.0.4" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2106,25 +2333,15 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "gensequence": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-4.0.2.tgz", - "integrity": "sha512-mQiFskYFPFDSUpBJ/n3ebAV2Ufu6DZGvUPXzyWYzFfJr6/DyOOZVnjx6VTWE4y0RLvYWnc5tZq5sCjzEWhRjqQ==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", + "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==" }, "get-stdin": { "version": "8.0.0", @@ -2132,15 +2349,24 @@ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==" }, "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" } }, "global-dirs": { @@ -2152,9 +2378,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "has-flag": { "version": "4.0.0", @@ -2190,6 +2416,11 @@ } } }, + "import-meta-resolve": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", + "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==" + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2219,6 +2450,19 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2239,20 +2483,19 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -2283,12 +2526,17 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -2299,17 +2547,17 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" } }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "requires": { "whatwg-url": "^5.0.0" } @@ -2377,6 +2625,11 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -2395,50 +2648,31 @@ "global-dirs": "^0.1.1" } }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -2493,20 +2727,15 @@ "crypto-random-string": "^2.0.0" } }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, "vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" }, "vscode-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz", - "integrity": "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, "webidl-conversions": { "version": "3.0.1", @@ -2548,11 +2777,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/eng/common/testproxy/dotnet-devcert.crt b/eng/common/testproxy/dotnet-devcert.crt index 07976e52ef0e..254432686db6 100644 --- a/eng/common/testproxy/dotnet-devcert.crt +++ b/eng/common/testproxy/dotnet-devcert.crt @@ -1,20 +1,21 @@ -----BEGIN CERTIFICATE----- -MIIDSDCCAjCgAwIBAgIUIoKu8Oao7j10TLNxaUG2Bs0FrRwwDQYJKoZIhvcNAQEL -BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMDgwNTIxMTcyM1oXDTIzMDgw -NTIxMTcyM1owFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA0UPG7ER++5/9D/qa4SCtt7QvdHwcpidbwktPNU8iRW7V -pIDPWS4goLp/+7+maT0Z/mqwSO3JDtm/dtdlr3F/5EMgyUExnYcvUixZAiyFyEwj -j6wnAtNvqsg4rDqBlD17fuqTVsZm9Yo7QYub6p5PeznWYucOxRrczqFCiW4uj0Yk -GgUHPPmCvhSDKowV8CYRHfkD6R8R4SFkoP3/uejXHxeXoYJNMWq5K0GqGaOZtNFB -F7QWZHoLrRpZcY4h+DxwP3c+/FdlVcs9nstkF+EnTnwx5IRyKsaWb/pUEmYKvNDz -wi6qnRUdu+DghZuvyZZDgwoYrSZokcbKumk0MsLC3QIDAQABo4GRMIGOMA8GA1Ud +MIIDZzCCAk+gAwIBAgIUXjY6UxqL53TvxH8dtPNZm6/getIwDQYJKoZIhvcNAQEL +BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIzMDcyODIxMDM1MloXDTI0MDcy +NzIxMDM1MlowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAsTPe57bim6NTmBHS1ldLAr7dnMT7AMtfttfjqPzggDgR +kNKj/mi5Xd86AOR6QfLMMipdL2NpPTZP557t4V1oVgODv+M3SiKRriY01TNbL9K5 +zjYlPDik1BzKJgHiLmHPmuKsWslTTMO86nau5YNzKfaOIFbiV5uTUCLTZh3NspDo +OaIeJ4Efud/6bHQkbIXggAt2TFjVum+jMXLYeyA8ZjwFgW1ENAlOOV5Gm8eFjkIt +OhQSZLlLc9BnJkOAhT0v6Xq0oRwCm0YW42+JFzmIvjK0cU/sFmjDqzKAxhtWexz7 +WT7KDiJU+GNsZmm8KjeU0EaQpzpK8q/MEbNRX1OqrQIDAQABo4GwMIGtMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGmMBYGA1UdJQEB/wQMMAoGCCsGAQUF BwMBMBcGA1UdEQEB/wQNMAuCCWxvY2FsaG9zdDA6BgorBgEEAYI3VAEBBCwMKkFT -UC5ORVQgQ29yZSBIVFRQUyBkZXZlbG9wbWVudCBjZXJ0aWZpY2F0ZTANBgkqhkiG -9w0BAQsFAAOCAQEARX4NxGbycdPVuqvu/CO+/LpWrEm1OcOl7N57/mD5npTIJT78 -TYtXk1J61akumKdf5CaBgCDRcl35LhioFZIMEsiOidffAp6t493xocncFBhIYYrZ -HS6aKsZKPu8h3wOLpYu+zh7f0Hx6pkHPAfw4+knmQjDYomz/hTwuo/MuT8k6Ee7B -NGWqxUamLI8bucuf2ZfT1XOq83uWaFF5KwAuVLhpzo39/TmPyYGnaoKRYf9QjabS -LUjecMNLJFWHUSD4cKHvXJjDYZEiCiy+MdUDytWIsfw0fzAUjz9Qaz8YpZ+fXufM -MNMNfyJHSMEMFIT2D1UaQiwryXWQWJ93OiSdjA== +UC5ORVQgQ29yZSBIVFRQUyBkZXZlbG9wbWVudCBjZXJ0aWZpY2F0ZTAdBgNVHQ4E +FgQU+9BDdfBwXH38ti7IGpL4Kn7IDVgwDQYJKoZIhvcNAQELBQADggEBAKoy2dp8 +gsKk1U51164IIhOYisaJ1egOI0++STd8j94SX9XlCAgwLaPr/mU/U438xKI1inSA +Miaboqtt2tqvfP5nceSYL3FPJ3K0ADw8UFgwApKiRYpRevAIspG+OaqHwHUFRhyG +bxkUZ4w96IEpVtDOGoy12sCmChZgdVk44+y8uurSza18Vj1LfkrN6ppZLt4FII5e +p8BFKtqCRToFRJIIjMePOdTUbeRwUCjBPyYv/h5jcJUfFXQJpPXvJs4LFcUivqA3 +sAut3tut6CDzToTMtAD5ebxSPh3DDM6JOsWhrGoT0if5qoio75tG6yV40gi3Tocr +KCwDu8B2O2HlL5Q= -----END CERTIFICATE----- diff --git a/eng/common/testproxy/dotnet-devcert.pfx b/eng/common/testproxy/dotnet-devcert.pfx index a971cd950a1e42e5c03a5f0aebde478d8a70614d..d8f717ce3cbe99ec93d580a07b985b393e0bb631 100644 GIT binary patch literal 2627 zcmai$S5Om(7KQ^Pk%X>-K?u@&Nk9ZaiBb$EaA`}&NC#0sFjRp+Hh^?RI*6euB1`We zRisKly7XQ`l_FIxJNJ(JxDRK}obR7A=k1$=AVN{JG;|0eWDg7x577+y$wYI3hD?Mk z0*R2>b3BP40`>oiz+@s&?Hrvi0nVG^KM4)O`1b%}LSPVL|BQ?XZXo?-L_Tr5oI!_{ zmL7m$1k?ZT8Z86_K)}He%MeW(J31hZIFNP0iVK!m-dq#rS(X;*&*KzGr0e~>*8AS` z#ZXYzf{^mBI4{@J!Lb^7@bdaeF%E^nENkT?NCdO{Ra zabfrmPjpFyVcuoM5m!@M>nVR`yU^^~NyW=5hgb5vAuAjZTe@)6@cW+|R(1{tAI zrd6@wo{lB~u@#{Dm%L?%W|bE`~9nbfzG#AvA!k&lfp)}iee zSBL4OHeT6_;TkG?-3mvYe&zv*@Pv=rolG1tg(FrZ6pyR>S)s*|2j zg#D7cZ5yv0CuOe~`_3KvQ~QL9v8^;BeN?+qt$K3Sj6~wTfKYmRfmJPUs;qpg+-{}U z>5;W>eBiDxL}SGxS&Vn}dSG?l^AfpMsjk^gEl`a94fslIEW;Oc62GbRvmm`F&S=>I zxnG?1p?T)ny_DGL27j$E_bGUcuoz(bS6nuKrM2h*zct8{gKpw7-vUk)s@L5Ihzs!T zYa5;8ufByJoy^=VSF%ib6RshmH}m8E=fOVv#qLm-ew`g!yd8BU2V<=h)dmrhYjcN~ z#=c7&;lxvCv6%|K$J+u(d6!wkh6d3LQd{MkN`&1gFR{6aWxUqB&ugL2A;gejgMnt- z@P~Bi?Dt-gXLF>N?tRB@YK%NgC|hJ_93CxW*+Vh2CwI6-wHq8a2fKdyxgOLobCC?EWH|c*BMOHd%1e8`mn=tDFLgO8d+E65 zX$l9G_y!|bx&gd`rFyWpLZi`on^L6+o=a@0H@zVVo44aVoNAs#=r72I%1bA_eZ?;? zp(Q9r=*|%4MEPfHlV!%Z9^CyX-|o;?KIOCg*A{bbpw=Lwt4{S+zH4RRONQGwDtid) z!m6Xsv2hm}eyW*?q;dq6agurQyU!TpPpNKltqAMptGo{IuQ$^((WR;xs72oo`xqWH z&1i!8s3Bq}@LO}*6jOfDKHEJ3o*J>|Ipu4Y}N_ zMI+!SGmYD@;~T^nWW;^6xPKP9bdNwO_COng(~aDgAoPY74oxZ4fTrsVY_aO0MXAmg zu80?BwPcV6mRE&^dW3cNSROp>{61s4XD72mlsolM*n> z?Y8`{$MDgF{*2J0FJ(VJWZR%`F;RV~&-V*&t|-bb?}8q#rlypypN9 zSr>WTk;7r87AyVrl0fG~unDIveTCJqm@YcvLHRH@@rmYLwJ~(aUQ8rM*ioHzT$kdD z&WL#UjD&2ZGfUXfC)c~MNs44|hdS5Z?N|m@mujJtYgxzF9cwZkyC&xd9>fEftK+8; zn&u~?U!&Qq&AR%BR?PN}B}Tv7(+s-~krL}OKfRv0lqQ<#fKUIC{Z0^3X4I6$y%Oi4 zuum=QSsDljM`1DL(8w^+nHSR|2>6QFny$8kkffMoQ<0&xuJT$au-*IxnmbY3`YiEQ zNKCJ$Ae_QQTKywOln0M3*0LG6cd1$O^)m01#W^QpoRP?#Ff#1~&ehtgEHJ4p^v^aE z-9UQvi1tk+b9(mCQ?HH~BzzP&@@{g5oQG0!vMM?qmy6jq&kNl$LG$DCSv0J%Y{adI zM%3IQc>34pm#c;!8K1jXzcPw{54KC)KjI-l?<6N}Xw+2oI(Pqh8tbolxL+UNozo$8 z?d!DvHwkFp($Jy5rN9Z#QF?X03amyJm!B4fQIYWl9dwWb45z0JaupvvF7@6yoj=sy zTDk6aC5>@uFY&fnl==0&Uo$oat8}?V&ZY`y_3Sbnz!?d6ErE1mK_8&Gl`}E#8-^FX zXHb3Ni$CiD=%RAGLe1IKh+6NaSq}T~1WYRvWbH*eSiqD3b8Lc*4|x8(Qijc@PKS7d zGZlwX6Lm#$rE|y9$ga(j#s>><(jtdlPmnL=@vi5?n(>-HRs;V!tlP4o&1<%+w~tU1 z@v^@ya8H3liLc;P=b>`vqg34ONDq?7zQ zDSl6;uf)=&!^AKj$(T+Rfh>`vkur)J2LwDd;M?T>DHHH!V+FXi&ghe>w~jP)%B7wF zVAWkvQ0z>=XyBC`A&JCb%c%m+E-$i#4ReY8ZfjAnQZkG98#2Pfd3G_iGA2cKbPcO) zK39->oKj^v)Nk_bNFI93_199rQB>0<-kPq`it$9$lvtvhAJiZN@IksT?P)UVb0HKF z;X+mW;OCEHXa2y(OfQE@?2?o^%ds%CfTI8Nez^h;78?i<#ummywb9M5@xiZBV0^R1 z!D@(fe!N>Jma@`7$<7^Ari?I0D?`A?M@ahwhO7 zD6^^nX0G+CZZUCY87yXP^mMpT*||orCnllmf~NgyQ|V3jxnv1Pj)gIkt?6NccP?ow z?Rr)#7yaKQ4h^#odrd0|l-@p$dg%AS21q)$EasV$Y>G^+slb&W1II0Ob z+mKXS7>lGq+(jS}OuyeRS{e`l$QwdvhR@%tI6OwW=*mc(I6AEr|dkVPut S3qbmovc2^DxN@7nRr_BOwaq91 literal 2445 zcmV;833B!@f(eNN0Ru3C2~P$IDuzgg_YDCD0ic2jKm>vbJTQU@I52_(?*<7fhDe6@ z4FLxRpn?P7FoFZz0s#Opf&yE|ZTQfT4iWVwNZb+}`5d0bdif ziJNtXUk{;*nvQ3MhOabxsH+@a_0kox3039v1vEEGpNN|x`?P(W zYiMhcNZ9wP=dc}Pbh8ikg$U1B;p@j~G;zy}R2T&uqC3cbRLWXCR%ctg2=Mp;*6EK> zazpCo%sVM~^b#L+TounBJ|;nwOif61 zK=?X=eAw>y%nto}qwKtO|8rVi!dhscXDs$Cs}){Hiu{K9iG*Uv zldi48axXfL8on>IN{%VrDqSG#QyB0vLcQtGO*;mT0<)(b+L#MvX2yWqS^ayJA+{^? zk(epulk%YQTx4Tsb8A8wKg*SMs5MwYoM(aTTk;(pY5sdw=cSFCOIN~xzZ)}heF85w zQ^1ce9_LDT2X;y?XDsR_Bj?|&0thFkU#|CwVB6?^SW)w>e6x=aNYC~{cRtrCr zS1yi3wX6FVN>v{^R@$YANAZbLQnQ|4%JTuST8g2OWW>XWVXTywq;-B&E60~TT{j~i z0~~$Pi<^znw(lUpj`k~GO)J?g$wl!%3uj0j%^}DRzhc0Z-!aJrk$trVPj5=<7{sOy z;UbeG)j(bza)!Rp6hsz&Zw(o-g(pc$1GqzuJGV$vl#;Qul;c2nk!3&k z>ryv!+t?mR)0WUt+^3zDnDF3mEiw6cNTym5PY;EHw2INA?`SgnmQPF z39QG@*sw{?=rw9%+SQN+gwd;7bzL%6Rso`Qey!>(&W-8%c!KKYTk4_qfi{S?8u?;k zu^d2=2Bse=;^>}(FoFd^1_>&LNQUVaU;V0(ZCA+%8uAzW@ z*1L{%_rVXFA)T(2JNumhI#NYTCGX*}8}A%zB@`Ib{=olmSLzwYh4g+!i~#Jal9F$#V3nuW9w!o8c}pwQH-Q7V`4UBBW@7$3xySUX z=P6zAMar6IdXdklA?OP4#PK{*wLR|{JZv=)gFZvU7`-``;?v*#qYKx^!Y?!+acc&# z0lyphnNf)DRf-)J2jfQ1jPN$)zsfU^T5(hJb)WT;S1MGWmLZZE<~SGZCM#wUM_U1J z0_<>Bt0h(tL`|x5qy;^Pmb9~S!c{{q+=(qjzPH1(g!}$iddA+vHDHF!FR-vlM2^0R zZ+u%K$(+3`pHc_ABlX;m5}nRuNi}n75*CT)_}?tVV`@Tl{W?j$xsPXj5zM;Xg9hjC z6kURaoGJ>P1weQ1C^-5#=;FeD8*%6NM6RS&eDdB%v_`OA+xN!Va@e5<`3~HM>>_NQ zyr{+^bK}9DaM(*^Ycu2X3@SA~!I*HibyS!KFJ@b|9>S^cr z)T4))4rRc;0UA_HFvUnY%-;!I*`v27C+F;TRvhr1w=ya{`FJ+6CUtAiDrKXFvevE+ z(&0?VNTaziW0&G_#|LaM*1&>Ek?$5*NWOFDt3X!tpG>K;>=RLQ^)F5>24xGh+z6aY;kICLeL#}L1>>mL8LLq@TzC!}s=hWU?<c9*SQGz56htwpj zSIFNT-Z2mDdaaa%Z#UbJ7o%vv&(UXsI%}nB;&9&a9{iCRXvYsy0&`fzN$|D6-}4St zEPB<%^pUVXNXq*4IhI?x2VCl2Bp7e_)kdC9!px^2$Ga?+!&u$Y0>|#a?#2+BfjCa? zOv~$I86b9#%vV2UFKSEc-*$I}5jkM*+ja_g1bFR-mu|L7^bhTzNU9<`nhM##6nNsQ zJ9+*d47mriG}ULLQyi_I!4N$CNnzG-fl;Mgc+ZZDW#Sgsl)(g0(P$)*-uV}*j>Faw zREakCBM(9Bh)QH`@hXfQlz99%U?VXlFe3&DDuzgg_YDCF6)_eB6hQ-Ud8Dhy8LAnF z9sVf`{>2f>lQ1zbAutIB1uG5%0vZJX1QfIlj%md)XQrRY&TUn`mX#c;W#/` or `//` etc. -3. The language also used to determine what the [recording directories within a repository are named](https://github.com/Azure/azure-sdk-tools/blob/main/eng/common/testproxy/transition-scripts/generate-assets-json.ps1#L47). +3. The language also used to determine what the [recording directories within a repository are named](https://github.com/Azure/azure-sdk-tools/blob/main/eng/common/testproxy/onboarding/generate-assets-json.ps1#L47). ## A final note about the initial push diff --git a/eng/common/testproxy/transition-scripts/generate-assets-json.ps1 b/eng/common/testproxy/onboarding/generate-assets-json.ps1 similarity index 91% rename from eng/common/testproxy/transition-scripts/generate-assets-json.ps1 rename to eng/common/testproxy/onboarding/generate-assets-json.ps1 index 3f43c7d3adff..3011a19e57aa 100644 --- a/eng/common/testproxy/transition-scripts/generate-assets-json.ps1 +++ b/eng/common/testproxy/onboarding/generate-assets-json.ps1 @@ -138,11 +138,18 @@ class Version { } Function Test-Exe-In-Path { - Param([string] $ExeToLookFor) + Param([string] $ExeToLookFor, [bool]$ExitOnError = $true) if ($null -eq (Get-Command $ExeToLookFor -ErrorAction SilentlyContinue)) { - Write-Error "Unable to find $ExeToLookFor in your PATH" - exit 1 + if ($ExitOnError) { + Write-Error "Unable to find $ExeToLookFor in your PATH" + exit 1 + } + else { + return $false + } } + + return $true } Function Test-TestProxyVersion { @@ -301,18 +308,17 @@ Function Invoke-ProxyCommand { # Get the shorthash directory under PROXY_ASSETS_FOLDER Function Get-AssetsRoot { param( - [string] $AssetsJsonFile + [string] $AssetsJsonFile, + [string] $TestProxyExe ) $repoRoot = Get-Repo-Root $relPath = [IO.Path]::GetRelativePath($repoRoot, $AssetsJsonFile).Replace("`\", "/") $assetsJsonDirectory = Split-Path $relPath - $breadcrumbFile = Join-Path $repoRoot ".assets" ".breadcrumb" - $breadcrumbString = Get-Content $breadcrumbFile | Where-Object { $_.StartsWith($relPath) } - $assetRepo = $breadcrumbString.Split(";")[1] - $assetsPrefix = (Get-Content $AssetsJsonFile | Out-String | ConvertFrom-Json).AssetsRepoPrefixPath + [array] $output = & "$TestProxyExe" config locate -a "$relPath" --storage-location="$repoRoot" + $assetsDirectory = $output[-1] - return Join-Path $repoRoot ".assets" $assetRepo $assetsPrefix $assetsJsonDirectory + return Join-Path $assetsDirectory $assetsJsonDirectory } Function Move-AssetsFromLangRepo { @@ -348,9 +354,29 @@ $language = Get-Repo-Language # in the path and that we're able to map the language's recording # directories if ($InitialPush) { - Test-Exe-In-Path -ExeToLookFor $TestProxyExe + $proxyPresent = Test-Exe-In-Path -ExeToLookFor $TestProxyExe -ExitOnError $false + + # try to fall back + if (-not $proxyPresent) { + $StandaloneTestProxyExe = "Azure.Sdk.Tools.TestProxy" + + if ($IsWindows) { + $StandaloneTestProxyExe += ".exe" + } + + $standalonePresent = Test-Exe-In-Path -ExeToLookFor $StandaloneTestProxyExe -ExitOnError $false + + if ($standalonePresent) { + Write-Host "Default proxy exe $TestProxyExe is not present, but standalone tool $StandaloneTestProxyExe is. Updating proxy exe to use the standalone version." + $TestProxyExe = $StandaloneTestProxyExe + } + else { + Write-Error "The user has selected option InitialPush to push their assets, neither $TestProxyExe nor standalone executable $StandaloneTestProxyExe are installed on this machine." + exit 1 + } + } - if ($TestProxyExe -eq "test-proxy") { + if ($TestProxyExe -eq "test-proxy" -or $TestProxyExe.StartsWith("Azure.Sdk.Tools.TestProxy")) { Test-TestProxyVersion -TestProxyExe $TestProxyExe } @@ -378,7 +404,7 @@ if ($InitialPush) { $CommandArgs = "restore --assets-json-path $assetsJsonRelPath" Invoke-ProxyCommand -TestProxyExe $TestProxyExe -CommandArgs $CommandArgs -TargetDirectory $repoRoot - $assetsRoot = (Get-AssetsRoot -AssetsJsonFile $assetsJsonFile) + $assetsRoot = (Get-AssetsRoot -AssetsJsonFile $assetsJsonFile -TestProxyExe $TestProxyExe) Write-Host "assetsRoot=$assetsRoot" Move-AssetsFromLangRepo -AssetsRoot $assetsRoot diff --git a/eng/common/testproxy/publish-proxy-logs.yml b/eng/common/testproxy/publish-proxy-logs.yml index 543527a4437c..543186edd353 100644 --- a/eng/common/testproxy/publish-proxy-logs.yml +++ b/eng/common/testproxy/publish-proxy-logs.yml @@ -5,12 +5,14 @@ steps: - pwsh: | Copy-Item -Path "${{ parameters.rootFolder }}/test-proxy.log" -Destination "${{ parameters.rootFolder }}/proxy.log" displayName: Copy Log File + condition: succeededOrFailed() - template: ../pipelines/templates/steps/publish-artifact.yml parameters: - ArtifactName: "$(System.JobName)-proxy-logs" + ArtifactName: "$(System.StageName)-$(System.JobName)-$(System.JobAttempt)-proxy-logs" ArtifactPath: "${{ parameters.rootFolder }}/proxy.log" - pwsh: | Remove-Item -Force ${{ parameters.rootFolder }}/proxy.log displayName: Cleanup Copied Log File + condition: succeededOrFailed() diff --git a/eng/common/testproxy/target_version.txt b/eng/common/testproxy/target_version.txt index 2e1adf9ccc4b..49c8aea654f1 100644 --- a/eng/common/testproxy/target_version.txt +++ b/eng/common/testproxy/target_version.txt @@ -1 +1 @@ -1.0.0-dev.20230427.1 +1.0.0-dev.20230912.4 diff --git a/eng/config.json b/eng/config.json index cc51b095a269..f5d6d44e6f15 100644 --- a/eng/config.json +++ b/eng/config.json @@ -1,5 +1,9 @@ { "Packages": [ + { + "Name": "resourcemanager", + "CoverageGoal": 0.0 + }, { "Name": "azappconfig", "CoverageGoal": 0.19 @@ -22,12 +26,24 @@ }, { "Name": "azidentity", - "CoverageGoal": 0.68 + "CoverageGoal": 0.87 }, { "Name": "azqueue", "CoverageGoal": 0.60 }, + { + "Name": "azdatalake", + "CoverageGoal": 0.60 + }, + { + "Name": "azfile", + "CoverageGoal": 0.75 + }, + { + "Name": "azopenai", + "CoverageGoal": 0.34 + }, { "Name": "aztemplate", "CoverageGoal": 0.50 @@ -42,7 +58,7 @@ }, { "Name": "keyvault/azsecrets", - "CoverageGoal": 0.80 + "CoverageGoal": 0.86 }, { "Name": "data", @@ -71,7 +87,7 @@ }, { "Name": "messaging/azservicebus", - "CoverageGoal": 0.50 + "CoverageGoal": 0.48 }, { "Name": "messaging/azeventhubs", @@ -86,8 +102,8 @@ "CoverageGoal": 0.85 }, { - "Name": "resourcemanager", - "CoverageGoal": 0.0 + "Name": "monitor/azingest", + "CoverageGoal": 0.75 }, { "Name": "security/keyvault/azadmin", diff --git a/eng/pipelines/mgmt-auto-release.yml b/eng/pipelines/mgmt-auto-release.yml index dfd10d30b63e..af1c7601c18b 100644 --- a/eng/pipelines/mgmt-auto-release.yml +++ b/eng/pipelines/mgmt-auto-release.yml @@ -23,7 +23,7 @@ stages: - task: GoTool@0 inputs: - version: '1.20' + version: '1.21.0' - task: ShellScript@2 inputs: diff --git a/eng/pipelines/templates/jobs/archetype-go-release.yml b/eng/pipelines/templates/jobs/archetype-go-release.yml index b0f5f2b3baa8..2ee96efb34ce 100644 --- a/eng/pipelines/templates/jobs/archetype-go-release.yml +++ b/eng/pipelines/templates/jobs/archetype-go-release.yml @@ -5,9 +5,11 @@ parameters: stages: - stage: CheckRelease + variables: + - template: /eng/pipelines/templates/variables/globals.yml displayName: 'Check Release: ${{ parameters.ServiceDirectory }}' dependsOn: ${{ parameters.DependsOn }} - condition: and(succeeded(), ne(variables['SetDevVersion'], 'true'), ne(variables['Skip.Release'], 'true'), ne(variables['Build.Repository.Name'], 'Azure/azure-sdk-for-go-pr')) + condition: and(succeeded(), ne(variables['SetDevVersion'], 'true'), ne(variables['Skip.Release'], 'true'), ne(variables['Build.Repository.Name'], 'Azure/azure-sdk-for-go-pr'), ne(variables.UseAzcoreFromMain, 'true')) jobs: - job: CheckReleaseJob displayName: "Check whether need to release" @@ -34,6 +36,8 @@ stages: env: GH_TOKEN: $(azuresdk-github-pat) - stage: Release + variables: + - template: /eng/pipelines/templates/variables/globals.yml displayName: 'Release: ${{ parameters.ServiceDirectory }}' dependsOn: CheckRelease condition: and(succeeded(), eq(dependencies.CheckRelease.outputs['CheckReleaseJob.Verify.NeedToRelease'], 'true')) @@ -98,5 +102,4 @@ stages: PRBranchName: increment-package-version-${{ parameters.ServiceDirectory }}-$(Build.BuildId) CommitMsg: "Increment package version after release of ${{ parameters.ServiceDirectory }}" PRTitle: "Increment version for ${{ parameters.ServiceDirectory }} releases" - PRLabels: "auto-merge" CloseAfterOpenForTesting: '${{ parameters.TestPipeline }}' diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client-samples.yml b/eng/pipelines/templates/jobs/archetype-sdk-client-samples.yml index a49c20f8b345..3cacf5930bdb 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client-samples.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client-samples.yml @@ -23,22 +23,22 @@ stages: pool.name: azsdk-pool-mms-win-2022-general image.name: MMS2022 go.version: '1.18.10' - Linux_Go119: + Linux_Go120: pool.name: azsdk-pool-mms-ubuntu-2004-general image.name: MMSUbuntu20.04 - go.version: '1.19.5' - Windows_Go119: + go.version: '1.20.7' + Windows_Go120: pool.name: azsdk-pool-mms-win-2022-general image.name: MMS2022 - go.version: '1.19.5' - Linux_Go120: + go.version: '1.20.7' + Linux_Go121: pool.name: azsdk-pool-mms-ubuntu-2004-general image.name: MMSUbuntu20.04 - go.version: '1.20' - Windows_Go120: + go.version: '1.21.0' + Windows_Go121: pool.name: azsdk-pool-mms-win-2022-general image.name: MMS2022 - go.version: '1.20' + go.version: '1.21.0' pool: name: $(pool.name) vmImage: $(image.name) @@ -71,7 +71,7 @@ stages: steps: - task: GoTool@0 inputs: - version: '1.20' + version: '1.21.0' displayName: "Select Go Version" - template: ../steps/create-go-workspace.yml diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-client.yml index b7d86177b8e6..31bf0dedbe75 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -71,41 +71,46 @@ parameters: - name: IncludeRelease type: boolean default: false + - name: ExcludeGoNMinus2 + type: boolean + default: false stages: - stage: Build + variables: + - template: /eng/pipelines/templates/variables/globals.yml jobs: - job: Test displayName: Build and Test on - variables: - - template: /eng/pipelines/templates/variables/globals.yml strategy: matrix: - Linux_Go118: - pool.name: azsdk-pool-mms-ubuntu-2004-general - image.name: MMSUbuntu20.04 - go.version: '1.18.10' - Windows_Go118: - pool.name: azsdk-pool-mms-win-2022-general - image.name: MMS2022 - go.version: '1.18.10' - Linux_Go119: + ${{ if eq(parameters.ExcludeGoNMinus2, false) }}: + Linux_Go118: + pool.name: azsdk-pool-mms-ubuntu-2004-general + image.name: MMSUbuntu20.04 + go.version: '1.18.10' + ${{ if eq(parameters.ExcludeGoNMinus2, false) }}: + Windows_Go118: + pool.name: azsdk-pool-mms-win-2022-general + image.name: MMS2022 + go.version: '1.18.10' + Linux_Go120: pool.name: azsdk-pool-mms-ubuntu-2004-general image.name: MMSUbuntu20.04 - go.version: '1.19' - Windows_Go119: + go.version: '1.20.7' + Windows_Go120: pool.name: azsdk-pool-mms-win-2022-general image.name: MMS2022 - go.version: '1.19' - Linux_Go120: + go.version: '1.20.7' + Linux_Go121: pool.name: azsdk-pool-mms-ubuntu-2004-general image.name: MMSUbuntu20.04 - go.version: '1.20' - Windows_Go120: + go.version: '1.21.0' + Windows_Go121: pool.name: azsdk-pool-mms-win-2022-general image.name: MMS2022 - go.version: '1.20' + go.version: '1.21.0' generate.bom: true pool: name: $(pool.name) @@ -140,7 +145,9 @@ stages: - job: Analyze displayName: Analyze variables: - - template: /eng/pipelines/templates/variables/globals.yml + Codeql.Enabled: true + Codeql.BuildIdentifier: ${{ parameters.ServiceDirectory }} + Codeql.SkipTaskAutoInjection: false pool: name: azsdk-pool-mms-ubuntu-2004-general @@ -149,7 +156,7 @@ stages: - task: GoTool@0 inputs: - version: '1.20' + version: '1.21.0' displayName: "Select Go Version" - template: ../steps/create-go-workspace.yml @@ -168,6 +175,8 @@ stages: - ${{ if or(contains(parameters.Clouds, cloud.key), and(contains(variables['Build.DefinitionName'], 'weekly'), contains(parameters.SupportedClouds, cloud.key))) }}: - ${{ if not(contains(parameters.UnsupportedClouds, cloud.key)) }}: - stage: ${{ cloud.key }} + variables: + - template: /eng/pipelines/templates/variables/globals.yml displayName: Live Test ${{ cloud.key }} dependsOn: [] jobs: diff --git a/eng/pipelines/templates/jobs/archetype-sdk-eng-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-eng-client.yml index 8d1d50d1700e..6385c85943b4 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-eng-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-eng-client.yml @@ -33,22 +33,22 @@ stages: pool.name: azsdk-pool-mms-win-2022-general image.name: MMS2022 go.version: '1.18.10' - Linux_Go119: + Linux_Go120: pool.name: azsdk-pool-mms-ubuntu-2004-general image.name: MMSUbuntu20.04 - go.version: '1.19.5' - Windows_Go119: + go.version: '1.20.7' + Windows_Go120: pool.name: azsdk-pool-mms-win-2022-general image.name: MMS2022 - go.version: '1.19.5' - Linux_Go120: + go.version: '1.20.7' + Linux_Go121: pool.name: azsdk-pool-mms-ubuntu-2004-general image.name: MMSUbuntu20.04 - go.version: '1.20' - Windows_Go120: + go.version: '1.21.0' + Windows_Go121: pool.name: azsdk-pool-mms-win-2022-general image.name: MMS2022 - go.version: '1.20' + go.version: '1.21.0' generate.bom: true pool: name: $(pool.name) @@ -87,7 +87,7 @@ stages: - task: GoTool@0 inputs: - version: '1.20' + version: '1.21.0' displayName: "Select Go Version" - template: ../steps/create-go-workspace.yml diff --git a/eng/pipelines/templates/jobs/live.tests.yml b/eng/pipelines/templates/jobs/live.tests.yml index f959471f5dfa..eb17219213d2 100644 --- a/eng/pipelines/templates/jobs/live.tests.yml +++ b/eng/pipelines/templates/jobs/live.tests.yml @@ -66,6 +66,7 @@ jobs: parameters: SubscriptionConfiguration: ${{ parameters.CloudConfig.SubscriptionConfiguration }} SubscriptionConfigurations: ${{ parameters.CloudConfig.SubscriptionConfigurations }} + EnvVars: ${{ parameters.EnvVars }} - template: /eng/common/TestResources/deploy-test-resources.yml parameters: diff --git a/eng/pipelines/templates/jobs/mgmt-mock-test.yml b/eng/pipelines/templates/jobs/mgmt-mock-test.yml index 6ac45250fd55..650ea03a7c69 100644 --- a/eng/pipelines/templates/jobs/mgmt-mock-test.yml +++ b/eng/pipelines/templates/jobs/mgmt-mock-test.yml @@ -14,7 +14,7 @@ jobs: displayName: 'Install autorest' - task: GoTool@0 inputs: - version: '1.20' + version: '1.21.0' displayName: "Select Go Version" - template: /eng/pipelines/templates/steps/create-go-workspace.yml diff --git a/eng/pipelines/templates/stages/platform-matrix.json b/eng/pipelines/templates/stages/platform-matrix.json index c1f1c63729e9..59c711dbd98c 100644 --- a/eng/pipelines/templates/stages/platform-matrix.json +++ b/eng/pipelines/templates/stages/platform-matrix.json @@ -12,8 +12,8 @@ }, "GoVersion": [ "1.18.10", - "1.19.5", - "1.20" + "1.20.7", + "1.21.0" ] } } diff --git a/eng/pipelines/templates/steps/build-test.yml b/eng/pipelines/templates/steps/build-test.yml index 3fc3d3f05d83..c27e2a37ba8e 100644 --- a/eng/pipelines/templates/steps/build-test.yml +++ b/eng/pipelines/templates/steps/build-test.yml @@ -19,6 +19,17 @@ parameters: default: '600s' steps: + - task: Powershell@2 + displayName: Use azcore from main + condition: eq(variables.UseAzcoreFromMain, 'true') + env: + GO111MODULE: 'on' + inputs: + targetType: filePath + pwsh: true + filePath: eng/scripts/Replace-azcore.ps1 + arguments: '${{ parameters.ServiceDirectory }}' + - task: Powershell@2 displayName: Build env: @@ -53,6 +64,8 @@ steps: - ${{ if eq(parameters.TestProxy, true) }}: - template: /eng/common/testproxy/test-proxy-tool.yml + parameters: + targetVersion: '1.0.0-dev.20230427.1' - task: PowerShell@2 displayName: 'Run Tests' @@ -73,7 +86,7 @@ steps: inputs: targetType: 'filePath' filePath: ./eng/scripts/Build_Perf.ps1 - arguments: '${{ parameters.ServiceDirectory }}' + arguments: '${{ parameters.ServiceDirectory }} $$(UseAzcoreFromMain)' pwsh: true - ${{ if eq(parameters.TestProxy, true) }}: diff --git a/eng/pipelines/templates/variables/globals.yml b/eng/pipelines/templates/variables/globals.yml index 98f4404689df..77984cc5ffa7 100644 --- a/eng/pipelines/templates/variables/globals.yml +++ b/eng/pipelines/templates/variables/globals.yml @@ -1,7 +1,13 @@ variables: - GoLintCLIVersion: 'v1.52.2' + GoLintCLIVersion: 'v1.54.2' Package.EnableSBOMSigning: true # Enable go native component governance detection # https://docs.opensource.microsoft.com/tools/cg/index.html # https://github.com/microsoft/component-detection/blob/main/src/Microsoft.ComponentDetection.Detectors/go/GoComponentDetector.cs EnableGoCliScan: true + + # Disable CodeQL injections except for where we specifically enable it + Codeql.SkipTaskAutoInjection: true + + # Set the default value so that 'Build Performance Tests' step can resolve it + UseAzcoreFromMain: $[eq(variables['Use.AzcoreFromMain'], 'true')] diff --git a/eng/scripts/Build_Perf.ps1 b/eng/scripts/Build_Perf.ps1 index 3a441fb34207..2e81da4178a4 100644 --- a/eng/scripts/Build_Perf.ps1 +++ b/eng/scripts/Build_Perf.ps1 @@ -1,7 +1,8 @@ #Requires -Version 7.0 Param( - [string] $serviceDirectory + [string] $serviceDirectory, + [bool] $useAzcoreFromMain ) Push-Location sdk/$serviceDirectory @@ -10,7 +11,7 @@ Push-Location sdk/$serviceDirectory $perfDirectories = Get-ChildItem -Path . -Filter testdata -Recurse if ($perfDirectories.Length -eq 0) { - Write-Host "Did not find any performance tests in the directory $(pwd)" + Write-Host "##[command] Did not find any performance tests in the directory $(Get-Location)" exit 0 } @@ -23,6 +24,15 @@ foreach ($perfDir in $perfDirectories) { Push-Location perf Write-Host "##[command] Building and vetting performance tests in $perfDir/perf" + if ($useAzcoreFromMain) { + # using a live azcore might be dragging in updated dependencies + Write-Host "##[command] Executing 'go mod tidy' in $perfDir/perf" + go mod tidy + if ($LASTEXITCODE) { + $failed = $true + } + } + Write-Host "##[command] Executing 'go build .' in $perfDir/perf" go build . if ($LASTEXITCODE) { diff --git a/eng/scripts/Language-Settings.ps1 b/eng/scripts/Language-Settings.ps1 index c3c2ab561886..a007a44537d2 100644 --- a/eng/scripts/Language-Settings.ps1 +++ b/eng/scripts/Language-Settings.ps1 @@ -37,9 +37,9 @@ function Get-GoModuleVersionInfo($modPath) function Get-GoModuleProperties($goModPath) { $goModPath = $goModPath -replace "\\", "/" - # We should keep this regex in sync with what is in the azure-sdk repo at https://github.com/Azure/azure-sdk/blob/main/eng/scripts/Query-Azure-Packages.ps1#L227 + # We should keep this regex in sync with what is in the azure-sdk repo at https://github.com/Azure/azure-sdk/blob/main/eng/scripts/Query-Azure-Packages.ps1#L238 # The serviceName named capture group is unused but used in azure-sdk, so it's kept here for parity - if ($goModPath -match "(?(sdk|profile)/(?(.*?(?[^/]+)/)?(?[^/]+$)))") + if (!$goModPath.Contains("testdata") -and $goModPath -match "(?(sdk|profile)/(?(.*?(?[^/]+)/)?(?[^/]+$)))") { $modPath = $matches["modPath"] $modName = $matches["modName"] # We may need to start reading this from the go.mod file if the path and mod config start to differ diff --git a/eng/scripts/MgmtTestLib.ps1 b/eng/scripts/MgmtTestLib.ps1 index f2cb5bbbbb1c..2297704c021d 100644 --- a/eng/scripts/MgmtTestLib.ps1 +++ b/eng/scripts/MgmtTestLib.ps1 @@ -18,9 +18,8 @@ function Invoke-MgmtTestgen () [switch]$tidy, [string]$autorestPath = "", [string]$config = "autorest.md", - [string]$autorestVersion = "3.8.2", - [string]$goExtension = "@autorest/go@4.0.0-preview.48", - [string]$testExtension = "@autorest/gotest@4.6.0", + [string]$goExtension = "@autorest/go@4.0.0-preview.55", + [string]$testExtension = "@autorest/gotest@4.6.2", [string]$outputFolder ) if ($clean) @@ -73,8 +72,8 @@ function Invoke-MgmtTestgen () $removeUnreferencedTypesFlag = "true" } - Write-Host "autorest --version=$autorestVersion --use=$goExtension --use=$testExtension --go --track2 --output-folder=$outputFolder --clear-output-folder=false --go.clear-output-folder=false --generate-sdk=false --testmodeler.generate-mock-test=$mockTestFlag --testmodeler.generate-sdk-example=$exampleFlag --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath" - npx autorest --version=$autorestVersion --use=$goExtension --use=$testExtension --go --track2 --output-folder=$outputFolder --clear-output-folder=false --go.clear-output-folder=false --generate-sdk=false --testmodeler.generate-mock-test=$mockTestFlag --testmodeler.generate-sdk-example=$exampleFlag --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath + Write-Host "autorest --use=$goExtension --use=$testExtension --go --track2 --output-folder=$outputFolder --clear-output-folder=false --go.clear-output-folder=false --generate-sdk=false --testmodeler.generate-mock-test=$mockTestFlag --testmodeler.generate-sdk-example=$exampleFlag --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath" + npx autorest --use=$goExtension --use=$testExtension --go --track2 --output-folder=$outputFolder --clear-output-folder=false --go.clear-output-folder=false --generate-sdk=false --testmodeler.generate-mock-test=$mockTestFlag --testmodeler.generate-sdk-example=$exampleFlag --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath if ($LASTEXITCODE) { Write-Host "##[error]Error running autorest.gotest" diff --git a/eng/scripts/Replace-azcore.ps1 b/eng/scripts/Replace-azcore.ps1 new file mode 100644 index 000000000000..950bfa62cc38 --- /dev/null +++ b/eng/scripts/Replace-azcore.ps1 @@ -0,0 +1,41 @@ +Param( + [string] $ServiceDirectory +) + +. (Join-Path $PSScriptRoot .. common scripts common.ps1) + +$moduleDirectory = Join-Path $RepoRoot "sdk" $ServiceDirectory +$goModFile = Join-Path $moduleDirectory "go.mod" + +if (!(Test-Path $goModFile)) { + Write-Host "##[command]The file $goModFile doesn't exist" + exit 1 +} + +if ((Get-Content $goModFile -raw) -notmatch "github.com/Azure/azure-sdk-for-go/sdk/azcore") { + # no dependency on azcore, exit + Write-Host "##[command]No azcore dependency found in " $goModFile + return +} + +# walk up the directory tree until we find the sdk directory, constructing the relative path as we go +$relativePath = "" +for ($parent = $moduleDirectory; !$parent.EndsWith("$([IO.Path]::DirectorySeparatorChar)sdk"); $parent = (Split-Path $parent)) { + if ($parent -eq $RepoRoot) { + # we hit the root of the repo, bail to prevent infinite loop + Write-Host "##[command]Walked to repo root which is unexpected" + exit 1 + } + $relativePath += "../" +} + +# add a replace directive to go.mod with a relative path to the azcore directory +$replace = "replace github.com/Azure/azure-sdk-for-go/sdk/azcore => $($relativePath)azcore" +Write-Host "##[command]Adding replace statement " $replace +Add-Content -Path $goModFile -Value "`n$($replace)" + +## go mod tidy +Write-Host "##[command]Executing go mod tidy in " $moduleDirectory +Set-Location $moduleDirectory +go mod tidy +if ($LASTEXITCODE) { exit $LASTEXITCODE } diff --git a/eng/scripts/automation_init.sh b/eng/scripts/automation_init.sh index c5bb546012c0..dd65e10389b7 100644 --- a/eng/scripts/automation_init.sh +++ b/eng/scripts/automation_init.sh @@ -17,10 +17,10 @@ outputFile="$(realpath $outputFile)" echo "output json file: $outputFile" TMPDIR="/tmp" -if [ ! "$(go version | awk '{print $3}' | cut -c 3-6)" = "1.20" ] +if [ ! "$(go version | awk '{print $3}' | cut -c 3-6)" = "1.21" ] then - wget https://golang.org/dl/go1.20.linux-amd64.tar.gz - tar -C $TMPDIR -xzf go1.20.linux-amd64.tar.gz + wget https://golang.org/dl/go1.21.0.linux-amd64.tar.gz + tar -C $TMPDIR -xzf go1.21.0.linux-amd64.tar.gz export GOROOT=$TMPDIR/go export PATH=$GOROOT/bin:$PATH fi diff --git a/eng/scripts/build.ps1 b/eng/scripts/build.ps1 index 98ebe8614e72..f60ff5d33cd2 100644 --- a/eng/scripts/build.ps1 +++ b/eng/scripts/build.ps1 @@ -11,8 +11,7 @@ param( [switch]$alwaysSetBodyParamRequired, [switch]$removeUnreferencedTypes, [string]$config = "autorest.md", - [string]$autorestVersion = "3.8.2", - [string]$goExtension = "@autorest/go@4.0.0-preview.48", + [string]$goExtension = "@autorest/go@4.0.0-preview.55", [string]$filePrefix, [string]$outputFolder ) @@ -32,7 +31,7 @@ function Process-Sdk () if ($cleanGenerated) { Write-Host "##[command]Cleaning auto-generated files in" $currentDirectory - (Get-ChildItem "*.go" | Where-Object { $_.Name -notlike '*_test.go' } | Select-String -Pattern "Code generated by Microsoft" | Select-Object -ExpandProperty path) | Remove-Item -Force + (Get-ChildItem -recurse "*.go" | Where-Object { $_.Name -notlike '*_test.go' } | Select-String -Pattern "Code generated by Microsoft" | Select-Object -ExpandProperty path) | Remove-Item -Force } if ($generate) @@ -59,13 +58,13 @@ function Process-Sdk () if ($filePrefix) { - Write-Host "autorest --version=$autorestVersion --use=$goExtension --go --track2 --output-folder=$outputFolder --file-prefix=$filePrefix --clear-output-folder=false --go.clear-output-folder=false --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath" - autorest --version=$autorestVersion --use=$goExtension --go --track2 --output-folder=$outputFolder --file-prefix=$filePrefix --clear-output-folder=false --go.clear-output-folder=false --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath + Write-Host "autorest --use=$goExtension --go --track2 --output-folder=$outputFolder --file-prefix=$filePrefix --clear-output-folder=false --go.clear-output-folder=false --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath" + autorest --use=$goExtension --go --track2 --output-folder=$outputFolder --file-prefix=$filePrefix --clear-output-folder=false --go.clear-output-folder=false --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath } else { - Write-Host "autorest --version=$autorestVersion --use=$goExtension --go --track2 --output-folder=$outputFolder --clear-output-folder=false --go.clear-output-folder=false --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath" - autorest --version=$autorestVersion --use=$goExtension --go --track2 --output-folder=$outputFolder --clear-output-folder=false --go.clear-output-folder=false --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath + Write-Host "autorest --use=$goExtension --go --track2 --output-folder=$outputFolder --clear-output-folder=false --go.clear-output-folder=false --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath" + autorest --use=$goExtension --go --track2 --output-folder=$outputFolder --clear-output-folder=false --go.clear-output-folder=false --honor-body-placement=$honorBodyPlacement --remove-unreferenced-types=$removeUnreferencedTypesFlag $autorestPath } if ($LASTEXITCODE) diff --git a/eng/tools/generator/autorest/generation.go b/eng/tools/generator/autorest/generation.go index 9bc0e3d06361..9078f75d1683 100644 --- a/eng/tools/generator/autorest/generation.go +++ b/eng/tools/generator/autorest/generation.go @@ -292,7 +292,7 @@ func scannerPrint(scanner *bufio.Scanner, writer io.Writer, prefix string) error } for scanner.Scan() { line := scanner.Text() - if _, err := fmt.Fprintln(writer, fmt.Sprintf("%s%s", prefix, line)); err != nil { + if _, err := fmt.Fprintf(writer, "%s%s\n", prefix, line); err != nil { return err } } diff --git a/eng/tools/generator/autorest/model/changelog.go b/eng/tools/generator/autorest/model/changelog.go index 448ab4eb8926..bed024cce453 100644 --- a/eng/tools/generator/autorest/model/changelog.go +++ b/eng/tools/generator/autorest/model/changelog.go @@ -68,7 +68,7 @@ func (c Changelog) GetChangeSummary() string { func (c Changelog) GetBreakingChangeItems() []string { if c.RemovedPackage { return []string{ - fmt.Sprintf("Package was removed"), + "Package was removed", } } if c.Modified == nil { diff --git a/eng/tools/generator/cmd/v2/common/changelogProcessor_test.go b/eng/tools/generator/cmd/v2/common/changelogProcessor_test.go index 45fbb18b8ee8..35faa8bc88a3 100644 --- a/eng/tools/generator/cmd/v2/common/changelogProcessor_test.go +++ b/eng/tools/generator/cmd/v2/common/changelogProcessor_test.go @@ -4,7 +4,6 @@ package common_test import ( - "fmt" "testing" "github.com/Azure/azure-sdk-for-go/eng/tools/generator/autorest" @@ -31,7 +30,7 @@ func TestEnumFilter(t *testing.T) { common.FilterChangelog(changelog, common.EnumFilter) - excepted := fmt.Sprint("### Breaking Changes\n\n- Enum `EnumRemove` has been removed\n\n### Features Added\n\n- New value `EnumExistB` added to enum type `EnumExist`\n- New enum type `EnumAdd` with values `EnumAddA`, `EnumAddB`\n") + excepted := "### Breaking Changes\n\n- Enum `EnumRemove` has been removed\n\n### Features Added\n\n- New value `EnumExistB` added to enum type `EnumExist`\n- New enum type `EnumAdd` with values `EnumAddA`, `EnumAddB`\n" assert.Equal(t, excepted, changelog.ToCompactMarkdown()) } @@ -53,7 +52,7 @@ func TestFuncFilter(t *testing.T) { common.FilterChangelog(changelog, common.FuncFilter) - excepted := fmt.Sprint("### Breaking Changes\n\n- Function `*Client.BeingDelete` has been removed\n- Function `*Client.NewListPager` has been removed\n- Function `*Client.Update` has been removed\n\n### Features Added\n\n- New function `*Client.BeginCreateOrUpdate(string, *ClientBeginCreateOrUpdateOptions) (ClientBeginCreateOrUpdateResponse, error)`\n- New function `*Client.NewListBySubscriptionPager(*ClientListBySubscriptionOptions) *runtime.Pager[ClientListBySubscriptionResponse]`\n") + excepted := "### Breaking Changes\n\n- Function `*Client.BeingDelete` has been removed\n- Function `*Client.NewListPager` has been removed\n- Function `*Client.Update` has been removed\n\n### Features Added\n\n- New function `*Client.BeginCreateOrUpdate(string, *ClientBeginCreateOrUpdateOptions) (ClientBeginCreateOrUpdateResponse, error)`\n- New function `*Client.NewListBySubscriptionPager(*ClientListBySubscriptionOptions) *runtime.Pager[ClientListBySubscriptionResponse]`\n" assert.Equal(t, excepted, changelog.ToCompactMarkdown()) } @@ -75,7 +74,7 @@ func TestLROFilter(t *testing.T) { common.FilterChangelog(changelog, common.FuncFilter, common.LROFilter) - excepted := fmt.Sprint("### Breaking Changes\n\n- Operation `*Client.BeginDelete` has been changed to non-LRO, use `*Client.Delete` instead.\n- Operation `*Client.CreateOrUpdate` has been changed to LRO, use `*Client.BeginCreateOrUpdate` instead.\n") + excepted := "### Breaking Changes\n\n- Operation `*Client.BeginDelete` has been changed to non-LRO, use `*Client.Delete` instead.\n- Operation `*Client.CreateOrUpdate` has been changed to LRO, use `*Client.BeginCreateOrUpdate` instead.\n" assert.Equal(t, excepted, changelog.ToCompactMarkdown()) } @@ -97,7 +96,7 @@ func TestPageableFilter(t *testing.T) { common.FilterChangelog(changelog, common.FuncFilter, common.PageableFilter) - excepted := fmt.Sprint("### Breaking Changes\n\n- Operation `*Client.GetLog` has supported pagination, use `*Client.NewGetLogPager` instead.\n- Operation `*Client.NewListPager` does not support pagination anymore, use `*Client.List` instead.\n") + excepted := "### Breaking Changes\n\n- Operation `*Client.GetLog` has supported pagination, use `*Client.NewGetLogPager` instead.\n- Operation `*Client.NewListPager` does not support pagination anymore, use `*Client.List` instead.\n" assert.Equal(t, excepted, changelog.ToCompactMarkdown()) } @@ -119,7 +118,7 @@ func TestInterfaceToAnyFilter(t *testing.T) { common.FilterChangelog(changelog, common.InterfaceToAnyFilter) - excepted := fmt.Sprint("### Breaking Changes\n\n- Type of `Interface2Any.NewType` has been changed from `interface{}` to `string`\n") + excepted := "### Breaking Changes\n\n- Type of `Interface2Any.NewType` has been changed from `interface{}` to `string`\n" assert.Equal(t, excepted, changelog.ToCompactMarkdown()) } @@ -139,7 +138,7 @@ func TestTypeToAny(t *testing.T) { t.Fatal(err) } - excepted := fmt.Sprint("### Breaking Changes\n\n- Type of `Client.M` has been changed from `map[string]string` to `map[string]any`\n\n### Features Added\n\n- Type of `Client.A` has been changed from `*int` to `any`\n") + excepted := "### Breaking Changes\n\n- Type of `Client.M` has been changed from `map[string]string` to `map[string]any`\n\n### Features Added\n\n- Type of `Client.A` has been changed from `*int` to `any`\n" assert.Equal(t, excepted, changelog.ToCompactMarkdown()) } @@ -161,6 +160,6 @@ func TestFuncParameterChange(t *testing.T) { common.FilterChangelog(changelog, common.FuncFilter) - excepted := fmt.Sprint("### Breaking Changes\n\n- Function `*Client.AfterAny` parameter(s) have been changed from `(context.Context, string, string, interface{}, ClientOption)` to `(context.Context, string, string, any, Option)`\n- Function `*Client.BeforeAny` parameter(s) have been changed from `(context.Context, string, string, interface{}, ClientOption)` to `(context.Context, string, any, any, ClientOption)`\n") + excepted := "### Breaking Changes\n\n- Function `*Client.AfterAny` parameter(s) have been changed from `(context.Context, string, string, interface{}, ClientOption)` to `(context.Context, string, string, any, Option)`\n- Function `*Client.BeforeAny` parameter(s) have been changed from `(context.Context, string, string, interface{}, ClientOption)` to `(context.Context, string, any, any, ClientOption)`\n" assert.Equal(t, excepted, changelog.ToCompactMarkdown()) } diff --git a/eng/tools/generator/cmd/v2/common/fileProcessor.go b/eng/tools/generator/cmd/v2/common/fileProcessor.go index 6b8730746ae6..fc5873e0aa46 100644 --- a/eng/tools/generator/cmd/v2/common/fileProcessor.go +++ b/eng/tools/generator/cmd/v2/common/fileProcessor.go @@ -5,6 +5,7 @@ package common import ( "fmt" + "io/fs" "io/ioutil" "log" "os" @@ -94,9 +95,9 @@ func ReadV2ModuleNameToGetNamespace(path string) (map[string][]PackageInfo, erro return nil, fmt.Errorf("last `track2` section does not properly end") } - s := strings.ReplaceAll(path, "\\", "/") - s1 := strings.Split(s, "/") - specName := s1[len(s1)-3] + _, after, _ := strings.Cut(strings.ReplaceAll(path, "\\", "/"), "specification") + before, _, _ := strings.Cut(after, "resource-manager") + specName := strings.Trim(before, "/") for i := range start { // get the content of the `track2` section @@ -287,7 +288,10 @@ func CalculateNewVersion(changelog *model.Changelog, previousVersion string, isC } else { prl = FirstGALabel } - } else if changelog.HasBreakingChanges() || changelog.Modified.HasAdditiveChanges() { + } else if changelog.HasBreakingChanges() { + newVersion = version.IncMinor() + prl = BetaBreakingChangeLabel + } else if changelog.Modified.HasAdditiveChanges() { newVersion = version.IncMinor() prl = BetaLabel } else { @@ -492,3 +496,113 @@ func AddTagSet(path, tag string) error { return os.WriteFile(path, []byte(strings.Join(lines, "\n")), 0644) } + +func GetTag(path string) (string, error) { + b, err := os.ReadFile(path) + if err != nil { + return "", err + } + + lines := strings.Split(string(b), "\n") + for _, line := range lines { + if strings.Contains(line, "tag:") { + return strings.TrimSpace(string([]byte(line)[len("tag:"):])), nil + } + } + + return "", nil +} + +func isGenerateFake(path string) bool { + b, _ := os.ReadFile(filepath.Join(path, "autorest.md")) + if strings.Contains(string(b), "generate-fakes: true") { + return true + } + + return false +} + +func replaceModuleImport(path, rpName, namespaceName, previousVersion, currentVersion, subPath string, suffixes ...string) error { + previous, err := semver.NewVersion(previousVersion) + if err != nil { + return err + } + + current, err := semver.NewVersion(currentVersion) + if err != nil { + return err + } + + if previous.Major() == current.Major() { + return nil + } + + oldModule := fmt.Sprintf("github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/%s/%s", rpName, namespaceName) + if previous.Major() > 1 { + oldModule = fmt.Sprintf("%s/v%d", oldModule, previous.Major()) + } + + newModule := fmt.Sprintf("github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/%s/%s", rpName, namespaceName) + if current.Major() > 1 { + newModule = fmt.Sprintf("%s/v%d", newModule, current.Major()) + } + + if oldModule == newModule { + return nil + } + + return filepath.Walk(filepath.Join(path, subPath), func(path string, info fs.FileInfo, err error) error { + if err != nil { + return err + } + + if info.IsDir() { + return nil + } + + suffix := false + for i := 0; i < len(suffixes) && !suffix; i++ { + suffix = strings.HasSuffix(info.Name(), suffixes[i]) + } + + if suffix { + b, err := os.ReadFile(path) + if err != nil { + return err + } + + newFile := strings.ReplaceAll(string(b), oldModule, newModule) + if newFile != string(b) { + if err = os.WriteFile(path, []byte(newFile), 0666); err != nil { + return err + } + } + } + + return nil + }) +} + +func existSuffixFile(path, suffix string) bool { + + existed := false + err := filepath.WalkDir(path, func(p string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + if d.IsDir() { + return nil + } + + if strings.HasSuffix(d.Name(), suffix) { + existed = true + } + return nil + }) + if err != nil { + return false + } + + return existed +} diff --git a/eng/tools/generator/cmd/v2/common/fileProcessor_test.go b/eng/tools/generator/cmd/v2/common/fileProcessor_test.go index b859f5daecf7..fdaeac0822ca 100644 --- a/eng/tools/generator/cmd/v2/common/fileProcessor_test.go +++ b/eng/tools/generator/cmd/v2/common/fileProcessor_test.go @@ -41,7 +41,7 @@ func TestCalculateNewVersion(t *testing.T) { newVersion, prl, err = CalculateNewVersion(breakingChange, "0.5.0", true) assert.NoError(t, err) assert.Equal(t, newVersion.String(), "0.6.0") - assert.Equal(t, BetaLabel, prl) + assert.Equal(t, BetaBreakingChangeLabel, prl) // additive with stable newVersion, prl, err = CalculateNewVersion(additiveChange, "0.5.0", false) diff --git a/eng/tools/generator/cmd/v2/common/generation.go b/eng/tools/generator/cmd/v2/common/generation.go index 6d5a408b220c..e892f5d8e6fb 100644 --- a/eng/tools/generator/cmd/v2/common/generation.go +++ b/eng/tools/generator/cmd/v2/common/generation.go @@ -51,6 +51,7 @@ type GenerateParam struct { SkipGenerateExample bool GoVersion string RemoveTagSet bool + ForceStableVersion bool } func (ctx *GenerateContext) GenerateForAutomation(readme, repo, goVersion string) ([]GenerateResult, []error) { @@ -173,7 +174,7 @@ func (ctx *GenerateContext) GenerateForSingleRPNamespace(generateParam *Generate } // add tag set - if !generateParam.RemoveTagSet && generateParam.NamespaceConfig != "" { + if !generateParam.RemoveTagSet && generateParam.NamespaceConfig != "" && !onBoard { log.Printf("Add tag in `autorest.md`...") autorestMdPath := filepath.Join(packagePath, "autorest.md") if err := AddTagSet(autorestMdPath, generateParam.NamespaceConfig); err != nil { @@ -194,6 +195,18 @@ func (ctx *GenerateContext) GenerateForSingleRPNamespace(generateParam *Generate return nil, err } + if isCurrentPreview && generateParam.ForceStableVersion { + tag, err := GetTag(filepath.Join(packagePath, "autorest.md")) + if err != nil { + return nil, err + } + if tag != "" { + if !strings.Contains(tag, "preview") { + isCurrentPreview = false + } + } + } + if !onBoard { log.Printf("Get ori exports for changelog generation...") @@ -298,6 +311,23 @@ func (ctx *GenerateContext) GenerateForSingleRPNamespace(generateParam *Generate return nil, err } + if changelog.HasBreakingChanges() && isGenerateFake(packagePath) { + log.Printf("Replace fake module v2+...") + if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, previousVersion, version.String(), + "fake", "_server.go"); err != nil { + return nil, err + } + } + + // When sdk has major version bump, the live test needs to update the module referenced in the code. + if changelog.HasBreakingChanges() && existSuffixFile(packagePath, "_live_test.go") { + log.Printf("Replace live test module v2+...") + if err = replaceModuleImport(packagePath, generateParam.RPName, generateParam.NamespaceName, previousVersion, version.String(), + "", "_live_test.go"); err != nil { + return nil, err + } + } + // Example generation should be the last step because the package import relay on the new calculated version if !generateParam.SkipGenerateExample { log.Printf("Generate examples...") diff --git a/eng/tools/generator/cmd/v2/release/releaseCmd.go b/eng/tools/generator/cmd/v2/release/releaseCmd.go index 4b4a96e4d753..60c15ab7d5f2 100644 --- a/eng/tools/generator/cmd/v2/release/releaseCmd.go +++ b/eng/tools/generator/cmd/v2/release/releaseCmd.go @@ -75,6 +75,7 @@ type Flags struct { GoVersion string Token string UpdateSpecVersion bool + ForceStableVersion bool } func BindFlags(flagSet *pflag.FlagSet) { @@ -90,6 +91,7 @@ func BindFlags(flagSet *pflag.FlagSet) { flagSet.String("go-version", "1.18", "Go version") flagSet.StringP("token", "t", "", "Specify the personal access token of Github") flagSet.Bool("update-spec-version", true, "Whether to update the commit id, the default is true") + flagSet.Bool("force-stable-version", false, "Even if input-files contains preview files, they are forced to be generated as stable versions. At the same time, the tag must not contain preview.") } func ParseFlags(flagSet *pflag.FlagSet) Flags { @@ -106,6 +108,7 @@ func ParseFlags(flagSet *pflag.FlagSet) Flags { GoVersion: flags.GetString(flagSet, "go-version"), Token: flags.GetString(flagSet, "token"), UpdateSpecVersion: flags.GetBool(flagSet, "update-spec-version"), + ForceStableVersion: flags.GetBool(flagSet, "force-stable-version"), } } @@ -157,6 +160,7 @@ func (c *commandContext) generate(sdkRepo repo.SDKRepository, specCommitHash str ReleaseDate: c.flags.ReleaseDate, SkipGenerateExample: c.flags.SkipGenerateExample, GoVersion: c.flags.GoVersion, + ForceStableVersion: c.flags.ForceStableVersion, }) if err != nil { return fmt.Errorf("failed to finish release generation process: %+v", err) @@ -183,6 +187,7 @@ func (c *commandContext) generate(sdkRepo repo.SDKRepository, specCommitHash str } func (c *commandContext) generateFromRequest(sdkRepo repo.SDKRepository, specRepoParam, specCommitHash string) error { + var generateErr []error var pullRequestUrls = make(map[string]string) var pushBranch = make(map[string]struct { requestLink string @@ -220,7 +225,8 @@ func (c *commandContext) generateFromRequest(sdkRepo repo.SDKRepository, specRep } err = c.generate(sdkRepo, specCommitHash) if err != nil { - return err + generateErr = append(generateErr, err) + continue } // get current branch name @@ -289,5 +295,12 @@ func (c *commandContext) generateFromRequest(sdkRepo repo.SDKRepository, specRep } } + if len(generateErr) != 0 { + fmt.Println("generator error:") + for _, e := range generateErr { + fmt.Println(e) + } + } + return nil } diff --git a/eng/tools/generator/template/rpName/packageName/README.md.tpl b/eng/tools/generator/template/rpName/packageName/README.md.tpl index a907bff3ba5a..5b1302fb2758 100644 --- a/eng/tools/generator/template/rpName/packageName/README.md.tpl +++ b/eng/tools/generator/template/rpName/packageName/README.md.tpl @@ -49,7 +49,7 @@ options := arm.ClientOptions { Cloud: cloud.AzureChina, }, } -client, err := {{packageName}}.NewClientFactory(, cred, &options) +clientFactory, err := {{packageName}}.NewClientFactory(, cred, &options) ``` ## Clients diff --git a/eng/tools/internal/report/packages.go b/eng/tools/internal/report/packages.go index 3a737f458803..d7f622295624 100644 --- a/eng/tools/internal/report/packages.go +++ b/eng/tools/internal/report/packages.go @@ -123,17 +123,13 @@ func (c *CommitPkgsReport) UpdateAffectedPackages(commit string, r PkgsReport) { c.AffectedPackages = map[string]PkgsList{} } - for _, pkg := range r.AddedPackages { - c.AffectedPackages[commit] = append(c.AffectedPackages[commit], pkg) - } + c.AffectedPackages[commit] = append(c.AffectedPackages[commit], r.AddedPackages...) for pkgName := range r.ModifiedPackages { c.AffectedPackages[commit] = append(c.AffectedPackages[commit], pkgName) } - for _, pkg := range r.RemovedPackages { - c.AffectedPackages[commit] = append(c.AffectedPackages[commit], pkg) - } + c.AffectedPackages[commit] = append(c.AffectedPackages[commit], r.RemovedPackages...) } // PkgsReport represents a complete report of added, removed, and modified packages diff --git a/eng/tools/mgmtreport/mgmtreport.tpl b/eng/tools/mgmtreport/mgmtreport.tpl index 267998a4b506..1c8055c24cfb 100644 --- a/eng/tools/mgmtreport/mgmtreport.tpl +++ b/eng/tools/mgmtreport/mgmtreport.tpl @@ -4,7 +4,11 @@ Azure GO SDK MGMT REPORT - + + + + +