diff --git a/integration/global-this/global-this-test.ts b/integration/global-this/global-this-test.ts index 0c912dd47..364c64874 100644 --- a/integration/global-this/global-this-test.ts +++ b/integration/global-this/global-this-test.ts @@ -1,8 +1,12 @@ -import { Object, Error } from './global-this'; +import { Object, Error, String, Boolean, Number, Array } from "./global-this"; -describe('global-this', () => { - it('generates types correctly', () => { +describe("global-this", () => { + it("generates types correctly", () => { Object.fromPartial({}); Error.fromPartial({}); + String.fromPartial({}); + Boolean.fromPartial({}); + Number.fromPartial({}); + Array.fromPartial({}); }); }); diff --git a/integration/global-this/global-this.bin b/integration/global-this/global-this.bin index 4a39e83e8..9e29a07b9 100644 Binary files a/integration/global-this/global-this.bin and b/integration/global-this/global-this.bin differ diff --git a/integration/global-this/global-this.proto b/integration/global-this/global-this.proto index 949fda8e6..95f370cae 100644 --- a/integration/global-this/global-this.proto +++ b/integration/global-this/global-this.proto @@ -8,3 +8,19 @@ message Object { message Error { string name = 1; } + +message String { + string value = 1; +} + +message Boolean { + bool value = 1; +} + +message Number { + double value = 1; +} + +message Array { + repeated String values = 1; +} diff --git a/integration/global-this/global-this.ts b/integration/global-this/global-this.ts index 39b07ba67..fa3b2654c 100644 --- a/integration/global-this/global-this.ts +++ b/integration/global-this/global-this.ts @@ -11,6 +11,22 @@ export interface Error { name: string; } +export interface String { + value: string; +} + +export interface Boolean { + value: boolean; +} + +export interface Number { + value: number; +} + +export interface Array { + values: String[]; +} + function createBaseObject(): Object { return { name: "" }; } @@ -47,7 +63,7 @@ export const Object = { }, fromJSON(object: any): Object { - return { name: isSet(object.name) ? String(object.name) : "" }; + return { name: isSet(object.name) ? gt.String(object.name) : "" }; }, toJSON(message: Object): unknown { @@ -104,7 +120,7 @@ export const Error = { }, fromJSON(object: any): Error { - return { name: isSet(object.name) ? String(object.name) : "" }; + return { name: isSet(object.name) ? gt.String(object.name) : "" }; }, toJSON(message: Error): unknown { @@ -125,10 +141,258 @@ export const Error = { }, }; +function createBaseString(): String { + return { value: "" }; +} + +export const String = { + encode(message: String, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.value !== "") { + writer.uint32(10).string(message.value); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): String { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseString(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.value = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): String { + return { value: isSet(object.value) ? gt.String(object.value) : "" }; + }, + + toJSON(message: String): unknown { + const obj: any = {}; + if (message.value !== "") { + obj.value = message.value; + } + return obj; + }, + + create, I>>(base?: I): String { + return String.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): String { + const message = createBaseString(); + message.value = object.value ?? ""; + return message; + }, +}; + +function createBaseBoolean(): Boolean { + return { value: false }; +} + +export const Boolean = { + encode(message: Boolean, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.value === true) { + writer.uint32(8).bool(message.value); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Boolean { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseBoolean(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.value = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Boolean { + return { value: isSet(object.value) ? gt.Boolean(object.value) : false }; + }, + + toJSON(message: Boolean): unknown { + const obj: any = {}; + if (message.value === true) { + obj.value = message.value; + } + return obj; + }, + + create, I>>(base?: I): Boolean { + return Boolean.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Boolean { + const message = createBaseBoolean(); + message.value = object.value ?? false; + return message; + }, +}; + +function createBaseNumber(): Number { + return { value: 0 }; +} + +export const Number = { + encode(message: Number, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.value !== 0) { + writer.uint32(9).double(message.value); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Number { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseNumber(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 9) { + break; + } + + message.value = reader.double(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Number { + return { value: isSet(object.value) ? gt.Number(object.value) : 0 }; + }, + + toJSON(message: Number): unknown { + const obj: any = {}; + if (message.value !== 0) { + obj.value = message.value; + } + return obj; + }, + + create, I>>(base?: I): Number { + return Number.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Number { + const message = createBaseNumber(); + message.value = object.value ?? 0; + return message; + }, +}; + +function createBaseArray(): Array { + return { values: [] }; +} + +export const Array = { + encode(message: Array, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.values) { + String.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Array { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseArray(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.values.push(String.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Array { + return { values: gt.Array.isArray(object?.values) ? object.values.map((e: any) => String.fromJSON(e)) : [] }; + }, + + toJSON(message: Array): unknown { + const obj: any = {}; + if (message.values?.length) { + obj.values = message.values.map((e) => String.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): Array { + return Array.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Array { + const message = createBaseArray(); + message.values = object.values?.map((e) => String.fromPartial(e)) || []; + return message; + }, +}; + +declare const self: any | undefined; +declare const window: any | undefined; +declare const global: any | undefined; +const gt: any = (() => { + if (typeof globalThis !== "undefined") { + return globalThis; + } + if (typeof self !== "undefined") { + return self; + } + if (typeof window !== "undefined") { + return window; + } + if (typeof global !== "undefined") { + return global; + } + throw "Unable to locate global object"; +})(); + type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; export type DeepPartial = T extends Builtin ? T - : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> : T extends {} ? { [K in keyof T]?: DeepPartial } : Partial; diff --git a/src/main.ts b/src/main.ts index 86209fb3f..9033b2806 100644 --- a/src/main.ts +++ b/src/main.ts @@ -610,8 +610,8 @@ function makeDeepPartial(options: Options, longs: ReturnType = T extends ${Builtin} ? T ${maybeLong} - : T extends Array - ? Array> + : T extends globalThis.Array + ? globalThis.Array> : T extends ReadonlyArray ? ReadonlyArray>${oneofCase} : T extends {} @@ -1756,7 +1756,7 @@ function generateFromJson(ctx: Context, fullName: string, fullTypeName: string, return code`BigInt(${from})`; } else { const cstr = capitalize(basicTypeName(ctx, field, { keepValueType: true }).toCodeString([])); - return code`${cstr}(${from})`; + return code`${utils.globalThis}.${cstr}(${from})`; } } else if (isObjectId(field) && options.useMongoObjectId) { return code`${utils.fromJsonObjectId}(${from})`; @@ -2161,7 +2161,7 @@ function generateFromPartial(ctx: Context, fullName: string, messageDesc: Descri return code`BigInt(${from} as string | number | bigint | boolean)`; } else { const cstr = capitalize(valueType.toCodeString([])); - return code`${cstr}(${from})`; + return code`${utils.globalThis}.${cstr}(${from})`; } } else if (isAnyValueType(valueField)) { return code`${from}`;