diff --git a/tests/optional_scalars/scalar-stuff.js b/tests/optional_scalars/scalar-stuff.js
new file mode 100644
index 0000000..f02b885
--- /dev/null
+++ b/tests/optional_scalars/scalar-stuff.js
@@ -0,0 +1,341 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+import * as flatbuffers from 'flatbuffers';
+import { OptionalByte } from '../optional_scalars/optional-byte';
+export class ScalarStuff {
+    constructor() {
+        this.bb = null;
+        this.bb_pos = 0;
+    }
+    __init(i, bb) {
+        this.bb_pos = i;
+        this.bb = bb;
+        return this;
+    }
+    static getRootAsScalarStuff(bb, obj) {
+        return (obj || new ScalarStuff()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+    }
+    static getSizePrefixedRootAsScalarStuff(bb, obj) {
+        bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+        return (obj || new ScalarStuff()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+    }
+    static bufferHasIdentifier(bb) {
+        return bb.__has_identifier('NULL');
+    }
+    justI8() {
+        const offset = this.bb.__offset(this.bb_pos, 4);
+        return offset ? this.bb.readInt8(this.bb_pos + offset) : 0;
+    }
+    maybeI8() {
+        const offset = this.bb.__offset(this.bb_pos, 6);
+        return offset ? this.bb.readInt8(this.bb_pos + offset) : null;
+    }
+    defaultI8() {
+        const offset = this.bb.__offset(this.bb_pos, 8);
+        return offset ? this.bb.readInt8(this.bb_pos + offset) : 42;
+    }
+    justU8() {
+        const offset = this.bb.__offset(this.bb_pos, 10);
+        return offset ? this.bb.readUint8(this.bb_pos + offset) : 0;
+    }
+    maybeU8() {
+        const offset = this.bb.__offset(this.bb_pos, 12);
+        return offset ? this.bb.readUint8(this.bb_pos + offset) : null;
+    }
+    defaultU8() {
+        const offset = this.bb.__offset(this.bb_pos, 14);
+        return offset ? this.bb.readUint8(this.bb_pos + offset) : 42;
+    }
+    justI16() {
+        const offset = this.bb.__offset(this.bb_pos, 16);
+        return offset ? this.bb.readInt16(this.bb_pos + offset) : 0;
+    }
+    maybeI16() {
+        const offset = this.bb.__offset(this.bb_pos, 18);
+        return offset ? this.bb.readInt16(this.bb_pos + offset) : null;
+    }
+    defaultI16() {
+        const offset = this.bb.__offset(this.bb_pos, 20);
+        return offset ? this.bb.readInt16(this.bb_pos + offset) : 42;
+    }
+    justU16() {
+        const offset = this.bb.__offset(this.bb_pos, 22);
+        return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;
+    }
+    maybeU16() {
+        const offset = this.bb.__offset(this.bb_pos, 24);
+        return offset ? this.bb.readUint16(this.bb_pos + offset) : null;
+    }
+    defaultU16() {
+        const offset = this.bb.__offset(this.bb_pos, 26);
+        return offset ? this.bb.readUint16(this.bb_pos + offset) : 42;
+    }
+    justI32() {
+        const offset = this.bb.__offset(this.bb_pos, 28);
+        return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;
+    }
+    maybeI32() {
+        const offset = this.bb.__offset(this.bb_pos, 30);
+        return offset ? this.bb.readInt32(this.bb_pos + offset) : null;
+    }
+    defaultI32() {
+        const offset = this.bb.__offset(this.bb_pos, 32);
+        return offset ? this.bb.readInt32(this.bb_pos + offset) : 42;
+    }
+    justU32() {
+        const offset = this.bb.__offset(this.bb_pos, 34);
+        return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;
+    }
+    maybeU32() {
+        const offset = this.bb.__offset(this.bb_pos, 36);
+        return offset ? this.bb.readUint32(this.bb_pos + offset) : null;
+    }
+    defaultU32() {
+        const offset = this.bb.__offset(this.bb_pos, 38);
+        return offset ? this.bb.readUint32(this.bb_pos + offset) : 42;
+    }
+    justI64() {
+        const offset = this.bb.__offset(this.bb_pos, 40);
+        return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt('0');
+    }
+    maybeI64() {
+        const offset = this.bb.__offset(this.bb_pos, 42);
+        return offset ? this.bb.readInt64(this.bb_pos + offset) : null;
+    }
+    defaultI64() {
+        const offset = this.bb.__offset(this.bb_pos, 44);
+        return offset ? this.bb.readInt64(this.bb_pos + offset) : BigInt('42');
+    }
+    justU64() {
+        const offset = this.bb.__offset(this.bb_pos, 46);
+        return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');
+    }
+    maybeU64() {
+        const offset = this.bb.__offset(this.bb_pos, 48);
+        return offset ? this.bb.readUint64(this.bb_pos + offset) : null;
+    }
+    defaultU64() {
+        const offset = this.bb.__offset(this.bb_pos, 50);
+        return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('42');
+    }
+    justF32() {
+        const offset = this.bb.__offset(this.bb_pos, 52);
+        return offset ? this.bb.readFloat32(this.bb_pos + offset) : 0.0;
+    }
+    maybeF32() {
+        const offset = this.bb.__offset(this.bb_pos, 54);
+        return offset ? this.bb.readFloat32(this.bb_pos + offset) : null;
+    }
+    defaultF32() {
+        const offset = this.bb.__offset(this.bb_pos, 56);
+        return offset ? this.bb.readFloat32(this.bb_pos + offset) : 42.0;
+    }
+    justF64() {
+        const offset = this.bb.__offset(this.bb_pos, 58);
+        return offset ? this.bb.readFloat64(this.bb_pos + offset) : 0.0;
+    }
+    maybeF64() {
+        const offset = this.bb.__offset(this.bb_pos, 60);
+        return offset ? this.bb.readFloat64(this.bb_pos + offset) : null;
+    }
+    defaultF64() {
+        const offset = this.bb.__offset(this.bb_pos, 62);
+        return offset ? this.bb.readFloat64(this.bb_pos + offset) : 42.0;
+    }
+    justBool() {
+        const offset = this.bb.__offset(this.bb_pos, 64);
+        return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;
+    }
+    maybeBool() {
+        const offset = this.bb.__offset(this.bb_pos, 66);
+        return offset ? !!this.bb.readInt8(this.bb_pos + offset) : null;
+    }
+    defaultBool() {
+        const offset = this.bb.__offset(this.bb_pos, 68);
+        return offset ? !!this.bb.readInt8(this.bb_pos + offset) : true;
+    }
+    justEnum() {
+        const offset = this.bb.__offset(this.bb_pos, 70);
+        return offset ? this.bb.readInt8(this.bb_pos + offset) : OptionalByte.None;
+    }
+    maybeEnum() {
+        const offset = this.bb.__offset(this.bb_pos, 72);
+        return offset ? this.bb.readInt8(this.bb_pos + offset) : null;
+    }
+    defaultEnum() {
+        const offset = this.bb.__offset(this.bb_pos, 74);
+        return offset ? this.bb.readInt8(this.bb_pos + offset) : OptionalByte.One;
+    }
+    static startScalarStuff(builder) {
+        builder.startObject(36);
+    }
+    static addJustI8(builder, justI8) {
+        builder.addFieldInt8(0, justI8, 0);
+    }
+    static addMaybeI8(builder, maybeI8) {
+        builder.addFieldInt8(1, maybeI8, 0);
+    }
+    static addDefaultI8(builder, defaultI8) {
+        builder.addFieldInt8(2, defaultI8, 42);
+    }
+    static addJustU8(builder, justU8) {
+        builder.addFieldInt8(3, justU8, 0);
+    }
+    static addMaybeU8(builder, maybeU8) {
+        builder.addFieldInt8(4, maybeU8, 0);
+    }
+    static addDefaultU8(builder, defaultU8) {
+        builder.addFieldInt8(5, defaultU8, 42);
+    }
+    static addJustI16(builder, justI16) {
+        builder.addFieldInt16(6, justI16, 0);
+    }
+    static addMaybeI16(builder, maybeI16) {
+        builder.addFieldInt16(7, maybeI16, 0);
+    }
+    static addDefaultI16(builder, defaultI16) {
+        builder.addFieldInt16(8, defaultI16, 42);
+    }
+    static addJustU16(builder, justU16) {
+        builder.addFieldInt16(9, justU16, 0);
+    }
+    static addMaybeU16(builder, maybeU16) {
+        builder.addFieldInt16(10, maybeU16, 0);
+    }
+    static addDefaultU16(builder, defaultU16) {
+        builder.addFieldInt16(11, defaultU16, 42);
+    }
+    static addJustI32(builder, justI32) {
+        builder.addFieldInt32(12, justI32, 0);
+    }
+    static addMaybeI32(builder, maybeI32) {
+        builder.addFieldInt32(13, maybeI32, 0);
+    }
+    static addDefaultI32(builder, defaultI32) {
+        builder.addFieldInt32(14, defaultI32, 42);
+    }
+    static addJustU32(builder, justU32) {
+        builder.addFieldInt32(15, justU32, 0);
+    }
+    static addMaybeU32(builder, maybeU32) {
+        builder.addFieldInt32(16, maybeU32, 0);
+    }
+    static addDefaultU32(builder, defaultU32) {
+        builder.addFieldInt32(17, defaultU32, 42);
+    }
+    static addJustI64(builder, justI64) {
+        builder.addFieldInt64(18, justI64, BigInt('0'));
+    }
+    static addMaybeI64(builder, maybeI64) {
+        builder.addFieldInt64(19, maybeI64, BigInt(0));
+    }
+    static addDefaultI64(builder, defaultI64) {
+        builder.addFieldInt64(20, defaultI64, BigInt('42'));
+    }
+    static addJustU64(builder, justU64) {
+        builder.addFieldInt64(21, justU64, BigInt('0'));
+    }
+    static addMaybeU64(builder, maybeU64) {
+        builder.addFieldInt64(22, maybeU64, BigInt(0));
+    }
+    static addDefaultU64(builder, defaultU64) {
+        builder.addFieldInt64(23, defaultU64, BigInt('42'));
+    }
+    static addJustF32(builder, justF32) {
+        builder.addFieldFloat32(24, justF32, 0.0);
+    }
+    static addMaybeF32(builder, maybeF32) {
+        builder.addFieldFloat32(25, maybeF32, 0);
+    }
+    static addDefaultF32(builder, defaultF32) {
+        builder.addFieldFloat32(26, defaultF32, 42.0);
+    }
+    static addJustF64(builder, justF64) {
+        builder.addFieldFloat64(27, justF64, 0.0);
+    }
+    static addMaybeF64(builder, maybeF64) {
+        builder.addFieldFloat64(28, maybeF64, 0);
+    }
+    static addDefaultF64(builder, defaultF64) {
+        builder.addFieldFloat64(29, defaultF64, 42.0);
+    }
+    static addJustBool(builder, justBool) {
+        builder.addFieldInt8(30, +justBool, +false);
+    }
+    static addMaybeBool(builder, maybeBool) {
+        builder.addFieldInt8(31, +maybeBool, 0);
+    }
+    static addDefaultBool(builder, defaultBool) {
+        builder.addFieldInt8(32, +defaultBool, +true);
+    }
+    static addJustEnum(builder, justEnum) {
+        builder.addFieldInt8(33, justEnum, OptionalByte.None);
+    }
+    static addMaybeEnum(builder, maybeEnum) {
+        builder.addFieldInt8(34, maybeEnum, 0);
+    }
+    static addDefaultEnum(builder, defaultEnum) {
+        builder.addFieldInt8(35, defaultEnum, OptionalByte.One);
+    }
+    static endScalarStuff(builder) {
+        const offset = builder.endObject();
+        return offset;
+    }
+    static finishScalarStuffBuffer(builder, offset) {
+        builder.finish(offset, 'NULL');
+    }
+    static finishSizePrefixedScalarStuffBuffer(builder, offset) {
+        builder.finish(offset, 'NULL', true);
+    }
+    static createScalarStuff(builder, justI8, maybeI8, defaultI8, justU8, maybeU8, defaultU8, justI16, maybeI16, defaultI16, justU16, maybeU16, defaultU16, justI32, maybeI32, defaultI32, justU32, maybeU32, defaultU32, justI64, maybeI64, defaultI64, justU64, maybeU64, defaultU64, justF32, maybeF32, defaultF32, justF64, maybeF64, defaultF64, justBool, maybeBool, defaultBool, justEnum, maybeEnum, defaultEnum) {
+        ScalarStuff.startScalarStuff(builder);
+        ScalarStuff.addJustI8(builder, justI8);
+        if (maybeI8 !== null)
+            ScalarStuff.addMaybeI8(builder, maybeI8);
+        ScalarStuff.addDefaultI8(builder, defaultI8);
+        ScalarStuff.addJustU8(builder, justU8);
+        if (maybeU8 !== null)
+            ScalarStuff.addMaybeU8(builder, maybeU8);
+        ScalarStuff.addDefaultU8(builder, defaultU8);
+        ScalarStuff.addJustI16(builder, justI16);
+        if (maybeI16 !== null)
+            ScalarStuff.addMaybeI16(builder, maybeI16);
+        ScalarStuff.addDefaultI16(builder, defaultI16);
+        ScalarStuff.addJustU16(builder, justU16);
+        if (maybeU16 !== null)
+            ScalarStuff.addMaybeU16(builder, maybeU16);
+        ScalarStuff.addDefaultU16(builder, defaultU16);
+        ScalarStuff.addJustI32(builder, justI32);
+        if (maybeI32 !== null)
+            ScalarStuff.addMaybeI32(builder, maybeI32);
+        ScalarStuff.addDefaultI32(builder, defaultI32);
+        ScalarStuff.addJustU32(builder, justU32);
+        if (maybeU32 !== null)
+            ScalarStuff.addMaybeU32(builder, maybeU32);
+        ScalarStuff.addDefaultU32(builder, defaultU32);
+        ScalarStuff.addJustI64(builder, justI64);
+        if (maybeI64 !== null)
+            ScalarStuff.addMaybeI64(builder, maybeI64);
+        ScalarStuff.addDefaultI64(builder, defaultI64);
+        ScalarStuff.addJustU64(builder, justU64);
+        if (maybeU64 !== null)
+            ScalarStuff.addMaybeU64(builder, maybeU64);
+        ScalarStuff.addDefaultU64(builder, defaultU64);
+        ScalarStuff.addJustF32(builder, justF32);
+        if (maybeF32 !== null)
+            ScalarStuff.addMaybeF32(builder, maybeF32);
+        ScalarStuff.addDefaultF32(builder, defaultF32);
+        ScalarStuff.addJustF64(builder, justF64);
+        if (maybeF64 !== null)
+            ScalarStuff.addMaybeF64(builder, maybeF64);
+        ScalarStuff.addDefaultF64(builder, defaultF64);
+        ScalarStuff.addJustBool(builder, justBool);
+        if (maybeBool !== null)
+            ScalarStuff.addMaybeBool(builder, maybeBool);
+        ScalarStuff.addDefaultBool(builder, defaultBool);
+        ScalarStuff.addJustEnum(builder, justEnum);
+        if (maybeEnum !== null)
+            ScalarStuff.addMaybeEnum(builder, maybeEnum);
+        ScalarStuff.addDefaultEnum(builder, defaultEnum);
+        return ScalarStuff.endScalarStuff(builder);
+    }
+}
