PathrockNetwork Gno Explorer
HomeBlocksTransactionsTokensRealmsPackagesValidatorsAnalytics

PathrockNetwork Gno Explorer — an independent explorer for Gno.land Mainnet (gnoland-1), operated by PathrockNetwork. Not an official Gno.land service.

gnowebarchive RPC

gno.land/p/moul/gnopm/v0

Package
Open in gnoweb ↗

Overview

Kind
Pure package
Name
v0
Namespace
moul / gnopm
Files
10 (README)(gnomod.toml)
Exported functions
n/a — not supported for pure packages by the node (vm/qfuncs)
Module
gno.land/p/moul/gnopm/v0
gno
0.9

Files (10)

  • README.mdmarkdown
  • gnomod.tomltoml
  • errors.gnogno
  • pkgpath.gnogno
  • registry.gnogno
  • validate.gnogno
  • helpers_test.gnogno
  • pkgpath_test.gnogno
  • registry_test.gnogno
  • validate_test.gnogno
  • validate_test.gnogno
    1package gnopm23import (4	"strings"5	"testing"67	"gno.land/p/nt/uassert/v0"8

    Functions

    not supported for pure packages by the node (vm/qfuncs)

    Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.

    )
    9
    10func TestValidCommit(t *testing.T) {
    11 sha1 := strings.Repeat("a", 40)
    12 sha256 := strings.Repeat("0", 64)
    13 cases := []struct {
    14 name string
    15 in string
    16 want bool
    17 }{
    18 {"sha1", sha1, true},
    19 {"sha256", sha256, true},
    20 {"mixed hex", "0123456789abcdef0123456789abcdef01234567", true},
    21 {"empty", "", false},
    22 {"too short", strings.Repeat("a", 39), false},
    23 {"between the two lengths", strings.Repeat("a", 41), false},
    24 {"uppercase", strings.Repeat("A", 40), false},
    25 {"non hex", strings.Repeat("g", 40), false},
    26 {"abbreviated", "0123456", false},
    27 }
    28 for _, tc := range cases {
    29 uassert.Equal(t, tc.want, ValidCommit(tc.in), tc.name)
    30 }
    31}
    32
    33func TestValidRepo(t *testing.T) {
    34 cases := []struct {
    35 name string
    36 in string
    37 want bool
    38 }{
    39 {"github", "https://github.com/gnolang/gno", true},
    40 {"no path", "https://example.com", true},
    41 {"trailing slash", "https://example.com/x/", true},
    42 {"port is not a host character here", "https://example.com:8443/x", false},
    43
    44 {"empty", "", false},
    45 {"http", "http://github.com/gnolang/gno", false},
    46 {"git scheme", "git://github.com/gnolang/gno", false},
    47 {"ssh scheme", "ssh://git@github.com/gnolang/gno", false},
    48 {"javascript", "javascript:alert(1)", false},
    49 {"data url", "data:text/html,<script>", false},
    50 {"scheme relative", "//github.com/gnolang/gno", false},
    51 {"no host", "https:///gnolang/gno", false},
    52 {"bare host with no dot", "https://localhost/x", false},
    53 {"userinfo disguise", "https://github.com@evil.example/gnolang/gno", false},
    54 {"parent traversal", "https://example.com/../x", false},
    55 {"space", "https://example.com/a b", false},
    56 {"markdown link break-out", "https://example.com/a)[x](y", false},
    57 {"newline", "https://example.com/a\nb", false},
    58 {"bidi override", "https://example.com/a‮b", false},
    59 }
    60 for _, tc := range cases {
    61 uassert.Equal(t, tc.want, ValidRepo(tc.in), tc.name)
    62 }
    63}
    64
    65func TestValidDir(t *testing.T) {
    66 cases := []struct {
    67 name string
    68 in string
    69 want bool
    70 }{
    71 {"repo root", "", true},
    72 {"one element", "examples", true},
    73 {"nested", "examples/gno.land/p/nt/avl", true},
    74 {"dots in a name", "p/moul.io/x", true},
    75
    76 {"absolute", "/examples", false},
    77 {"trailing slash", "examples/", false},
    78 {"empty element", "a//b", false},
    79 {"dot element", "a/./b", false},
    80 {"parent traversal", "a/../b", false},
    81 {"backslash", "a\\b", false},
    82 {"space", "a b", false},
    83 }
    84 for _, tc := range cases {
    85 uassert.Equal(t, tc.want, ValidDir(tc.in), tc.name)
    86 }
    87}
    88
    89func TestValidRef(t *testing.T) {
    90 cases := []struct {
    91 name string
    92 in string
    93 want bool
    94 }{
    95 {"absent is legal", "", true},
    96 {"branch", "refs/heads/main", true},
    97 {"tag", "refs/tags/v1.2.0", true},
    98
    99 {"unqualified branch", "main", false},
    100 {"double dot", "refs/heads/a..b", false},
    101 {"reflog syntax", "refs/heads/a@{1}", false},
    102 {"trailing slash", "refs/heads/", false},
    103 {"lock suffix", "refs/heads/main.lock", false},
    104 {"leading dot", "refs/heads/.hidden", false},
    105 {"caret", "refs/heads/a^b", false},
    106 {"space", "refs/heads/a b", false},
    107
    108 // Narrower than git on purpose: these are legal ref names that would
    109 // break out of a markdown table cell or an inline-code span, and every
    110 // other field in this package is an allowlist so that no consumer has
    111 // to escape anything.
    112 {"pipe breaks a table cell", "refs/heads/a|b", false},
    113 {"backtick breaks a code span", "refs/heads/a`b", false},
    114 {"brackets open a link", "refs/heads/a[b]c", false},
    115 {"parens close a link", "refs/heads/a(b)c", false},
    116 {"hash opens a heading", "refs/heads/a#b", false},
    117 }
    118 for _, tc := range cases {
    119 uassert.Equal(t, tc.want, ValidRef(tc.in), tc.name)
    120 }
    121}
    122