ruby-paseto 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +8 -0
  3. data/CODE_OF_CONDUCT.md +84 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +549 -0
  6. data/lib/paseto/asn1/algorithm_identifier.rb +17 -0
  7. data/lib/paseto/asn1/curve_private_key.rb +22 -0
  8. data/lib/paseto/asn1/ec_private_key.rb +27 -0
  9. data/lib/paseto/asn1/ecdsa_full_r.rb +26 -0
  10. data/lib/paseto/asn1/ecdsa_sig_value.rb +23 -0
  11. data/lib/paseto/asn1/ecdsa_signature.rb +49 -0
  12. data/lib/paseto/asn1/ed25519_identifier.rb +15 -0
  13. data/lib/paseto/asn1/named_curve.rb +17 -0
  14. data/lib/paseto/asn1/one_asymmetric_key.rb +32 -0
  15. data/lib/paseto/asn1/private_key.rb +17 -0
  16. data/lib/paseto/asn1/private_key_algorithm_identifier.rb +17 -0
  17. data/lib/paseto/asn1/public_key.rb +17 -0
  18. data/lib/paseto/asn1/subject_public_key_info.rb +28 -0
  19. data/lib/paseto/asn1.rb +101 -0
  20. data/lib/paseto/asymmetric_key.rb +100 -0
  21. data/lib/paseto/configuration/box.rb +23 -0
  22. data/lib/paseto/configuration/decode_configuration.rb +68 -0
  23. data/lib/paseto/configuration.rb +18 -0
  24. data/lib/paseto/interface/i_d.rb +23 -0
  25. data/lib/paseto/interface/key.rb +113 -0
  26. data/lib/paseto/interface/pbkd.rb +83 -0
  27. data/lib/paseto/interface/pie.rb +59 -0
  28. data/lib/paseto/interface/pke.rb +86 -0
  29. data/lib/paseto/interface/serializer.rb +19 -0
  30. data/lib/paseto/interface/version.rb +161 -0
  31. data/lib/paseto/interface/wrapper.rb +20 -0
  32. data/lib/paseto/operations/i_d.rb +48 -0
  33. data/lib/paseto/operations/id/i_dv3.rb +20 -0
  34. data/lib/paseto/operations/id/i_dv4.rb +20 -0
  35. data/lib/paseto/operations/pbkd/p_b_k_dv3.rb +85 -0
  36. data/lib/paseto/operations/pbkd/p_b_k_dv4.rb +94 -0
  37. data/lib/paseto/operations/pbkw.rb +73 -0
  38. data/lib/paseto/operations/pke/p_k_ev3.rb +97 -0
  39. data/lib/paseto/operations/pke/p_k_ev4.rb +95 -0
  40. data/lib/paseto/operations/pke.rb +57 -0
  41. data/lib/paseto/operations/wrap.rb +29 -0
  42. data/lib/paseto/paserk.rb +55 -0
  43. data/lib/paseto/paserk_types.rb +46 -0
  44. data/lib/paseto/protocol/version3.rb +100 -0
  45. data/lib/paseto/protocol/version4.rb +99 -0
  46. data/lib/paseto/result.rb +9 -0
  47. data/lib/paseto/serializer/optional_json.rb +30 -0
  48. data/lib/paseto/serializer/raw.rb +23 -0
  49. data/lib/paseto/sodium/curve_25519.rb +46 -0
  50. data/lib/paseto/sodium/safe_ed25519_loader.rb +19 -0
  51. data/lib/paseto/sodium/stream/base.rb +82 -0
  52. data/lib/paseto/sodium/stream/x_cha_cha20_xor.rb +31 -0
  53. data/lib/paseto/sodium.rb +5 -0
  54. data/lib/paseto/symmetric_key.rb +119 -0
  55. data/lib/paseto/token.rb +127 -0
  56. data/lib/paseto/token_types.rb +29 -0
  57. data/lib/paseto/util.rb +105 -0
  58. data/lib/paseto/v3/local.rb +63 -0
  59. data/lib/paseto/v3/public.rb +204 -0
  60. data/lib/paseto/v4/local.rb +56 -0
  61. data/lib/paseto/v4/public.rb +169 -0
  62. data/lib/paseto/validator.rb +154 -0
  63. data/lib/paseto/verifiers/footer.rb +30 -0
  64. data/lib/paseto/verifiers/payload.rb +42 -0
  65. data/lib/paseto/verify.rb +48 -0
  66. data/lib/paseto/version.rb +6 -0
  67. data/lib/paseto/versions.rb +25 -0
  68. data/lib/paseto/wrappers/pie/pie_v3.rb +72 -0
  69. data/lib/paseto/wrappers/pie/pie_v4.rb +72 -0
  70. data/lib/paseto/wrappers/pie.rb +71 -0
  71. data/lib/paseto.rb +99 -0
  72. data/paseto.gemspec +58 -0
  73. data/sorbet/config +3 -0
  74. data/sorbet/rbi/annotations/rainbow.rbi +269 -0
  75. data/sorbet/rbi/gems/ast@2.4.2.rbi +584 -0
  76. data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +1083 -0
  77. data/sorbet/rbi/gems/docile@1.4.0.rbi +376 -0
  78. data/sorbet/rbi/gems/ffi@1.15.5.rbi +1994 -0
  79. data/sorbet/rbi/gems/io-console@0.5.11.rbi +8 -0
  80. data/sorbet/rbi/gems/irb@1.5.1.rbi +342 -0
  81. data/sorbet/rbi/gems/json@2.6.3.rbi +1541 -0
  82. data/sorbet/rbi/gems/multi_json@1.15.0.rbi +267 -0
  83. data/sorbet/rbi/gems/netrc@0.11.0.rbi +158 -0
  84. data/sorbet/rbi/gems/oj@3.13.23.rbi +603 -0
  85. data/sorbet/rbi/gems/openssl@3.0.1.rbi +1735 -0
  86. data/sorbet/rbi/gems/parallel@1.22.1.rbi +277 -0
  87. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +407 -0
  88. data/sorbet/rbi/gems/rake@13.0.6.rbi +3021 -0
  89. data/sorbet/rbi/gems/rbnacl@7.1.1.rbi +3218 -0
  90. data/sorbet/rbi/gems/regexp_parser@2.6.1.rbi +3481 -0
  91. data/sorbet/rbi/gems/reline@0.3.1.rbi +8 -0
  92. data/sorbet/rbi/gems/rexml@3.2.5.rbi +4717 -0
  93. data/sorbet/rbi/gems/rspec-core@3.12.0.rbi +10887 -0
  94. data/sorbet/rbi/gems/rspec-expectations@3.12.0.rbi +8090 -0
  95. data/sorbet/rbi/gems/rspec-mocks@3.12.0.rbi +5300 -0
  96. data/sorbet/rbi/gems/rspec-support@3.12.0.rbi +1617 -0
  97. data/sorbet/rbi/gems/rspec@3.12.0.rbi +88 -0
  98. data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +1239 -0
  99. data/sorbet/rbi/gems/simplecov-html@0.12.3.rbi +219 -0
  100. data/sorbet/rbi/gems/simplecov@0.21.2.rbi +2135 -0
  101. data/sorbet/rbi/gems/simplecov_json_formatter@0.1.4.rbi +8 -0
  102. data/sorbet/rbi/gems/thor@1.2.1.rbi +3956 -0
  103. data/sorbet/rbi/gems/timecop@0.9.6.rbi +350 -0
  104. data/sorbet/rbi/gems/unicode-display_width@2.3.0.rbi +48 -0
  105. data/sorbet/rbi/gems/webrick@1.7.0.rbi +2555 -0
  106. data/sorbet/rbi/gems/yard-sorbet@0.7.0.rbi +391 -0
  107. data/sorbet/rbi/gems/yard@0.9.28.rbi +17816 -0
  108. data/sorbet/rbi/gems/zeitwerk@2.6.6.rbi +950 -0
  109. data/sorbet/rbi/shims/multi_json.rbi +19 -0
  110. data/sorbet/rbi/shims/openssl.rbi +111 -0
  111. data/sorbet/rbi/shims/rbnacl.rbi +65 -0
  112. data/sorbet/rbi/shims/zeitwerk.rbi +6 -0
  113. data/sorbet/rbi/todo.rbi +7 -0
  114. data/sorbet/tapioca/config.yml +30 -0
  115. data/sorbet/tapioca/require.rb +12 -0
  116. metadata +376 -0
