Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
bf65abc
Avoid @//
pcj Oct 9, 2025
63a0ce3
Merge remote-tracking branch 'refs/remotes/origin/master'
pcj Nov 23, 2025
8e0b4fc
Initial symbol extension
pcj Nov 23, 2025
aa5f356
Initial starlarkbundle lang
pcj Nov 23, 2025
0132f9f
Add starlark_bundle rule
pcj Nov 23, 2025
88af418
checkpoint: bazel_lib as starlark_repository actually builds!
pcj Nov 24, 2025
c88be12
checkpoint
pcj Nov 26, 2025
2c900b7
checkpoint: before remove starlark_library gen
pcj Nov 28, 2025
350fa87
checkpoint: refactored for reduced scope
pcj Nov 30, 2025
171ef6d
Cleanup starlark_library.bzl
pcj Nov 30, 2025
d96a7b3
refactor: generate package-level rules and aggegate deps at roots
pcj Dec 6, 2025
b770c9a
refactor extension with starlark_module and starlark_module_library
pcj Dec 6, 2025
3bcf945
checkpoint functioning version
pcj Dec 13, 2025
1e56b00
Merge remote-tracking branch 'origin/master' into stardoc
pcj May 9, 2026
66bf261
post-merge fix
pcj May 9, 2026
6d6b24a
starlark_repository: add .local() tag class for on-disk repos
pcj May 9, 2026
721e152
buildifier.fix
pcj May 9, 2026
ab383bb
starlark_repository: capture upstream BUILD files as starlark_package…
pcj May 19, 2026
291cb1d
fix(protoc): support boolean attrs from Starlark rules
pcj Jul 31, 2026
f4af51b
Merge remote-tracking branch 'refs/remotes/origin/master'
pcj Jul 31, 2026
72db31c
Merge branch 'master' into stardoc
pcj Aug 1, 2026
cccc367
Merge branch 'master' into stardoc
pcj Sep 8, 2026
c7c3ea2
feat: add -starlarkrepository_canonical_repo_name to deal with //cond…
pcj Sep 8, 2026
918b7fa
fix: buildifier
pcj Sep 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added WORKSPACE
Empty file.
1 change: 1 addition & 0 deletions cmd/gazelle/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ go_library(
"//cmd/gazelle/internal/wspace",
"//language/proto_go_modules",
"//language/protobuf",
"//language/starlarkrepository",
"@bazel_gazelle//config",
"@bazel_gazelle//flag",
"@bazel_gazelle//label",
Expand Down
2 changes: 2 additions & 0 deletions cmd/gazelle/langs.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,13 @@ import (
"github.com/bazelbuild/bazel-gazelle/language/proto"
"github.com/stackb/rules_proto/v4/language/proto_go_modules"
"github.com/stackb/rules_proto/v4/language/protobuf"
"github.com/stackb/rules_proto/v4/language/starlarkrepository"
)

var languages = []language.Language{
proto.NewLanguage(),
protobuf.NewLanguage(),
golang.NewLanguage(),
proto_go_modules.NewLanguage(),
starlarkrepository.NewLanguage(),
}
14 changes: 14 additions & 0 deletions cmd/preserve_packages/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")

go_library(
name = "preserve_packages_lib",
srcs = ["main.go"],
importpath = "github.com/stackb/rules_proto/v4/cmd/preserve_packages",
visibility = ["//visibility:private"],
)

go_binary(
name = "preserve_packages",
embed = [":preserve_packages_lib"],
visibility = ["//visibility:public"],
)
69 changes: 69 additions & 0 deletions cmd/preserve_packages/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// preserve_packages walks a fetched external repository and rewrites the
// upstream files that fetch_repo -clean would otherwise delete. BUILD and
// BUILD.bazel are renamed to BUILD.package / BUILD.bazel.package so the
// starlarkrepository gazelle extension can capture them as starlark_package
// rules; everything else fetch_repo -clean removes (MODULE.bazel,
// WORKSPACE, …) is deleted outright.
//
// Intended to be invoked from rules/proto/proto_repository.bzl when
// build_file_generation = "preserve".
package main

import (
"flag"
"fmt"
"io/fs"
"log"
"os"
"path/filepath"
)

var renameMap = map[string]string{
"BUILD": "BUILD.package",
"BUILD.bazel": "BUILD.bazel.package",
}

var deleteSet = map[string]bool{
"MODULE.bazel": true,
"MODULE.bazel.lock": true,
"WORKSPACE": true,
"WORKSPACE.bazel": true,
"WORKSPACE.bzlmod": true,
}

func main() {
root := flag.String("root", "", "repo root to walk (required)")
flag.Parse()
if *root == "" {
log.Fatal("preserve_packages: -root is required")
}

if err := run(*root); err != nil {
log.Fatalf("preserve_packages: %v", err)
}
}

func run(root string) error {
return filepath.Walk(root, func(path string, info fs.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
name := info.Name()
if dst, ok := renameMap[name]; ok {
target := filepath.Join(filepath.Dir(path), dst)
if err := os.Rename(path, target); err != nil {
return fmt.Errorf("rename %s -> %s: %w", path, target, err)
}
return nil
}
if deleteSet[name] {
if err := os.Remove(path); err != nil {
return fmt.Errorf("remove %s: %w", path, err)
}
}
return nil
})
}
149 changes: 149 additions & 0 deletions extensions/starlark_repository.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
"""proto_repostitory.bzl provides the starlark_repository rule."""

# Copyright 2014 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

load("@bazel_features//:features.bzl", "bazel_features")
load("@build_stack_rules_proto//rules/proto:starlark_repository.bzl", "starlark_repository_attrs", starlark_repository_repo_rule = "starlark_repository")

def _extension_metadata(
module_ctx,
*,
root_module_direct_deps = None,
root_module_direct_dev_deps = None,
reproducible = False):
"""returns the module_ctx.extension_metadata in a bazel-version-aware way

This function was copied from the bazel-gazelle repository.
"""

if not hasattr(module_ctx, "extension_metadata"):
return None
metadata_kwargs = {}
if bazel_features.external_deps.extension_metadata_has_reproducible:
metadata_kwargs["reproducible"] = reproducible
return module_ctx.extension_metadata(
root_module_direct_deps = root_module_direct_deps,
root_module_direct_dev_deps = root_module_direct_dev_deps,
**metadata_kwargs
)

def _default_preserve(kwargs):
"""Sets build_file_generation = "preserve" by default.

starlark_repository exists specifically to capture upstream module
contents for introspection. The "preserve" mode is the only mode that
produces the starlark_package_library aggregator, so it's the desired
default. Users can still override (e.g. to "on" or "clean") by passing
build_file_generation explicitly on the tag.
"""
if not kwargs.get("build_file_generation"):
kwargs["build_file_generation"] = "preserve"

def _starlark_repository_impl(module_ctx):
# named_archives / named_locals are dicts<K,V> where V is the kwargs for
# the underlying "starlark_repository" repo rule and K is the tag.name
# (the name given by the MODULE.bazel author).
named_archives = {}
named_locals = {}

# iterate all the module tags and gather a list of named repos.
#
# TODO(pcj): what is the best practice for version selection here? Do I need
# to check if module.is_root and handle that differently?
#
for module in module_ctx.modules:
for tag in module.tags.archive:
kwargs = {
attr: getattr(tag, attr)
for attr in _starlark_repository_archive_attrs.keys()
if hasattr(tag, attr)
}
_default_preserve(kwargs)
named_archives[tag.name] = kwargs
for tag in module.tags.local:
kwargs = {
attr: getattr(tag, attr)
for attr in _starlark_repository_local_attrs.keys()
if hasattr(tag, attr)
}

# The user-facing attr is "path"; the underlying repo rule expects
# "local_path" (a sibling of "urls" / "commit" / "version").
kwargs["local_path"] = kwargs.pop("path")
_default_preserve(kwargs)
named_locals[tag.name] = kwargs

# declare a repository rule foreach one
for apparent_name, kwargs in named_archives.items():
starlark_repository_repo_rule(
apparent_name = apparent_name,
**kwargs
)
for apparent_name, kwargs in named_locals.items():
starlark_repository_repo_rule(
apparent_name = apparent_name,
**kwargs
)

return _extension_metadata(
module_ctx,
reproducible = True,
)

_starlark_repository_archive_attrs = starlark_repository_attrs | {
"name": attr.string(
doc = "The repo name.",
mandatory = True,
),
}
_starlark_repository_archive_attrs.pop("apparent_name")

# Attrs for the .local() tag class. Excludes archive-only attrs (urls, sha256,
# strip_prefix, type, integrity, canonical_id, auth_patterns, commit, tag,
# vcs, remote, version, sum, replace) and instead takes a single `path`
# (mapped to the underlying rule's `local_path`).
_starlark_repository_local_attrs = {
"name": attr.string(
doc = "The repo name.",
mandatory = True,
),
"path": attr.string(
doc = "Filesystem path (workspace-relative or absolute) to the repository contents.",
mandatory = True,
),
"build_directives": attr.string_list(),
"build_file_generation": attr.string(),
"languages": attr.string_list(),
"cfgs": attr.label_list(allow_files = True),
"imports": attr.label_list(allow_files = True),
"imports_out": attr.string(default = "imports.csv"),
"deleted_files": attr.string_list(),
"reresolve_known_proto_imports": attr.bool(),
"importpath": attr.string(),
}

starlark_repository = module_extension(
implementation = _starlark_repository_impl,
tag_classes = dict(
archive = tag_class(
doc = "declare an http_archive repository that is post-processed by a custom version of gazelle that includes the 'protobuf' language",
attrs = _starlark_repository_archive_attrs,
),
local = tag_class(
doc = "declare a local-path repository that is post-processed by gazelle's starlarkrepository language. Useful when the source already lives on disk (e.g. a git submodule) and we want to avoid network fetches.",
attrs = _starlark_repository_local_attrs,
),
),
)
4 changes: 0 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,11 @@ require (
require (
github.com/bmatcuk/doublestar/v4 v4.9.1 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/golang/mock v1.7.0-rc.1 // indirect
github.com/golang/protobuf v1.5.4 // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/tools v0.35.0 // indirect
golang.org/x/tools/go/vcs v0.1.0-deprecated // indirect
google.golang.org/genproto v0.0.0-20250115164207-1a7da9e5054f // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
)
33 changes: 0 additions & 33 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,19 +1,11 @@
github.com/bazelbuild/bazel-gazelle v0.45.0 h1:ZfbDRyNppw0Sd42lXVX7ybar63MJofb58Yvl4SvbtYY=
github.com/bazelbuild/bazel-gazelle v0.45.0/go.mod h1:XdBdWhrTc5x50CKzKXOcwrZWdLuX58IX1KcSaWPtEGo=
github.com/bazelbuild/bazel-gazelle v0.47.0 h1:g3Rr1ZbkC1Pk20aOgBITxSD/efS1WbaSty5jC786Z3Q=
github.com/bazelbuild/bazel-gazelle v0.47.0/go.mod h1:8Ozf20jhv+in87nCUHdmUPPcVGTfKg/gotZ/hce3T+w=
github.com/bazelbuild/buildtools v0.0.0-20250826111327-4006b543a694 h1:LiKs9FsSfMx3NomNclXYkv9enY77oft5Mc/vX/AKHgI=
github.com/bazelbuild/buildtools v0.0.0-20250826111327-4006b543a694/go.mod h1:PLNUetjLa77TCCziPsz0EI8a6CUxgC+1jgmWv0H25tg=
github.com/bazelbuild/buildtools v0.0.0-20250930140053-2eb4fccefb52 h1:njQAmjTv/YHRm/0Lfv9DXHFZ4MdT2IA/RKHTnqZkgDw=
github.com/bazelbuild/buildtools v0.0.0-20250930140053-2eb4fccefb52/go.mod h1:PLNUetjLa77TCCziPsz0EI8a6CUxgC+1jgmWv0H25tg=
github.com/bazelbuild/rules_go v0.57.0 h1:qBFxjy29iJg22xWlu5A3mNwrXtCHiEnHcIt91SsiFGU=
github.com/bazelbuild/rules_go v0.57.0/go.mod h1:Pn30cb4M513fe2rQ6GiJ3q8QyrRsgC7zhuDvi50Lw4Y=
github.com/bazelbuild/rules_go v0.59.0 h1:RLhOwYIqeMgBpKelHEWTfIPjA37so3oa/rX+/qqq/P4=
github.com/bazelbuild/rules_go v0.59.0/go.mod h1:Pn30cb4M513fe2rQ6GiJ3q8QyrRsgC7zhuDvi50Lw4Y=
github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0=
github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE=
github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q=
github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
github.com/bmatcuk/doublestar/v4 v4.9.1 h1:X8jg9rRZmJd4yRy7ZeNDRnM+T3ZfHv15JiBJ/avrEXE=
github.com/bmatcuk/doublestar/v4 v4.9.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
Expand All @@ -26,8 +18,6 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U=
github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
Expand All @@ -42,7 +32,6 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
Expand All @@ -62,52 +51,32 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
golang.org/x/tools/go/vcs v0.1.0-deprecated h1:cOIJqWBl99H1dH5LWizPa+0ImeeJq3t3cJjaeOWUAL4=
golang.org/x/tools/go/vcs v0.1.0-deprecated/go.mod h1:zUrvATBAvEI9535oC0yWYsLsHIV4Z7g63sNPVMtuBy8=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
Expand All @@ -116,8 +85,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/genproto v0.0.0-20250115164207-1a7da9e5054f h1:387Y+JbxF52bmesc8kq1NyYIp33dnxCw6eiA7JMsTmw=
google.golang.org/genproto v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:0joYwWwLQh18AOj8zMYeZLjzuqcYTU3/nC5JdCvC3JI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI=
Expand Down
Loading
Loading