ChainSafe / ChainSafe/zapi

js.Value narrowing methods (asString/asNumber/as*Array) fail to compile: undefined expectType/expectTypedArrayOfType

Open
#43 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Zig
Stars
4
Forks
4
Avg merge
16h 14m
Merged PRs (30d)
2

Description

### Summary

In `js.Value`, every type-narrowing method calls `self.expectType(...)` (or `self.expectTypedArrayOfType(...)`), but **neither helper is defined anywhere in the package**. As a result, referencing any of these methods is a hard compile error.

Observed on **zapi 2.2.0** (`src/js/value.zig`).

### Affected methods

All of these reference the missing helpers:

- `asNumber`, `asString`, `asBoolean`, `asBigInt`, `asFunction`, `asObject` → call `self.expectType(...)`
- `asInt8Array`, `asUint8Array`, `asUint8ClampedArray`, `asInt16Array`, `asUint16Array`, `asInt32Array`, `asUint32Array`, `asFloat32Array`, `asFloat64Array`, `asBigInt64Array`, `asBigUint64Array` → call `self.expectTypedArrayOfType(...)`

`asArray` and `asDate` are **not** affected — they use `self.val.isArray()` / `self.val.isDate()` directly.

A grep confirms the helpers are referenced but never declared:

```
$ grep -rnE 'fn expectType\b|fn expectTypedArrayOfType\b' src/
# (no matches)
```

### Compile error

```
src/js/value.zig:117:17: error: no field or member function named 'expectType' in 'js.value.Value'
try self.expectType(.string);
^~~~~~~~~~
```

### Minimal reproduction

```zig
const js = @import("zapi:zapi").js;

// Referencing any narrowing method triggers the error:
pub fn parse(v: js.Value) !void {
const s = try v.asString(); // error: no member function named 'expectType'
_ = s;
}
```

### Expected behavior

The narrowing methods should compile and validate the underlying JS type, returning `error.TypeMismatch` on a mismatch (as their doc comments state).

### Likely fix

Add the missing private helpers to `Value`, e.g.:

```zig
fn expectType(self: Value, expected: napi.value_types.ValueType) !void {
if ((try self.val.typeof()) != expected) return error.TypeMismatch;
}

fn expectTypedArrayOfType(self: Value, expected: napi.value_types.TypedarrayType) !void {
if (!(try self.val.isTypedarray())) return error.TypeMismatch;
const info = try self.val.getTypedarrayInfo();
if (info.type != expected) return error.TypeMismatch;
}
```

(Field/method names should be matched to the actual `napi` API.)

### Workaround

Construct the DSL wrapper directly and skip the `as*` validation, e.g. `js.String{ .val = napi_value }` instead of `value.asString()`.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.