@@ -0,0 +1,267 @@
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This is an autogenerated file for types exported from the `multi_json` gem.
5
+ # Please instead update this file by running `bin/tapioca gem multi_json`.
6
+
7
+ # source://multi_json//lib/multi_json/options.rb#1
8
+ module MultiJson
9
+ include ::MultiJson::Options
10
+ extend ::MultiJson::Options
11
+ extend ::MultiJson
12
+
13
+ # Get the current adapter class.
14
+ #
15
+ # source://multi_json//lib/multi_json.rb#70
16
+ def adapter; end
17
+
18
+ # Set the JSON parser utilizing a symbol, string, or class.
19
+ # Supported by default are:
20
+ #
21
+ # * <tt>:oj</tt>
22
+ # * <tt>:json_gem</tt>
23
+ # * <tt>:json_pure</tt>
24
+ # * <tt>:ok_json</tt>
25
+ # * <tt>:yajl</tt>
26
+ # * <tt>:nsjsonserialization</tt> (MacRuby only)
27
+ # * <tt>:gson</tt> (JRuby only)
28
+ # * <tt>:jr_jackson</tt> (JRuby only)
29
+ #
30
+ # source://multi_json//lib/multi_json.rb#90
31
+ def adapter=(new_adapter); end
32
+
33
+ # source://multi_json//lib/multi_json.rb#26
34
+ def cached_options(*_arg0); end
35
+
36
+ # source://multi_json//lib/multi_json.rb#129
37
+ def current_adapter(options = T.unsafe(nil)); end
38
+
39
+ # Decode a JSON string into Ruby.
40
+ #
41
+ # <b>Options</b>
42
+ #
43
+ # <tt>:symbolize_keys</tt> :: If true, will use symbols instead of strings for the keys.
44
+ # <tt>:adapter</tt> :: If set, the selected adapter will be used for this call.
45
+ #
46
+ # source://multi_json//lib/multi_json.rb#119
47
+ def decode(string, options = T.unsafe(nil)); end
48
+
49
+ # The default adapter based on what you currently
50
+ # have loaded and installed. First checks to see
51
+ # if any adapters are already loaded, then checks
52
+ # to see which are installed if none are loaded.
53
+ #
54
+ # source://multi_json//lib/multi_json.rb#46
55
+ def default_adapter; end
56
+
57
+ # The default adapter based on what you currently
58
+ # have loaded and installed. First checks to see
59
+ # if any adapters are already loaded, then checks
60
+ # to see which are installed if none are loaded.
61
+ #
62
+ # source://multi_json//lib/multi_json.rb#46
63
+ def default_engine; end
64
+
65
+ # source://multi_json//lib/multi_json.rb#18
66
+ def default_options; end
67
+
68
+ # source://multi_json//lib/multi_json.rb#11
69
+ def default_options=(value); end
70
+
71
+ # Encodes a Ruby object as JSON.
72
+ #
73
+ # source://multi_json//lib/multi_json.rb#138
74
+ def dump(object, options = T.unsafe(nil)); end
75
+
76
+ # Encodes a Ruby object as JSON.
77
+ #
78
+ # source://multi_json//lib/multi_json.rb#138
79
+ def encode(object, options = T.unsafe(nil)); end
80
+
81
+ # Get the current adapter class.
82
+ #
83
+ # source://multi_json//lib/multi_json.rb#70
84
+ def engine; end
85
+
86
+ # Set the JSON parser utilizing a symbol, string, or class.
87
+ # Supported by default are:
88
+ #
89
+ # * <tt>:oj</tt>
90
+ # * <tt>:json_gem</tt>
91
+ # * <tt>:json_pure</tt>
92
+ # * <tt>:ok_json</tt>
93
+ # * <tt>:yajl</tt>
94
+ # * <tt>:nsjsonserialization</tt> (MacRuby only)
95
+ # * <tt>:gson</tt> (JRuby only)
96
+ # * <tt>:jr_jackson</tt> (JRuby only)
97
+ #
98
+ # source://multi_json//lib/multi_json.rb#90
99
+ def engine=(new_adapter); end
100
+
101
+ # Decode a JSON string into Ruby.
102
+ #
103
+ # <b>Options</b>
104
+ #
105
+ # <tt>:symbolize_keys</tt> :: If true, will use symbols instead of strings for the keys.
106
+ # <tt>:adapter</tt> :: If set, the selected adapter will be used for this call.
107
+ #
108
+ # source://multi_json//lib/multi_json.rb#119
109
+ def load(string, options = T.unsafe(nil)); end
110
+
111
+ # source://multi_json//lib/multi_json.rb#98
112
+ def load_adapter(new_adapter); end
113
+
114
+ # source://multi_json//lib/multi_json.rb#26
115
+ def reset_cached_options!(*_arg0); end
116
+
117
+ # Set the JSON parser utilizing a symbol, string, or class.
118
+ # Supported by default are:
119
+ #
120
+ # * <tt>:oj</tt>
121
+ # * <tt>:json_gem</tt>
122
+ # * <tt>:json_pure</tt>
123
+ # * <tt>:ok_json</tt>
124
+ # * <tt>:yajl</tt>
125
+ # * <tt>:nsjsonserialization</tt> (MacRuby only)
126
+ # * <tt>:gson</tt> (JRuby only)
127
+ # * <tt>:jr_jackson</tt> (JRuby only)
128
+ #
129
+ # source://multi_json//lib/multi_json.rb#90
130
+ def use(new_adapter); end
131
+
132
+ # Executes passed block using specified adapter.
133
+ #
134
+ # source://multi_json//lib/multi_json.rb#144
135
+ def with_adapter(new_adapter); end
136
+
137
+ # Executes passed block using specified adapter.
138
+ #
139
+ # source://multi_json//lib/multi_json.rb#144
140
+ def with_engine(new_adapter); end
141
+
142
+ private
143
+
144
+ # source://multi_json//lib/multi_json.rb#155
145
+ def load_adapter_from_string_name(name); end
146
+ end
147
+
148
+ # source://multi_json//lib/multi_json.rb#31
149
+ MultiJson::ALIASES = T.let(T.unsafe(nil), Hash)
150
+
151
+ # source://multi_json//lib/multi_json/adapter_error.rb#2
152
+ class MultiJson::AdapterError < ::ArgumentError
153
+ # Returns the value of attribute cause.
154
+ #
155
+ # source://multi_json//lib/multi_json/adapter_error.rb#3
156
+ def cause; end
157
+
158
+ class << self
159
+ # source://multi_json//lib/multi_json/adapter_error.rb#5
160
+ def build(original_exception); end
161
+ end
162
+ end
163
+
164
+ # Legacy support
165
+ #
166
+ # source://multi_json//lib/multi_json/parse_error.rb#16
167
+ MultiJson::DecodeError = MultiJson::ParseError
168
+
169
+ # source://multi_json//lib/multi_json/parse_error.rb#16
170
+ MultiJson::LoadError = MultiJson::ParseError
171
+
172
+ # source://multi_json//lib/multi_json/options.rb#2
173
+ module MultiJson::Options
174
+ # source://multi_json//lib/multi_json/options.rb#25
175
+ def default_dump_options; end
176
+
177
+ # source://multi_json//lib/multi_json/options.rb#21
178
+ def default_load_options; end
179
+
180
+ # source://multi_json//lib/multi_json/options.rb#17
181
+ def dump_options(*args); end
182
+
183
+ # source://multi_json//lib/multi_json/options.rb#8
184
+ def dump_options=(options); end
185
+
186
+ # source://multi_json//lib/multi_json/options.rb#13
187
+ def load_options(*args); end
188
+
189
+ # source://multi_json//lib/multi_json/options.rb#3
190
+ def load_options=(options); end
191
+
192
+ private
193
+
194
+ # source://multi_json//lib/multi_json/options.rb#31
195
+ def get_options(options, *args); end
196
+ end
197
+
198
+ # source://multi_json//lib/multi_json/options_cache.rb#2
199
+ module MultiJson::OptionsCache
200
+ extend ::MultiJson::OptionsCache
201
+
202
+ # source://multi_json//lib/multi_json/options_cache.rb#10
203
+ def fetch(type, key, &block); end
204
+
205
+ # source://multi_json//lib/multi_json/options_cache.rb#5
206
+ def reset; end
207
+
208
+ private
209
+
210
+ # source://multi_json//lib/multi_json/options_cache.rb#24
211
+ def write(cache, key); end
212
+ end
213
+
214
+ # Normally MultiJson is used with a few option sets for both dump/load
215
+ # methods. When options are generated dynamically though, every call would
216
+ # cause a cache miss and the cache would grow indefinitely. To prevent
217
+ # this, we just reset the cache every time the number of keys outgrows
218
+ # 1000.
219
+ #
220
+ # source://multi_json//lib/multi_json/options_cache.rb#22
221
+ MultiJson::OptionsCache::MAX_CACHE_SIZE = T.let(T.unsafe(nil), Integer)
222
+
223
+ # source://multi_json//lib/multi_json/parse_error.rb#2
224
+ class MultiJson::ParseError < ::StandardError
225
+ # Returns the value of attribute cause.
226
+ #
227
+ # source://multi_json//lib/multi_json/parse_error.rb#3
228
+ def cause; end
229
+
230
+ # Returns the value of attribute data.
231
+ #
232
+ # source://multi_json//lib/multi_json/parse_error.rb#3
233
+ def data; end
234
+
235
+ class << self
236
+ # source://multi_json//lib/multi_json/parse_error.rb#5
237
+ def build(original_exception, data); end
238
+ end
239
+ end
240
+
241
+ # source://multi_json//lib/multi_json.rb#33
242
+ MultiJson::REQUIREMENT_MAP = T.let(T.unsafe(nil), Array)
243
+
244
+ # source://multi_json//lib/multi_json/version.rb#16
245
+ MultiJson::VERSION = T.let(T.unsafe(nil), String)
246
+
247
+ # source://multi_json//lib/multi_json/version.rb#2
248
+ class MultiJson::Version
249
+ class << self
250
+ # @return [String]
251
+ #
252
+ # source://multi_json//lib/multi_json/version.rb#10
253
+ def to_s; end
254
+ end
255
+ end
256
+
257
+ # source://multi_json//lib/multi_json/version.rb#3
258
+ MultiJson::Version::MAJOR = T.let(T.unsafe(nil), Integer)
259
+
260
+ # source://multi_json//lib/multi_json/version.rb#4
261
+ MultiJson::Version::MINOR = T.let(T.unsafe(nil), Integer)
262
+
263
+ # source://multi_json//lib/multi_json/version.rb#5
264
+ MultiJson::Version::PATCH = T.let(T.unsafe(nil), Integer)
265
+
266
+ # source://multi_json//lib/multi_json/version.rb#6
267
+ MultiJson::Version::PRE = T.let(T.unsafe(nil), T.untyped)
@@ -0,0 +1,158 @@
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This is an autogenerated file for types exported from the `netrc` gem.
5
+ # Please instead update this file by running `bin/tapioca gem netrc`.
6
+
7
+ # source://netrc//lib/netrc.rb#3
8
+ class Netrc
9
+ # @return [Netrc] a new instance of Netrc
10
+ #
11
+ # source://netrc//lib/netrc.rb#166
12
+ def initialize(path, data); end
13
+
14
+ # source://netrc//lib/netrc.rb#180
15
+ def [](k); end
16
+
17
+ # source://netrc//lib/netrc.rb#188
18
+ def []=(k, info); end
19
+
20
+ # source://netrc//lib/netrc.rb#200
21
+ def delete(key); end
22
+
23
+ # source://netrc//lib/netrc.rb#211
24
+ def each(&block); end
25
+
26
+ # source://netrc//lib/netrc.rb#196
27
+ def length; end
28
+
29
+ # source://netrc//lib/netrc.rb#215
30
+ def new_item(m, l, p); end
31
+
32
+ # Returns the value of attribute new_item_prefix.
33
+ #
34
+ # source://netrc//lib/netrc.rb#178
35
+ def new_item_prefix; end
36
+
37
+ # Sets the attribute new_item_prefix
38
+ #
39
+ # @param value the value to set the attribute new_item_prefix to.
40
+ #
41
+ # source://netrc//lib/netrc.rb#178
42
+ def new_item_prefix=(_arg0); end
43
+
44
+ # source://netrc//lib/netrc.rb#219
45
+ def save; end
46
+
47
+ # source://netrc//lib/netrc.rb#233
48
+ def unparse; end
49
+
50
+ class << self
51
+ # source://netrc//lib/netrc.rb#42
52
+ def check_permissions(path); end
53
+
54
+ # source://netrc//lib/netrc.rb#33
55
+ def config; end
56
+
57
+ # @yield [self.config]
58
+ #
59
+ # source://netrc//lib/netrc.rb#37
60
+ def configure; end
61
+
62
+ # source://netrc//lib/netrc.rb#10
63
+ def default_path; end
64
+
65
+ # source://netrc//lib/netrc.rb#14
66
+ def home_path; end
67
+
68
+ # source://netrc//lib/netrc.rb#85
69
+ def lex(lines); end
70
+
71
+ # source://netrc//lib/netrc.rb#29
72
+ def netrc_filename; end
73
+
74
+ # Returns two values, a header and a list of items.
75
+ # Each item is a tuple, containing some or all of:
76
+ # - machine keyword (including trailing whitespace+comments)
77
+ # - machine name
78
+ # - login keyword (including surrounding whitespace+comments)
79
+ # - login
80
+ # - password keyword (including surrounding whitespace+comments)
81
+ # - password
82
+ # - trailing chars
83
+ # This lets us change individual fields, then write out the file
84
+ # with all its original formatting.
85
+ #
86
+ # source://netrc//lib/netrc.rb#129
87
+ def parse(ts); end
88
+
89
+ # Reads path and parses it as a .netrc file. If path doesn't
90
+ # exist, returns an empty object. Decrypt paths ending in .gpg.
91
+ #
92
+ # source://netrc//lib/netrc.rb#51
93
+ def read(path = T.unsafe(nil)); end
94
+
95
+ # @return [Boolean]
96
+ #
97
+ # source://netrc//lib/netrc.rb#112
98
+ def skip?(s); end
99
+ end
100
+ end
101
+
102
+ # source://netrc//lib/netrc.rb#8
103
+ Netrc::CYGWIN = T.let(T.unsafe(nil), T.untyped)
104
+
105
+ # source://netrc//lib/netrc.rb#244
106
+ class Netrc::Entry < ::Struct
107
+ # Returns the value of attribute login
108
+ #
109
+ # @return [Object] the current value of login
110
+ def login; end
111
+
112
+ # Sets the attribute login
113
+ #
114
+ # @param value [Object] the value to set the attribute login to.
115
+ # @return [Object] the newly set value
116
+ def login=(_); end
117
+
118
+ # Returns the value of attribute password
119
+ #
120
+ # @return [Object] the current value of password
121
+ def password; end
122
+
123
+ # Sets the attribute password
124
+ #
125
+ # @param value [Object] the value to set the attribute password to.
126
+ # @return [Object] the newly set value
127
+ def password=(_); end
128
+
129
+ def to_ary; end
130
+
131
+ class << self
132
+ def [](*_arg0); end
133
+ def inspect; end
134
+ def keyword_init?; end
135
+ def members; end
136
+ def new(*_arg0); end
137
+ end
138
+ end
139
+
140
+ # source://netrc//lib/netrc.rb#250
141
+ class Netrc::Error < ::StandardError; end
142
+
143
+ # source://netrc//lib/netrc.rb#68
144
+ class Netrc::TokenArray < ::Array
145
+ # source://netrc//lib/netrc.rb#76
146
+ def readto; end
147
+
148
+ # source://netrc//lib/netrc.rb#69
149
+ def take; end
150
+ end
151
+
152
+ # source://netrc//lib/netrc.rb#4
153
+ Netrc::VERSION = T.let(T.unsafe(nil), String)
154
+
155
+ # see http://stackoverflow.com/questions/4871309/what-is-the-correct-way-to-detect-if-ruby-is-running-on-windows
156
+ #
157
+ # source://netrc//lib/netrc.rb#7
158
+ Netrc::WINDOWS = T.let(T.unsafe(nil), T.untyped)