diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/bundler/bundler_decorator_metadata.test.ts | 505 | ||||
-rw-r--r-- | test/package.json | 1 | ||||
-rw-r--r-- | test/transpiler/decorator-metadata.test.ts | 494 | ||||
-rw-r--r-- | test/tsconfig.json | 1 |
4 files changed, 1001 insertions, 0 deletions
diff --git a/test/bundler/bundler_decorator_metadata.test.ts b/test/bundler/bundler_decorator_metadata.test.ts new file mode 100644 index 000000000..54bbdd6a5 --- /dev/null +++ b/test/bundler/bundler_decorator_metadata.test.ts @@ -0,0 +1,505 @@ +import assert from "assert"; +import { itBundled, testForFile } from "./expectBundled"; +var { describe, test, expect } = testForFile(import.meta.path); + +itBundled("decorator_metadata/TypeSerialization", { + files: { + "/entry.ts": /* ts */ ` + import "reflect-metadata"; + function d1() {} + class Known {} + class Swag {} + class A_1 {} + + // @ts-ignore + @d1 + class Yolo { + constructor( + p0: any, + p1: unknown, + p2: never, + p3: void, + p4: null, + p5: undefined, + p6: number, + p7: string, + p8: boolean, + p9: symbol, + p10: bigint, + p11: object, + p12: () => {}, + p13: [], + p14: {}, + p15: 123, + p16: 123n, + p17: "123", + p18: \`123\`, + p19: true, + p20: false, + // @ts-ignore + p21: Map, + // @ts-ignore + p22: Set, + p23: Known, + // @ts-ignore + p24: Unknown, + p25: never & string, + p26: string & never, + p27: null & string, + p28: string & null, + p29: undefined & string, + p30: string & undefined, + p31: void & string, + p32: string & void, + p33: unknown & string, + p34: string & unknown, + p35: any & string, + p36: string & any, + p37: never | string, + p38: string | never, + p39: null | string, + p40: string | null, + p41: undefined | string, + p42: string | undefined, + p43: void | string, + p44: string | void, + p45: unknown | string, + p46: string | unknown, + p47: any | string, + p48: string | any, + p49: string | string, + p50: string & string, + p51: Known | Swag, + p52: Swag | Known, + p53: Known & Swag, + p54: Swag & Known, + p55: never | Swag, + p56: Swag | never, + p57: null | Swag, + p58: Swag | null, + p59: undefined | Swag, + p60: Swag | undefined, + p61: void | Swag, + p62: Swag | void, + p63: unknown | Swag, + p64: Swag | unknown, + p65: any | Swag, + p66: Swag | any, + p67: never & Swag, + p68: Swag & never, + p69: null & Swag, + p70: Swag & null, + p71: undefined & Swag, + p72: Swag & undefined, + p73: void & Swag, + p74: Swag & void, + p75: unknown & Swag, + p76: Swag & unknown, + p77: any & Swag, + p78: Swag & any, + p79: Swag | Swag, + p80: Swag & Swag, + // @ts-ignore + p81: Unknown | Known, + // @ts-ignore + p82: Known | Unknown, + // @ts-ignore + p83: Unknown & Known, + // @ts-ignore + p84: Known & Unknown, + // @ts-ignore + p85: Unknown | Unknown, + // @ts-ignore + p86: Unknown & Unknown, + p87: never | never, + p88: never & never, + p89: null | null, + p90: null & null, + p91: undefined | undefined, + p92: undefined & undefined, + p93: void | void, + p94: void & void, + p95: unknown | unknown, + p96: unknown & unknown, + p97: any | any, + p98: any & any, + p99: never | void, + p100: void | never, + p101: null | void, + p102: void | null, + p103: undefined | void, + p104: void | undefined, + p105: void | void, + p106: void & void, + p107: unknown | void, + p108: void | unknown, + p109: any | void, + p110: void | any, + p111: never | unknown, + p112: unknown | never, + p113: null | unknown, + p114: unknown | null, + p115: undefined | unknown, + p116: unknown | undefined, + p117: void | unknown, + p118: unknown | void, + p119: unknown | unknown, + p120: unknown & unknown, + p121: any | unknown, + p122: unknown | any, + p123: never | any, + p124: any | never, + p125: null | any, + p126: any | null, + p127: undefined | any, + p128: any | undefined, + p129: void | any, + p130: any | void, + p131: unknown | any, + p132: any | unknown, + p133: any | any, + p134: never & void, + p135: void & never, + p136: null & void, + p137: void & null, + p138: undefined & void, + p139: void & undefined, + p140: void & void, + p141: void | void, + p142: unknown & void, + p143: void & unknown, + p144: any & void, + p145: void & any, + p146: never & unknown, + p147: unknown & never, + p148: null & unknown, + p149: unknown & null, + p150: undefined & unknown, + p151: unknown & undefined, + p152: void & unknown, + p153: unknown & void, + p154: unknown & unknown, + p155: unknown | unknown, + p156: any & unknown, + p157: unknown & any, + p158: never & any, + p159: any & never, + p160: null & any, + p161: any & null, + p162: undefined & any, + p163: any & undefined, + p164: void & any, + p165: any & void, + p166: unknown & any, + p167: any & unknown, + p168: any & any, + p169: string & number & boolean & never & symbol, + p170: "foo" | A_1, + p171: true | boolean, + p172: "foo" | boolean, + p173: A_1 | "foo", + ){} + } + + const received = Reflect.getMetadata("design:paramtypes", Yolo); + console.log(received.length === 174); + console.log(received[0] === Object); + console.log(received[1] === Object); + console.log(received[2] === void 0); + console.log(received[3] === void 0); + console.log(received[4] === void 0); + console.log(received[5] === void 0); + console.log(received[6] === Number); + console.log(received[7] === String); + console.log(received[8] === Boolean); + console.log(received[9] === (typeof Symbol === "function" ? Symbol : Object)); + console.log(received[10] === (typeof BigInt === "function" ? BigInt : Object)); + console.log(received[11] === Object); + console.log(received[12] === Function); + console.log(received[13] === Array); + console.log(received[14] === Object); + console.log(received[15] === Number); + console.log(received[16] === (typeof BigInt === "function" ? BigInt : Object)); + console.log(received[17] === String); + console.log(received[18] === String); + console.log(received[19] === Boolean); + console.log(received[20] === Boolean); + console.log(received[21] === Map); + console.log(received[22] === Set); + console.log(received[23] === Known); + console.log(received[24] === Object); + console.log(received[25] === void 0); + console.log(received[26] === void 0); + console.log(received[27] === String); + console.log(received[28] === String); + console.log(received[29] === String); + console.log(received[30] === String); + console.log(received[31] === Object); + console.log(received[32] === Object); + console.log(received[33] === String); + console.log(received[34] === String); + console.log(received[35] === Object); + console.log(received[36] === Object); + console.log(received[37] === String); + console.log(received[38] === String); + console.log(received[39] === String); + console.log(received[40] === String); + console.log(received[41] === String); + console.log(received[42] === String); + console.log(received[43] === Object); + console.log(received[44] === Object); + console.log(received[45] === Object); + console.log(received[46] === Object); + console.log(received[47] === Object); + console.log(received[48] === Object); + console.log(received[49] === String); + console.log(received[50] === String); + console.log(received[51] === Object); + console.log(received[52] === Object); + console.log(received[53] === Object); + console.log(received[54] === Object); + console.log(received[55] === Swag); + console.log(received[56] === Swag); + console.log(received[57] === Swag); + console.log(received[58] === Swag); + console.log(received[59] === Swag); + console.log(received[60] === Swag); + console.log(received[61] === Object); + console.log(received[62] === Object); + console.log(received[63] === Object); + console.log(received[64] === Object); + console.log(received[65] === Object); + console.log(received[66] === Object); + console.log(received[67] === void 0); + console.log(received[68] === void 0); + console.log(received[69] === Swag); + console.log(received[70] === Swag); + console.log(received[71] === Swag); + console.log(received[72] === Swag); + console.log(received[73] === Object); + console.log(received[74] === Object); + console.log(received[75] === Swag); + console.log(received[76] === Swag); + console.log(received[77] === Object); + console.log(received[78] === Object); + console.log(received[79] === Swag); + console.log(received[80] === Swag); + console.log(received[81] === Object); + console.log(received[82] === Object); + console.log(received[83] === Object); + console.log(received[84] === Object); + console.log(received[85] === Object); + console.log(received[86] === Object); + console.log(received[87] === void 0); + console.log(received[88] === void 0); + console.log(received[89] === void 0); + console.log(received[90] === void 0); + console.log(received[91] === void 0); + console.log(received[92] === void 0); + console.log(received[93] === void 0); + console.log(received[94] === void 0); + console.log(received[95] === Object); + console.log(received[96] === void 0); + console.log(received[97] === Object); + console.log(received[98] === Object); + console.log(received[99] === void 0); + console.log(received[100] === void 0); + console.log(received[101] === void 0); + console.log(received[102] === void 0); + console.log(received[103] === void 0); + console.log(received[104] === void 0); + console.log(received[105] === void 0); + console.log(received[106] === void 0); + console.log(received[107] === Object); + console.log(received[108] === Object); + console.log(received[109] === Object); + console.log(received[110] === Object); + console.log(received[111] === Object); + console.log(received[112] === Object); + console.log(received[113] === Object); + console.log(received[114] === Object); + console.log(received[115] === Object); + console.log(received[116] === Object); + console.log(received[117] === Object); + console.log(received[118] === Object); + console.log(received[119] === Object); + console.log(received[120] === void 0); + console.log(received[121] === Object); + console.log(received[122] === Object); + console.log(received[123] === Object); + console.log(received[124] === Object); + console.log(received[125] === Object); + console.log(received[126] === Object); + console.log(received[127] === Object); + console.log(received[128] === Object); + console.log(received[129] === Object); + console.log(received[130] === Object); + console.log(received[131] === Object); + console.log(received[132] === Object); + console.log(received[133] === Object); + console.log(received[134] === void 0); + console.log(received[135] === void 0); + console.log(received[136] === void 0); + console.log(received[137] === void 0); + console.log(received[138] === void 0); + console.log(received[139] === void 0); + console.log(received[140] === void 0); + console.log(received[141] === void 0); + console.log(received[142] === void 0); + console.log(received[143] === void 0); + console.log(received[144] === Object); + console.log(received[145] === Object); + console.log(received[146] === void 0); + console.log(received[147] === void 0); + console.log(received[148] === void 0); + console.log(received[149] === void 0); + console.log(received[150] === void 0); + console.log(received[151] === void 0); + console.log(received[152] === void 0); + console.log(received[153] === void 0); + console.log(received[154] === void 0); + console.log(received[155] === Object); + console.log(received[156] === Object); + console.log(received[157] === Object); + console.log(received[158] === void 0); + console.log(received[159] === Object); + console.log(received[160] === Object); + console.log(received[161] === Object); + console.log(received[162] === Object); + console.log(received[163] === Object); + console.log(received[164] === Object); + console.log(received[165] === Object); + console.log(received[166] === Object); + console.log(received[167] === Object); + console.log(received[168] === Object); + console.log(received[169] === Object); + console.log(received[170] === Object); + console.log(received[171] === Boolean); + console.log(received[172] === Object); + console.log(received[173] === Object); + + // @ts-ignore + @d1 + class A { + // @ts-ignore + constructor(@d1 arg1: string) {} + // @ts-ignore + @d1 + // @ts-ignore + method1(@d1 arg1: number): boolean { + return true; + } + // @ts-ignore + @d1 + prop1: () => {}; + // @ts-ignore + @d1 + prop2: "foo" = "foo"; + // @ts-ignore + @d1 + prop3: symbol; + } + + console.log(Reflect.getMetadata("design:type", A) === undefined); + console.log(Reflect.getMetadata("design:paramtypes", A)[0] === String); + console.log(Reflect.getMetadata("design:returntype", A) === undefined); + + console.log(Reflect.getMetadata("design:type", A.prototype) === undefined); + console.log(Reflect.getMetadata("design:paramtypes", A.prototype) === undefined); + console.log(Reflect.getMetadata("design:returntype", A.prototype) === undefined); + + console.log(Reflect.getMetadata("design:type", A.prototype.method1) === undefined); + console.log(Reflect.getMetadata("design:paramtypes", A.prototype.method1) === undefined); + console.log(Reflect.getMetadata("design:returntype", A.prototype.method1) === undefined); + + console.log(Reflect.getMetadata("design:type", A.prototype, "method1") === Function); + console.log(Reflect.getMetadata("design:paramtypes", A.prototype, "method1")[0] === Number); + console.log(Reflect.getMetadata("design:returntype", A.prototype, "method1") === Boolean); + + console.log(Reflect.getMetadata("design:type", A.prototype, "prop1") === Function); + console.log(Reflect.getMetadata("design:paramtypes", A.prototype, "prop1") === undefined); + console.log(Reflect.getMetadata("design:returntype", A.prototype, "prop1") === undefined); + + console.log(Reflect.getMetadata("design:type", A.prototype, "prop2") === String); + console.log(Reflect.getMetadata("design:paramtypes", A.prototype, "prop2") === undefined); + console.log(Reflect.getMetadata("design:returntype", A.prototype, "prop2") === undefined); + + console.log(Reflect.getMetadata("design:type", A.prototype, "prop3") === Symbol); + console.log(Reflect.getMetadata("design:paramtypes", A.prototype, "prop3") === undefined); + console.log(Reflect.getMetadata("design:returntype", A.prototype, "prop3") === undefined); + + class HelloWorld { + // @ts-ignore + constructor(@d1 arg1: string) {} + } + + console.log(Reflect.getMetadata("design:type", HelloWorld) === undefined); + console.log(Reflect.getMetadata("design:paramtypes", HelloWorld)[0] === String); + console.log(Reflect.getMetadata("design:returntype", HelloWorld) === undefined); + + type B = "hello" | "world"; + const b = 2; + const c = ["hello", "world"] as const; + type Loser = \`hello \${B}\`; // "hello hello" | "hello world" + function d1() {} + + class AClass { + constructor( + // @ts-ignore + @d1 p0: \`hello \${B}\`, + // @ts-ignore + p1: keyof Something, + p2: typeof b, + p3: readonly ["hello", "world"], + p4: typeof c, + p5: readonly [number, string], + // prettier-ignore + p6: (string | string), + // prettier-ignore + p7: (string & string), + p8: boolean extends true ? "a" : "b", + // @ts-ignore + p9: Loser extends Loser ? string : Foo, + p10: { [keyof in string]: number }, + // @ts-ignore + p11: blah extends blahblah ? number : void, + ) {} + + // @ts-ignore + @d1 + async method1() { + return true; + } + } + + const paramtypes = Reflect.getMetadata("design:paramtypes", AClass); + console.log(paramtypes[0] === String); + console.log(paramtypes[1] === Object); + console.log(paramtypes[2] === Object); + console.log(paramtypes[3] === Array); + console.log(paramtypes[4] === Object); + console.log(paramtypes[5] === Array); + console.log(paramtypes[6] === String); + console.log(paramtypes[7] === String); + console.log(paramtypes[8] === String); + console.log(paramtypes[9] === Object); + console.log(paramtypes[10] === Object); + console.log(paramtypes[11] === Object); + + console.log(Reflect.getMetadata("design:returntype", AClass.prototype, "method1") === Promise); + `, + "/tsconfig.json": /* json */ ` + { + "compilerOptions": { + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + } + } + `, + }, + install: ["reflect-metadata"], + bundling: true, + run: { + stdout: "true\n".repeat(212), + }, +}); diff --git a/test/package.json b/test/package.json index ad28f114a..9e55cc543 100644 --- a/test/package.json +++ b/test/package.json @@ -9,6 +9,7 @@ }, "dependencies": { "@prisma/client": "5.1.1", + "reflect-metadata": "0.1.13", "@resvg/resvg-js": "2.4.1", "@swc/core": "1.3.38", "body-parser": "1.20.2", diff --git a/test/transpiler/decorator-metadata.test.ts b/test/transpiler/decorator-metadata.test.ts new file mode 100644 index 000000000..861604430 --- /dev/null +++ b/test/transpiler/decorator-metadata.test.ts @@ -0,0 +1,494 @@ +import "reflect-metadata"; + +describe("decorator metadata", () => { + test("type serialization", () => { + function d1() {} + class Known {} + class Swag {} + class A_1 {} + + // @ts-ignore + @d1 + class A { + constructor( + p0: any, + p1: unknown, + p2: never, + p3: void, + p4: null, + p5: undefined, + p6: number, + p7: string, + p8: boolean, + p9: symbol, + p10: bigint, + p11: object, + p12: () => {}, + p13: [], + p14: {}, + p15: 123, + p16: 123n, + p17: "123", + p18: `123`, + p19: true, + p20: false, + // @ts-ignore + p21: Map, + // @ts-ignore + p22: Set, + p23: Known, + // @ts-ignore + p24: Unknown, + p25: never & string, + p26: string & never, + p27: null & string, + p28: string & null, + p29: undefined & string, + p30: string & undefined, + p31: void & string, + p32: string & void, + p33: unknown & string, + p34: string & unknown, + p35: any & string, + p36: string & any, + p37: never | string, + p38: string | never, + p39: null | string, + p40: string | null, + p41: undefined | string, + p42: string | undefined, + p43: void | string, + p44: string | void, + p45: unknown | string, + p46: string | unknown, + p47: any | string, + p48: string | any, + p49: string | string, + p50: string & string, + p51: Known | Swag, + p52: Swag | Known, + p53: Known & Swag, + p54: Swag & Known, + p55: never | Swag, + p56: Swag | never, + p57: null | Swag, + p58: Swag | null, + p59: undefined | Swag, + p60: Swag | undefined, + p61: void | Swag, + p62: Swag | void, + p63: unknown | Swag, + p64: Swag | unknown, + p65: any | Swag, + p66: Swag | any, + p67: never & Swag, + p68: Swag & never, + p69: null & Swag, + p70: Swag & null, + p71: undefined & Swag, + p72: Swag & undefined, + p73: void & Swag, + p74: Swag & void, + p75: unknown & Swag, + p76: Swag & unknown, + p77: any & Swag, + p78: Swag & any, + p79: Swag | Swag, + p80: Swag & Swag, + // @ts-ignore + p81: Unknown | Known, + // @ts-ignore + p82: Known | Unknown, + // @ts-ignore + p83: Unknown & Known, + // @ts-ignore + p84: Known & Unknown, + // @ts-ignore + p85: Unknown | Unknown, + // @ts-ignore + p86: Unknown & Unknown, + p87: never | never, + p88: never & never, + p89: null | null, + p90: null & null, + p91: undefined | undefined, + p92: undefined & undefined, + p93: void | void, + p94: void & void, + p95: unknown | unknown, + p96: unknown & unknown, + p97: any | any, + p98: any & any, + p99: never | void, + p100: void | never, + p101: null | void, + p102: void | null, + p103: undefined | void, + p104: void | undefined, + p105: void | void, + p106: void & void, + p107: unknown | void, + p108: void | unknown, + p109: any | void, + p110: void | any, + p111: never | unknown, + p112: unknown | never, + p113: null | unknown, + p114: unknown | null, + p115: undefined | unknown, + p116: unknown | undefined, + p117: void | unknown, + p118: unknown | void, + p119: unknown | unknown, + p120: unknown & unknown, + p121: any | unknown, + p122: unknown | any, + p123: never | any, + p124: any | never, + p125: null | any, + p126: any | null, + p127: undefined | any, + p128: any | undefined, + p129: void | any, + p130: any | void, + p131: unknown | any, + p132: any | unknown, + p133: any | any, + p134: never & void, + p135: void & never, + p136: null & void, + p137: void & null, + p138: undefined & void, + p139: void & undefined, + p140: void & void, + p141: void | void, + p142: unknown & void, + p143: void & unknown, + p144: any & void, + p145: void & any, + p146: never & unknown, + p147: unknown & never, + p148: null & unknown, + p149: unknown & null, + p150: undefined & unknown, + p151: unknown & undefined, + p152: void & unknown, + p153: unknown & void, + p154: unknown & unknown, + p155: unknown | unknown, + p156: any & unknown, + p157: unknown & any, + p158: never & any, + p159: any & never, + p160: null & any, + p161: any & null, + p162: undefined & any, + p163: any & undefined, + p164: void & any, + p165: any & void, + p166: unknown & any, + p167: any & unknown, + p168: any & any, + p169: string & number & boolean & never & symbol, + p170: "foo" | A_1, + p171: true | boolean, + p172: "foo" | boolean, + p173: A_1 | "foo", + ) {} + } + + const received = Reflect.getMetadata("design:paramtypes", A); + expect(received.length).toBe(174); + expect(received[0]).toBe(Object); + expect(received[1]).toBe(Object); + expect(received[2]).toBe(void 0); + expect(received[3]).toBe(void 0); + expect(received[4]).toBe(void 0); + expect(received[5]).toBe(void 0); + expect(received[6]).toBe(Number); + expect(received[7]).toBe(String); + expect(received[8]).toBe(Boolean); + expect(received[9]).toBe(typeof Symbol === "function" ? Symbol : Object); + expect(received[10]).toBe(typeof BigInt === "function" ? BigInt : Object); + expect(received[11]).toBe(Object); + expect(received[12]).toBe(Function); + expect(received[13]).toBe(Array); + expect(received[14]).toBe(Object); + expect(received[15]).toBe(Number); + expect(received[16]).toBe(typeof BigInt === "function" ? BigInt : Object); + expect(received[17]).toBe(String); + expect(received[18]).toBe(String); + expect(received[19]).toBe(Boolean); + expect(received[20]).toBe(Boolean); + expect(received[21]).toBe(Map); + expect(received[22]).toBe(Set); + expect(received[23]).toBe(Known); + expect(received[24]).toBe(Object); + expect(received[25]).toBe(void 0); + expect(received[26]).toBe(void 0); + expect(received[27]).toBe(String); + expect(received[28]).toBe(String); + expect(received[29]).toBe(String); + expect(received[30]).toBe(String); + expect(received[31]).toBe(Object); + expect(received[32]).toBe(Object); + expect(received[33]).toBe(String); + expect(received[34]).toBe(String); + expect(received[35]).toBe(Object); + expect(received[36]).toBe(Object); + expect(received[37]).toBe(String); + expect(received[38]).toBe(String); + expect(received[39]).toBe(String); + expect(received[40]).toBe(String); + expect(received[41]).toBe(String); + expect(received[42]).toBe(String); + expect(received[43]).toBe(Object); + expect(received[44]).toBe(Object); + expect(received[45]).toBe(Object); + expect(received[46]).toBe(Object); + expect(received[47]).toBe(Object); + expect(received[48]).toBe(Object); + expect(received[49]).toBe(String); + expect(received[50]).toBe(String); + expect(received[51]).toBe(Object); + expect(received[52]).toBe(Object); + expect(received[53]).toBe(Object); + expect(received[54]).toBe(Object); + expect(received[55]).toBe(Swag); + expect(received[56]).toBe(Swag); + expect(received[57]).toBe(Swag); + expect(received[58]).toBe(Swag); + expect(received[59]).toBe(Swag); + expect(received[60]).toBe(Swag); + expect(received[61]).toBe(Object); + expect(received[62]).toBe(Object); + expect(received[63]).toBe(Object); + expect(received[64]).toBe(Object); + expect(received[65]).toBe(Object); + expect(received[66]).toBe(Object); + expect(received[67]).toBe(void 0); + expect(received[68]).toBe(void 0); + expect(received[69]).toBe(Swag); + expect(received[70]).toBe(Swag); + expect(received[71]).toBe(Swag); + expect(received[72]).toBe(Swag); + expect(received[73]).toBe(Object); + expect(received[74]).toBe(Object); + expect(received[75]).toBe(Swag); + expect(received[76]).toBe(Swag); + expect(received[77]).toBe(Object); + expect(received[78]).toBe(Object); + expect(received[79]).toBe(Swag); + expect(received[80]).toBe(Swag); + expect(received[81]).toBe(Object); + expect(received[82]).toBe(Object); + expect(received[83]).toBe(Object); + expect(received[84]).toBe(Object); + expect(received[85]).toBe(Object); + expect(received[86]).toBe(Object); + expect(received[87]).toBe(void 0); + expect(received[88]).toBe(void 0); + expect(received[89]).toBe(void 0); + expect(received[90]).toBe(void 0); + expect(received[91]).toBe(void 0); + expect(received[92]).toBe(void 0); + expect(received[93]).toBe(void 0); + expect(received[94]).toBe(void 0); + expect(received[95]).toBe(Object); + expect(received[96]).toBe(void 0); + expect(received[97]).toBe(Object); + expect(received[98]).toBe(Object); + expect(received[99]).toBe(void 0); + expect(received[100]).toBe(void 0); + expect(received[101]).toBe(void 0); + expect(received[102]).toBe(void 0); + expect(received[103]).toBe(void 0); + expect(received[104]).toBe(void 0); + expect(received[105]).toBe(void 0); + expect(received[106]).toBe(void 0); + expect(received[107]).toBe(Object); + expect(received[108]).toBe(Object); + expect(received[109]).toBe(Object); + expect(received[110]).toBe(Object); + expect(received[111]).toBe(Object); + expect(received[112]).toBe(Object); + expect(received[113]).toBe(Object); + expect(received[114]).toBe(Object); + expect(received[115]).toBe(Object); + expect(received[116]).toBe(Object); + expect(received[117]).toBe(Object); + expect(received[118]).toBe(Object); + expect(received[119]).toBe(Object); + expect(received[120]).toBe(void 0); + expect(received[121]).toBe(Object); + expect(received[122]).toBe(Object); + expect(received[123]).toBe(Object); + expect(received[124]).toBe(Object); + expect(received[125]).toBe(Object); + expect(received[126]).toBe(Object); + expect(received[127]).toBe(Object); + expect(received[128]).toBe(Object); + expect(received[129]).toBe(Object); + expect(received[130]).toBe(Object); + expect(received[131]).toBe(Object); + expect(received[132]).toBe(Object); + expect(received[133]).toBe(Object); + expect(received[134]).toBe(void 0); + expect(received[135]).toBe(void 0); + expect(received[136]).toBe(void 0); + expect(received[137]).toBe(void 0); + expect(received[138]).toBe(void 0); + expect(received[139]).toBe(void 0); + expect(received[140]).toBe(void 0); + expect(received[141]).toBe(void 0); + expect(received[142]).toBe(void 0); + expect(received[143]).toBe(void 0); + expect(received[144]).toBe(Object); + expect(received[145]).toBe(Object); + expect(received[146]).toBe(void 0); + expect(received[147]).toBe(void 0); + expect(received[148]).toBe(void 0); + expect(received[149]).toBe(void 0); + expect(received[150]).toBe(void 0); + expect(received[151]).toBe(void 0); + expect(received[152]).toBe(void 0); + expect(received[153]).toBe(void 0); + expect(received[154]).toBe(void 0); + expect(received[155]).toBe(Object); + expect(received[156]).toBe(Object); + expect(received[157]).toBe(Object); + expect(received[158]).toBe(void 0); + expect(received[159]).toBe(Object); + expect(received[160]).toBe(Object); + expect(received[161]).toBe(Object); + expect(received[162]).toBe(Object); + expect(received[163]).toBe(Object); + expect(received[164]).toBe(Object); + expect(received[165]).toBe(Object); + expect(received[166]).toBe(Object); + expect(received[167]).toBe(Object); + expect(received[168]).toBe(Object); + expect(received[169]).toBe(Object); + expect(received[170]).toBe(Object); + expect(received[171]).toBe(Boolean); + expect(received[172]).toBe(Object); + expect(received[173]).toBe(Object); + }); + test("design: type, paramtypes, returntype", () => { + function d1() {} + // @ts-ignore + @d1 + class A { + // @ts-ignore + constructor(@d1 arg1: string) {} + // @ts-ignore + @d1 + // @ts-ignore + method1(@d1 arg1: number): boolean { + return true; + } + // @ts-ignore + @d1 + prop1: () => {}; + // @ts-ignore + @d1 + prop2: "foo" = "foo"; + // @ts-ignore + @d1 + prop3: symbol; + } + + expect(Reflect.getMetadata("design:type", A)).toBeUndefined(); + expect(Reflect.getMetadata("design:paramtypes", A)[0]).toBe(String); + expect(Reflect.getMetadata("design:returntype", A)).toBeUndefined(); + + expect(Reflect.getMetadata("design:type", A.prototype)).toBeUndefined(); + expect(Reflect.getMetadata("design:paramtypes", A.prototype)).toBeUndefined(); + expect(Reflect.getMetadata("design:returntype", A.prototype)).toBeUndefined(); + + expect(Reflect.getMetadata("design:type", A.prototype.method1)).toBeUndefined(); + expect(Reflect.getMetadata("design:paramtypes", A.prototype.method1)).toBeUndefined(); + expect(Reflect.getMetadata("design:returntype", A.prototype.method1)).toBeUndefined(); + + expect(Reflect.getMetadata("design:type", A.prototype, "method1")).toBe(Function); + expect(Reflect.getMetadata("design:paramtypes", A.prototype, "method1")[0]).toBe(Number); + expect(Reflect.getMetadata("design:returntype", A.prototype, "method1")).toBe(Boolean); + + expect(Reflect.getMetadata("design:type", A.prototype, "prop1")).toBe(Function); + expect(Reflect.getMetadata("design:paramtypes", A.prototype, "prop1")).toBeUndefined(); + expect(Reflect.getMetadata("design:returntype", A.prototype, "prop1")).toBeUndefined(); + + expect(Reflect.getMetadata("design:type", A.prototype, "prop2")).toBe(String); + expect(Reflect.getMetadata("design:paramtypes", A.prototype, "prop2")).toBeUndefined(); + expect(Reflect.getMetadata("design:returntype", A.prototype, "prop2")).toBeUndefined(); + + expect(Reflect.getMetadata("design:type", A.prototype, "prop3")).toBe(Symbol); + expect(Reflect.getMetadata("design:paramtypes", A.prototype, "prop3")).toBeUndefined(); + expect(Reflect.getMetadata("design:returntype", A.prototype, "prop3")).toBeUndefined(); + }); + + test("class with only constructor argument decorators", () => { + function d1() {} + class A { + // @ts-ignore + constructor(@d1 arg1: string) {} + } + + expect(Reflect.getMetadata("design:type", A)).toBeUndefined(); + expect(Reflect.getMetadata("design:paramtypes", A)[0]).toBe(String); + expect(Reflect.getMetadata("design:returntype", A)).toBeUndefined(); + }); + + test("more types", () => { + type B = "hello" | "world"; + const b = 2; + const c = ["hello", "world"] as const; + type Loser = `hello ${B}`; // "hello hello" | "hello world" + function d1() {} + + class A { + constructor( + // @ts-ignore + @d1 p0: `hello ${B}`, + // @ts-ignore + p1: keyof Something, + p2: typeof b, + p3: readonly ["hello", "world"], + p4: typeof c, + p5: readonly [number, string], + // prettier-ignore + p6: (string | string), + // prettier-ignore + p7: (string & string), + p8: boolean extends true ? "a" : "b", + // @ts-ignore + p9: Loser extends Loser ? string : Foo, + p10: { [keyof in string]: number }, + // @ts-ignore + p11: blah extends blahblah ? number : void, + ) {} + + // @ts-ignore + @d1 + async method1() { + return true; + } + } + + const paramtypes = Reflect.getMetadata("design:paramtypes", A); + expect(paramtypes[0]).toBe(String); + expect(paramtypes[1]).toBe(Object); + expect(paramtypes[2]).toBe(Object); + expect(paramtypes[3]).toBe(Array); + expect(paramtypes[4]).toBe(Object); + expect(paramtypes[5]).toBe(Array); + expect(paramtypes[6]).toBe(String); + expect(paramtypes[7]).toBe(String); + expect(paramtypes[8]).toBe(String); + expect(paramtypes[9]).toBe(Object); + expect(paramtypes[10]).toBe(Object); + expect(paramtypes[11]).toBe(Object); + + expect(Reflect.getMetadata("design:returntype", A.prototype, "method1")).toBe(Promise); + }); +}); diff --git a/test/tsconfig.json b/test/tsconfig.json index af2af2bb5..d308b40b7 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -7,6 +7,7 @@ "moduleResolution": "bundler", "moduleDetection": "force", "allowImportingTsExtensions": true, + "experimentalDecorators": true, "noEmit": true, "composite": true, "strict": true, |