Best JavaScript code snippet using ts-auto-mock
getFlowType-test.js
Source:getFlowType-test.js
1/**2 * Copyright (c) Facebook, Inc. and its affiliates.3 *4 * This source code is licensed under the MIT license found in the5 * LICENSE file in the root directory of this source tree.6 *7 */8import getFlowType from '../getFlowType';9import {10 expression,11 statement,12 noopImporter,13 makeMockImporter,14} from '../../../tests/utils';15describe('getFlowType', () => {16 const mockImporter = makeMockImporter({17 abc: statement(`18 export type abc = number;19 `).get('declaration'),20 def: statement(`21 export type def = boolean;22 `).get('declaration'),23 xyz: statement(`24 export type xyz = string;25 `).get('declaration'),26 maybe: statement(`27 export type maybe = ?string;28 `).get('declaration'),29 barbaz: statement(`30 export type barbaz = "bar" | "baz";31 `).get('declaration'),32 recTup: statement(`33 export type recTup = [abc, xyz];34 import type { abc } from 'abc';35 import type { xyz } from 'xyz';36 `).get('declaration'),37 MyType: statement(`38 export type MyType = { a: string, b: ?notImported };39 `).get('declaration'),40 MyGenericType: statement(`41 export type MyType<T> = { a: T, b: Array<T> };42 `).get('declaration'),43 fruits: statement(`44 export default {45 'apple': 'ð',46 'banana': 'ð',47 };48 `).get('declaration'),49 otherFruits: statement(`50 export type OtherFruits = { orange: string };51 `).get('declaration'),52 });53 it('detects simple types', () => {54 const simplePropTypes = [55 'string',56 'number',57 'boolean',58 'any',59 'mixed',60 'null',61 'void',62 'empty',63 'Object',64 'Function',65 'Boolean',66 'String',67 'Number',68 ];69 simplePropTypes.forEach(type => {70 const typePath = expression('x: ' + type)71 .get('typeAnnotation')72 .get('typeAnnotation');73 expect(getFlowType(typePath, null, noopImporter)).toEqual({ name: type });74 });75 });76 it('detects literal types', () => {77 const literalTypes = ['"foo"', 1234, true];78 literalTypes.forEach(value => {79 const typePath = expression(`x: ${value}`)80 .get('typeAnnotation')81 .get('typeAnnotation');82 expect(getFlowType(typePath, null, noopImporter)).toEqual({83 name: 'literal',84 value: `${value}`,85 });86 });87 });88 it('detects external type', () => {89 const typePath = expression('x: xyz')90 .get('typeAnnotation')91 .get('typeAnnotation');92 expect(getFlowType(typePath, null, noopImporter)).toEqual({ name: 'xyz' });93 });94 it('resolves an imported type', () => {95 const typePath = statement(`96 (x: xyz);97 import type { xyz } from 'xyz';98 `).get('expression', 'typeAnnotation', 'typeAnnotation');99 expect(getFlowType(typePath, null, mockImporter)).toEqual({100 name: 'string',101 });102 });103 it('detects external nullable type', () => {104 const typePath = expression('x: ?xyz')105 .get('typeAnnotation')106 .get('typeAnnotation');107 expect(getFlowType(typePath, null, noopImporter)).toEqual({108 name: 'xyz',109 nullable: true,110 });111 });112 it('resolves an imported nullable type', () => {113 const typePath = statement(`114 (x: ?xyz);115 import type { xyz } from 'xyz';116 `).get('expression', 'typeAnnotation', 'typeAnnotation');117 expect(getFlowType(typePath, null, mockImporter)).toEqual({118 name: 'string',119 nullable: true,120 });121 });122 it('detects array type shorthand optional', () => {123 const typePath = expression('x: ?number[]')124 .get('typeAnnotation')125 .get('typeAnnotation');126 expect(getFlowType(typePath, null, noopImporter)).toEqual({127 name: 'Array',128 elements: [{ name: 'number' }],129 raw: 'number[]',130 nullable: true,131 });132 });133 it('detects array type shorthand optional type', () => {134 const typePath = expression('x: (?number)[]')135 .get('typeAnnotation')136 .get('typeAnnotation');137 expect(getFlowType(typePath, null, noopImporter)).toEqual({138 name: 'Array',139 elements: [{ name: 'number', nullable: true }],140 raw: '(?number)[]',141 });142 });143 it('detects array type shorthand', () => {144 const typePath = expression('x: number[]')145 .get('typeAnnotation')146 .get('typeAnnotation');147 expect(getFlowType(typePath, null, noopImporter)).toEqual({148 name: 'Array',149 elements: [{ name: 'number' }],150 raw: 'number[]',151 });152 });153 it('detects array type', () => {154 const typePath = expression('x: Array<number>')155 .get('typeAnnotation')156 .get('typeAnnotation');157 expect(getFlowType(typePath, null, noopImporter)).toEqual({158 name: 'Array',159 elements: [{ name: 'number' }],160 raw: 'Array<number>',161 });162 });163 it('resolves imported types used for arrays', () => {164 let typePath = statement(`165 (x: Array<xyz>);166 import type { xyz } from 'xyz';167 `).get('expression', 'typeAnnotation', 'typeAnnotation');168 expect(getFlowType(typePath, null, mockImporter)).toEqual({169 name: 'Array',170 elements: [{ name: 'string' }],171 raw: 'Array<xyz>',172 });173 typePath = statement(`174 (x: xyz[]);175 import type { xyz } from 'xyz';176 `).get('expression', 'typeAnnotation', 'typeAnnotation');177 expect(getFlowType(typePath, null, mockImporter)).toEqual({178 name: 'Array',179 elements: [{ name: 'string' }],180 raw: 'xyz[]',181 });182 typePath = statement(`183 (x: ?xyz[]);184 import type { xyz } from 'xyz';185 `).get('expression', 'typeAnnotation', 'typeAnnotation');186 expect(getFlowType(typePath, null, mockImporter)).toEqual({187 name: 'Array',188 elements: [{ name: 'string' }],189 raw: 'xyz[]',190 nullable: true,191 });192 typePath = statement(`193 (x: (?xyz)[]);194 import type { xyz } from 'xyz';195 `).get('expression', 'typeAnnotation', 'typeAnnotation');196 expect(getFlowType(typePath, null, mockImporter)).toEqual({197 name: 'Array',198 elements: [{ name: 'string', nullable: true }],199 raw: '(?xyz)[]',200 });201 });202 it('detects array type with multiple types', () => {203 const typePath = expression('x: Array<number, xyz>')204 .get('typeAnnotation')205 .get('typeAnnotation');206 expect(getFlowType(typePath, null, noopImporter)).toEqual({207 name: 'Array',208 elements: [{ name: 'number' }, { name: 'xyz' }],209 raw: 'Array<number, xyz>',210 });211 });212 it('resolves array type with multiple imported types', () => {213 const typePath = statement(`214 (x: Array<abc, xyz>);215 import type { abc } from 'abc';216 import type { xyz } from 'xyz';217 `).get('expression', 'typeAnnotation', 'typeAnnotation');218 expect(getFlowType(typePath, null, mockImporter)).toEqual({219 name: 'Array',220 elements: [{ name: 'number' }, { name: 'string' }],221 raw: 'Array<abc, xyz>',222 });223 });224 it('detects class type', () => {225 const typePath = expression('x: Class<Boolean>')226 .get('typeAnnotation')227 .get('typeAnnotation');228 expect(getFlowType(typePath, null, noopImporter)).toEqual({229 name: 'Class',230 elements: [{ name: 'Boolean' }],231 raw: 'Class<Boolean>',232 });233 });234 it('resolves imported subtype for class type', () => {235 const typePath = statement(`236 (x: Class<xyz>);237 import type { xyz } from 'xyz';238 `).get('expression', 'typeAnnotation', 'typeAnnotation');239 expect(getFlowType(typePath, null, mockImporter)).toEqual({240 name: 'Class',241 elements: [{ name: 'string' }],242 raw: 'Class<xyz>',243 });244 });245 it('detects function type with subtype', () => {246 const typePath = expression('x: Function<xyz>')247 .get('typeAnnotation')248 .get('typeAnnotation');249 expect(getFlowType(typePath, null, noopImporter)).toEqual({250 name: 'Function',251 elements: [{ name: 'xyz' }],252 raw: 'Function<xyz>',253 });254 });255 it('resolves imported subtype for function type', () => {256 const typePath = statement(`257 (x: Function<xyz>);258 import type { xyz } from 'xyz';259 `).get('expression', 'typeAnnotation', 'typeAnnotation');260 expect(getFlowType(typePath, null, mockImporter)).toEqual({261 name: 'Function',262 elements: [{ name: 'string' }],263 raw: 'Function<xyz>',264 });265 });266 it('detects object types', () => {267 const typePath = expression('x: { a: string, b?: xyz }')268 .get('typeAnnotation')269 .get('typeAnnotation');270 expect(getFlowType(typePath, null, noopImporter)).toEqual({271 name: 'signature',272 type: 'object',273 signature: {274 properties: [275 { key: 'a', value: { name: 'string', required: true } },276 { key: 'b', value: { name: 'xyz', required: false } },277 ],278 },279 raw: '{ a: string, b?: xyz }',280 });281 });282 it('detects object types with maybe type', () => {283 const typePath = expression('x: { a: string, b: ?xyz }')284 .get('typeAnnotation')285 .get('typeAnnotation');286 expect(getFlowType(typePath, null, noopImporter)).toEqual({287 name: 'signature',288 type: 'object',289 signature: {290 properties: [291 { key: 'a', value: { name: 'string', required: true } },292 { key: 'b', value: { name: 'xyz', nullable: true, required: true } },293 ],294 },295 raw: '{ a: string, b: ?xyz }',296 });297 });298 it('resolves imported types used for objects', () => {299 const typePath = statement(`300 (x: { a: abc, b: ?xyz, c?: xyz, d: maybe, e?: maybe });301 import type { abc } from 'abc';302 import type { xyz } from 'xyz';303 import type { maybe } from 'maybe';304 `).get('expression', 'typeAnnotation', 'typeAnnotation');305 expect(getFlowType(typePath, null, mockImporter)).toEqual({306 name: 'signature',307 type: 'object',308 signature: {309 properties: [310 { key: 'a', value: { name: 'number', required: true } },311 {312 key: 'b',313 value: { name: 'string', nullable: true, required: false },314 },315 {316 key: 'c',317 value: { name: 'string', nullable: true, required: false },318 },319 {320 key: 'd',321 value: { name: 'string', nullable: true, required: false },322 },323 {324 key: 'e',325 value: { name: 'string', nullable: true, required: false },326 },327 ],328 },329 raw: '{ a: abc, b: ?xyz, c?: xyz, d: maybe, e?: maybe }',330 });331 });332 it('detects union type', () => {333 const typePath = expression('x: string | xyz | "foo" | void')334 .get('typeAnnotation')335 .get('typeAnnotation');336 expect(getFlowType(typePath, null, noopImporter)).toEqual({337 name: 'union',338 elements: [339 { name: 'string' },340 { name: 'xyz' },341 { name: 'literal', value: '"foo"' },342 { name: 'void' },343 ],344 raw: 'string | xyz | "foo" | void',345 });346 });347 it('resolves imported types within union type', () => {348 const typePath = statement(`349 (x: string | barbaz | "foo" | void);350 import type { barbaz } from 'barbaz';351 `).get('expression', 'typeAnnotation', 'typeAnnotation');352 expect(getFlowType(typePath, null, mockImporter)).toEqual({353 name: 'union',354 elements: [355 { name: 'string' },356 {357 name: 'union',358 elements: [359 { name: 'literal', value: '"bar"' },360 { name: 'literal', value: '"baz"' },361 ],362 raw: '"bar" | "baz"',363 },364 { name: 'literal', value: '"foo"' },365 { name: 'void' },366 ],367 raw: 'string | barbaz | "foo" | void',368 });369 });370 it('detects intersection type', () => {371 const typePath = expression('x: string & xyz & "foo" & void')372 .get('typeAnnotation')373 .get('typeAnnotation');374 expect(getFlowType(typePath, null, noopImporter)).toEqual({375 name: 'intersection',376 elements: [377 { name: 'string' },378 { name: 'xyz' },379 { name: 'literal', value: '"foo"' },380 { name: 'void' },381 ],382 raw: 'string & xyz & "foo" & void',383 });384 });385 it('resolves imported types within intersection type', () => {386 const typePath = statement(`387 (x: string & barbaz & "foo" & void);388 import type { barbaz } from 'barbaz';389 `).get('expression', 'typeAnnotation', 'typeAnnotation');390 expect(getFlowType(typePath, null, mockImporter)).toEqual({391 name: 'intersection',392 elements: [393 { name: 'string' },394 {395 name: 'union',396 elements: [397 { name: 'literal', value: '"bar"' },398 { name: 'literal', value: '"baz"' },399 ],400 raw: '"bar" | "baz"',401 },402 { name: 'literal', value: '"foo"' },403 { name: 'void' },404 ],405 raw: 'string & barbaz & "foo" & void',406 });407 });408 it('detects function signature type', () => {409 const typePath = expression(410 'x: (p1: number, p2: ?string, ...rest: Array<string>) => boolean',411 )412 .get('typeAnnotation')413 .get('typeAnnotation');414 expect(getFlowType(typePath, null, noopImporter)).toEqual({415 name: 'signature',416 type: 'function',417 signature: {418 arguments: [419 { name: 'p1', type: { name: 'number' } },420 { name: 'p2', type: { name: 'string', nullable: true } },421 {422 name: 'rest',423 rest: true,424 type: {425 name: 'Array',426 elements: [{ name: 'string' }],427 raw: 'Array<string>',428 },429 },430 ],431 return: { name: 'boolean' },432 },433 raw: '(p1: number, p2: ?string, ...rest: Array<string>) => boolean',434 });435 });436 it('detects function signature types without parameter names', () => {437 const typePath = expression('x: (number, ?string) => boolean')438 .get('typeAnnotation')439 .get('typeAnnotation');440 expect(getFlowType(typePath, null, noopImporter)).toEqual({441 name: 'signature',442 type: 'function',443 signature: {444 arguments: [445 { name: '', type: { name: 'number' } },446 { name: '', type: { name: 'string', nullable: true } },447 ],448 return: { name: 'boolean' },449 },450 raw: '(number, ?string) => boolean',451 });452 });453 it('detects function signature type with single parmeter without name', () => {454 const typePath = expression('x: string => boolean')455 .get('typeAnnotation')456 .get('typeAnnotation');457 expect(getFlowType(typePath, null, noopImporter)).toEqual({458 name: 'signature',459 type: 'function',460 signature: {461 arguments: [{ name: '', type: { name: 'string' } }],462 return: { name: 'boolean' },463 },464 raw: 'string => boolean',465 });466 });467 it('detects callable signature type', () => {468 const typePath = expression('x: { (str: string): string, token: string }')469 .get('typeAnnotation')470 .get('typeAnnotation');471 expect(getFlowType(typePath, null, noopImporter)).toEqual({472 name: 'signature',473 type: 'object',474 signature: {475 constructor: {476 name: 'signature',477 type: 'function',478 signature: {479 arguments: [{ name: 'str', type: { name: 'string' } }],480 return: { name: 'string' },481 },482 raw: '(str: string): string',483 },484 properties: [485 { key: 'token', value: { name: 'string', required: true } },486 ],487 },488 raw: '{ (str: string): string, token: string }',489 });490 });491 it('resolves function signature types with imported types', () => {492 let typePath = statement(`493 (x: (p1: abc, p2: ?xyz, ...rest: Array<xyz>) => def);494 import type { abc } from 'abc';495 import type { def } from 'def';496 import type { xyz } from 'xyz';497 `).get('expression', 'typeAnnotation', 'typeAnnotation');498 expect(getFlowType(typePath, null, mockImporter)).toEqual({499 name: 'signature',500 type: 'function',501 signature: {502 arguments: [503 { name: 'p1', type: { name: 'number' } },504 { name: 'p2', type: { name: 'string', nullable: true } },505 {506 name: 'rest',507 rest: true,508 type: {509 name: 'Array',510 elements: [{ name: 'string', nullable: true }],511 raw: 'Array<xyz>',512 },513 },514 ],515 return: { name: 'boolean' },516 },517 raw: '(p1: abc, p2: ?xyz, ...rest: Array<xyz>) => def',518 });519 typePath = statement(`520 (x: (abc, ?xyz) => def);521 import type { abc } from 'abc';522 import type { def } from 'def';523 import type { xyz } from 'xyz';524 `).get('expression', 'typeAnnotation', 'typeAnnotation');525 expect(getFlowType(typePath, null, mockImporter)).toEqual({526 name: 'signature',527 type: 'function',528 signature: {529 arguments: [530 { name: '', type: { name: 'number' } },531 { name: '', type: { name: 'string', nullable: true } },532 ],533 return: { name: 'boolean' },534 },535 raw: '(abc, ?xyz) => def',536 });537 typePath = statement(`538 (x: xyz => def);539 import type { def } from 'def';540 import type { xyz } from 'xyz';541 `).get('expression', 'typeAnnotation', 'typeAnnotation');542 expect(getFlowType(typePath, null, mockImporter)).toEqual({543 name: 'signature',544 type: 'function',545 signature: {546 arguments: [{ name: '', type: { name: 'string' } }],547 return: { name: 'boolean' },548 },549 raw: 'xyz => def',550 });551 typePath = statement(`552 (x: { (str: xyz): abc, token: def });553 import type { abc } from 'abc';554 import type { def } from 'def';555 import type { xyz } from 'xyz';556 `).get('expression', 'typeAnnotation', 'typeAnnotation');557 expect(getFlowType(typePath, null, mockImporter)).toEqual({558 name: 'signature',559 type: 'object',560 signature: {561 constructor: {562 name: 'signature',563 type: 'function',564 signature: {565 arguments: [{ name: 'str', type: { name: 'string' } }],566 return: { name: 'number' },567 },568 raw: '(str: xyz): abc',569 },570 properties: [571 { key: 'token', value: { name: 'boolean', required: true } },572 ],573 },574 raw: '{ (str: xyz): abc, token: def }',575 });576 });577 it('detects map signature', () => {578 const typePath = expression(579 'x: { [key: string]: number, [key: "xl"]: string, token: "a" | "b" }',580 )581 .get('typeAnnotation')582 .get('typeAnnotation');583 expect(getFlowType(typePath, null, noopImporter)).toEqual({584 name: 'signature',585 type: 'object',586 signature: {587 properties: [588 {589 key: { name: 'string' },590 value: { name: 'number', required: true },591 },592 {593 key: { name: 'literal', value: '"xl"' },594 value: { name: 'string', required: true },595 },596 {597 key: 'token',598 value: {599 name: 'union',600 required: true,601 raw: '"a" | "b"',602 elements: [603 { name: 'literal', value: '"a"' },604 { name: 'literal', value: '"b"' },605 ],606 },607 },608 ],609 },610 raw: '{ [key: string]: number, [key: "xl"]: string, token: "a" | "b" }',611 });612 });613 it('resolves imported types in map signature', () => {614 const typePath = statement(`615 (x: { [key: xyz]: abc, [key: "xl"]: def, token: barbaz });616 import type { abc } from 'abc';617 import type { def } from 'def';618 import type { xyz } from 'xyz';619 import type { barbaz } from 'barbaz';620 `).get('expression', 'typeAnnotation', 'typeAnnotation');621 expect(getFlowType(typePath, null, mockImporter)).toEqual({622 name: 'signature',623 type: 'object',624 signature: {625 properties: [626 {627 key: { name: 'string' },628 value: { name: 'number', required: true },629 },630 {631 key: { name: 'literal', value: '"xl"' },632 value: { name: 'boolean', required: true },633 },634 {635 key: 'token',636 value: {637 name: 'union',638 required: true,639 raw: '"bar" | "baz"',640 elements: [641 { name: 'literal', value: '"bar"' },642 { name: 'literal', value: '"baz"' },643 ],644 },645 },646 ],647 },648 raw: '{ [key: xyz]: abc, [key: "xl"]: def, token: barbaz }',649 });650 });651 it('detects tuple signature', () => {652 const typePath = expression('x: [string, number]')653 .get('typeAnnotation')654 .get('typeAnnotation');655 expect(getFlowType(typePath, null, noopImporter)).toEqual({656 name: 'tuple',657 elements: [{ name: 'string' }, { name: 'number' }],658 raw: '[string, number]',659 });660 });661 it('detects tuple in union signature', () => {662 const typePath = expression('x: [string, number] | [number, string]')663 .get('typeAnnotation')664 .get('typeAnnotation');665 expect(getFlowType(typePath, null, noopImporter)).toEqual({666 name: 'union',667 elements: [668 {669 name: 'tuple',670 elements: [{ name: 'string' }, { name: 'number' }],671 raw: '[string, number]',672 },673 {674 name: 'tuple',675 elements: [{ name: 'number' }, { name: 'string' }],676 raw: '[number, string]',677 },678 ],679 raw: '[string, number] | [number, string]',680 });681 });682 it('resolves imported types used in tuple signature', () => {683 let typePath = statement(`684 (x: [xyz, abc]);685 import type { abc } from 'abc';686 import type { xyz } from 'xyz';687 `).get('expression', 'typeAnnotation', 'typeAnnotation');688 expect(getFlowType(typePath, null, mockImporter)).toEqual({689 name: 'tuple',690 elements: [{ name: 'string' }, { name: 'number' }],691 raw: '[xyz, abc]',692 });693 typePath = statement(`694 (x: [xyz, abc] | recTup);695 import type { abc } from 'abc';696 import type { xyz } from 'xyz';697 import type { recTup } from 'recTup';698 `).get('expression', 'typeAnnotation', 'typeAnnotation');699 expect(getFlowType(typePath, null, mockImporter)).toEqual({700 name: 'union',701 elements: [702 {703 name: 'tuple',704 elements: [{ name: 'string' }, { name: 'number' }],705 raw: '[xyz, abc]',706 },707 {708 name: 'tuple',709 elements: [{ name: 'number' }, { name: 'string' }],710 raw: '[abc, xyz]',711 },712 ],713 raw: '[xyz, abc] | recTup',714 });715 });716 it('resolves types in scope', () => {717 const typePath = statement(`718 var x: MyType = 2;719 type MyType = string;720 `)721 .get('declarations', 0)722 .get('id')723 .get('typeAnnotation')724 .get('typeAnnotation');725 expect(getFlowType(typePath, null, noopImporter)).toEqual({726 name: 'string',727 });728 });729 it('handles typeof types', () => {730 const typePath = statement(`731 var x: typeof MyType = {};732 type MyType = { a: string, b: ?xyz };733 `)734 .get('declarations', 0)735 .get('id')736 .get('typeAnnotation')737 .get('typeAnnotation');738 expect(getFlowType(typePath, null, noopImporter)).toEqual({739 name: 'signature',740 type: 'object',741 signature: {742 properties: [743 { key: 'a', value: { name: 'string', required: true } },744 { key: 'b', value: { name: 'xyz', nullable: true, required: true } },745 ],746 },747 raw: '{ a: string, b: ?xyz }',748 });749 });750 it('resolves typeof of imported types', () => {751 const typePath = statement(`752 var x: typeof MyType = {};753 import type { MyType } from 'MyType';754 `)755 .get('declarations', 0)756 .get('id')757 .get('typeAnnotation')758 .get('typeAnnotation');759 expect(getFlowType(typePath, null, mockImporter)).toEqual({760 name: 'signature',761 type: 'object',762 signature: {763 properties: [764 { key: 'a', value: { name: 'string', required: true } },765 {766 key: 'b',767 value: { name: 'notImported', nullable: true, required: true },768 },769 ],770 },771 raw: '{ a: string, b: ?notImported }',772 });773 });774 it('handles qualified type identifiers', () => {775 const typePath = statement(`776 var x: MyType.x = {};777 type MyType = { a: string, b: ?xyz };778 `)779 .get('declarations', 0)780 .get('id')781 .get('typeAnnotation')782 .get('typeAnnotation');783 expect(getFlowType(typePath, null, noopImporter)).toEqual({784 name: 'MyType.x',785 });786 });787 it('handles qualified type identifiers with params', () => {788 const typePath = statement(`789 var x: MyType.x<any> = {};790 type MyType = { a: string, b: ?xyz };791 `)792 .get('declarations', 0)793 .get('id')794 .get('typeAnnotation')795 .get('typeAnnotation');796 expect(getFlowType(typePath, null, noopImporter)).toEqual({797 name: 'MyType.x',798 raw: 'MyType.x<any>',799 elements: [800 {801 name: 'any',802 },803 ],804 });805 });806 it('handles generic types', () => {807 const typePath = statement(`808 var x: MyType<string> = {};809 type MyType<T> = { a: T, b: Array<T> };810 `)811 .get('declarations', 0)812 .get('id')813 .get('typeAnnotation')814 .get('typeAnnotation');815 expect(getFlowType(typePath, null, noopImporter)).toEqual({816 name: 'signature',817 type: 'object',818 raw: '{ a: T, b: Array<T> }',819 signature: {820 properties: [821 {822 key: 'a',823 value: {824 name: 'string',825 required: true,826 },827 },828 {829 key: 'b',830 value: {831 name: 'Array',832 raw: 'Array<T>',833 required: true,834 elements: [{ name: 'string' }],835 },836 },837 ],838 },839 });840 });841 it('resolves imported types that need subtypes', () => {842 const typePath = statement(`843 var x: MyGenericType<string> = {};844 import type { MyGenericType } from 'MyGenericType';845 `)846 .get('declarations', 0)847 .get('id')848 .get('typeAnnotation')849 .get('typeAnnotation');850 expect(getFlowType(typePath, null, mockImporter)).toEqual({851 name: 'signature',852 type: 'object',853 raw: '{ a: T, b: Array<T> }',854 signature: {855 properties: [856 {857 key: 'a',858 value: {859 name: 'string',860 required: true,861 },862 },863 {864 key: 'b',865 value: {866 name: 'Array',867 raw: 'Array<T>',868 required: true,869 elements: [{ name: 'string' }],870 },871 },872 ],873 },874 });875 });876 describe('React types', () => {877 function test(type, expected) {878 const typePath = statement(`879 var x: ${type} = 2;880 type Props = { x: string };881 `)882 .get('declarations', 0)883 .get('id')884 .get('typeAnnotation')885 .get('typeAnnotation');886 expect(getFlowType(typePath, null, noopImporter)).toEqual({887 ...expected,888 name: type.replace('.', '').replace(/<.+>/, ''),889 raw: type,890 });891 }892 const types = {893 'React.Node': {},894 'React.Key': {},895 'React.ElementType': {},896 'React.ChildrenArray<string>': { elements: [{ name: 'string' }] },897 'React.Element<any>': { elements: [{ name: 'any' }] },898 'React.Ref<typeof Component>': { elements: [{ name: 'Component' }] },899 'React.ElementProps<Component>': { elements: [{ name: 'Component' }] },900 'React.ElementRef<Component>': { elements: [{ name: 'Component' }] },901 'React.ComponentType<Props>': {902 elements: [903 {904 name: 'signature',905 raw: '{ x: string }',906 signature: {907 properties: [908 { key: 'x', value: { name: 'string', required: true } },909 ],910 },911 type: 'object',912 },913 ],914 },915 'React.StatelessFunctionalComponent<Props2>': {916 elements: [{ name: 'Props2' }],917 },918 };919 Object.keys(types).forEach(type => {920 it(type, () => test(type, types[type]));921 });922 });923 it('resolves $Keys to union', () => {924 const typePath = statement(`925 var x: $Keys<typeof CONTENTS> = 2;926 const CONTENTS = {927 'apple': 'ð',928 'banana': 'ð',929 };930 `)931 .get('declarations', 0)932 .get('id')933 .get('typeAnnotation')934 .get('typeAnnotation');935 expect(getFlowType(typePath, null, noopImporter)).toEqual({936 name: 'union',937 elements: [938 { name: 'literal', value: "'apple'" },939 { name: 'literal', value: "'banana'" },940 ],941 raw: '$Keys<typeof CONTENTS>',942 });943 });944 it('resolves $Keys without typeof to union', () => {945 const typePath = statement(`946 var x: $Keys<CONTENTS> = 2;947 const CONTENTS = {948 'apple': 'ð',949 'banana': 'ð',950 };951 `)952 .get('declarations', 0)953 .get('id')954 .get('typeAnnotation')955 .get('typeAnnotation');956 expect(getFlowType(typePath, null, noopImporter)).toEqual({957 name: 'union',958 elements: [959 { name: 'literal', value: "'apple'" },960 { name: 'literal', value: "'banana'" },961 ],962 raw: '$Keys<CONTENTS>',963 });964 });965 it('resolves $Keys with an ObjectTypeAnnotation typeParameter to union', () => {966 const typePath = statement(`967 var x: $Keys<{| apple: string, banana: string |}> = 2;968 `)969 .get('declarations', 0)970 .get('id')971 .get('typeAnnotation')972 .get('typeAnnotation');973 expect(getFlowType(typePath, null, noopImporter)).toEqual({974 name: 'union',975 elements: [976 { name: 'literal', value: 'apple' },977 { name: 'literal', value: 'banana' },978 ],979 raw: '$Keys<{| apple: string, banana: string |}>',980 });981 });982 it('resolves $Keys with an ObjectTypeAnnotation typeParameter to union with an ObjectTypeSpreadProperty', () => {983 const typePath = statement(`984 var x: $Keys<{| apple: string, banana: string, ...OtherFruits |}> = 2;985 type OtherFruits = { orange: string }986 `)987 .get('declarations', 0)988 .get('id')989 .get('typeAnnotation')990 .get('typeAnnotation');991 expect(getFlowType(typePath, null, noopImporter)).toEqual({992 name: 'union',993 elements: [994 { name: 'literal', value: 'apple' },995 { name: 'literal', value: 'banana' },996 { name: 'literal', value: 'orange' },997 ],998 raw: '$Keys<{| apple: string, banana: string, ...OtherFruits |}>',999 });1000 });1001 it('resolves $Keys to imported types', () => {1002 let typePath = statement(`1003 var x: $Keys<typeof CONTENTS> = 2;1004 import CONTENTS from 'fruits';1005 `)1006 .get('declarations', 0)1007 .get('id')1008 .get('typeAnnotation')1009 .get('typeAnnotation');1010 expect(getFlowType(typePath, null, mockImporter)).toEqual({1011 name: 'union',1012 elements: [1013 { name: 'literal', value: "'apple'" },1014 { name: 'literal', value: "'banana'" },1015 ],1016 raw: '$Keys<typeof CONTENTS>',1017 });1018 typePath = statement(`1019 var x: $Keys<CONTENTS> = 2;1020 import CONTENTS from 'fruits';1021 `)1022 .get('declarations', 0)1023 .get('id')1024 .get('typeAnnotation')1025 .get('typeAnnotation');1026 expect(getFlowType(typePath, null, mockImporter)).toEqual({1027 name: 'union',1028 elements: [1029 { name: 'literal', value: "'apple'" },1030 { name: 'literal', value: "'banana'" },1031 ],1032 raw: '$Keys<CONTENTS>',1033 });1034 typePath = statement(`1035 var x: $Keys<{| apple: string, banana: string, ...OtherFruits |}> = 2;1036 import type { OtherFruits } from 'otherFruits';1037 `)1038 .get('declarations', 0)1039 .get('id')1040 .get('typeAnnotation')1041 .get('typeAnnotation');1042 expect(getFlowType(typePath, null, mockImporter)).toEqual({1043 name: 'union',1044 elements: [1045 { name: 'literal', value: 'apple' },1046 { name: 'literal', value: 'banana' },1047 { name: 'literal', value: 'orange' },1048 ],1049 raw: '$Keys<{| apple: string, banana: string, ...OtherFruits |}>',1050 });1051 });1052 it('handles multiple references to one type', () => {1053 const typePath = statement(`1054 let action: { a: Action, b: Action };1055 type Action = {};1056 `)1057 .get('declarations', 0)1058 .get('id')1059 .get('typeAnnotation')1060 .get('typeAnnotation');1061 expect(getFlowType(typePath, null, noopImporter)).toEqual({1062 name: 'signature',1063 type: 'object',1064 signature: {1065 properties: [1066 {1067 key: 'a',1068 value: {1069 name: 'signature',1070 type: 'object',1071 required: true,1072 raw: '{}',1073 signature: { properties: [] },1074 },1075 },1076 {1077 key: 'b',1078 value: {1079 name: 'signature',1080 type: 'object',1081 required: true,1082 raw: '{}',1083 signature: { properties: [] },1084 },1085 },1086 ],1087 },1088 raw: '{ a: Action, b: Action }',1089 });1090 });1091 it('handles self-referencing type cycles', () => {1092 const typePath = statement(`1093 let action: Action;1094 type Action = { subAction: Action };1095 `)1096 .get('declarations', 0)1097 .get('id')1098 .get('typeAnnotation')1099 .get('typeAnnotation');1100 expect(getFlowType(typePath, null, noopImporter)).toEqual({1101 name: 'signature',1102 type: 'object',1103 signature: {1104 properties: [1105 { key: 'subAction', value: { name: 'Action', required: true } },1106 ],1107 },1108 raw: '{ subAction: Action }',1109 });1110 });1111 it('handles long type cycles', () => {1112 const typePath = statement(`1113 let action: Action;1114 type Action = { subAction: SubAction };1115 type SubAction = { subAction: SubSubAction };1116 type SubSubAction = { subAction: SubSubSubAction };1117 type SubSubSubAction = { rootAction: Action };1118 `)1119 .get('declarations', 0)1120 .get('id')1121 .get('typeAnnotation')1122 .get('typeAnnotation');1123 expect(getFlowType(typePath, null, noopImporter)).toEqual({1124 name: 'signature',1125 type: 'object',1126 signature: {1127 properties: [1128 {1129 key: 'subAction',1130 value: {1131 name: 'signature',1132 type: 'object',1133 required: true,1134 signature: {1135 properties: [1136 {1137 key: 'subAction',1138 value: {1139 name: 'signature',1140 type: 'object',1141 required: true,1142 signature: {1143 properties: [1144 {1145 key: 'subAction',1146 value: {1147 name: 'signature',1148 type: 'object',1149 required: true,1150 signature: {1151 properties: [1152 {1153 key: 'rootAction',1154 value: { name: 'Action', required: true },1155 },1156 ],1157 },1158 raw: '{ rootAction: Action }',1159 },1160 },1161 ],1162 },1163 raw: '{ subAction: SubSubSubAction }',1164 },1165 },1166 ],1167 },1168 raw: '{ subAction: SubSubAction }',1169 },1170 },1171 ],1172 },1173 raw: '{ subAction: SubAction }',1174 });1175 });...
inferer-reference.js
Source:inferer-reference.js
1"use strict";2exports.__esModule = true;3var _getIterator2 = require("babel-runtime/core-js/get-iterator");4var _getIterator3 = _interopRequireDefault(_getIterator2);5exports.default = function (node) {6 if (!this.isReferenced()) return;7 var binding = this.scope.getBinding(node.name);8 if (binding) {9 if (binding.identifier.typeAnnotation) {10 return binding.identifier.typeAnnotation;11 } else {12 return getTypeAnnotationBindingConstantViolations(this, node.name);13 }14 }15 if (node.name === "undefined") {16 return t.voidTypeAnnotation();17 } else if (node.name === "NaN" || node.name === "Infinity") {18 return t.numberTypeAnnotation();19 } else if (node.name === "arguments") {}20};21var _babelTypes = require("babel-types");22var t = _interopRequireWildcard(_babelTypes);23function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }24function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }25function getTypeAnnotationBindingConstantViolations(path, name) {26 var binding = path.scope.getBinding(name);27 var types = [];28 path.typeAnnotation = t.unionTypeAnnotation(types);29 var functionConstantViolations = [];30 var constantViolations = getConstantViolationsBefore(binding, path, functionConstantViolations);31 var testType = getConditionalAnnotation(path, name);32 if (testType) {33 (function () {34 var testConstantViolations = getConstantViolationsBefore(binding, testType.ifStatement);35 constantViolations = constantViolations.filter(function (path) {36 return testConstantViolations.indexOf(path) < 0;37 });38 types.push(testType.typeAnnotation);39 })();40 }41 if (constantViolations.length) {42 constantViolations = constantViolations.concat(functionConstantViolations);43 for (var _iterator = constantViolations, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {44 var _ref;45 if (_isArray) {46 if (_i >= _iterator.length) break;47 _ref = _iterator[_i++];48 } else {49 _i = _iterator.next();50 if (_i.done) break;51 _ref = _i.value;52 }53 var violation = _ref;54 types.push(violation.getTypeAnnotation());55 }56 }57 if (types.length) {58 return t.createUnionTypeAnnotation(types);59 }60}61function getConstantViolationsBefore(binding, path, functions) {62 var violations = binding.constantViolations.slice();63 violations.unshift(binding.path);64 return violations.filter(function (violation) {65 violation = violation.resolve();66 var status = violation._guessExecutionStatusRelativeTo(path);67 if (functions && status === "function") functions.push(violation);68 return status === "before";69 });70}71function inferAnnotationFromBinaryExpression(name, path) {72 var operator = path.node.operator;73 var right = path.get("right").resolve();74 var left = path.get("left").resolve();75 var target = void 0;76 if (left.isIdentifier({ name: name })) {77 target = right;78 } else if (right.isIdentifier({ name: name })) {79 target = left;80 }81 if (target) {82 if (operator === "===") {83 return target.getTypeAnnotation();84 } else if (t.BOOLEAN_NUMBER_BINARY_OPERATORS.indexOf(operator) >= 0) {85 return t.numberTypeAnnotation();86 } else {87 return;88 }89 } else {90 if (operator !== "===") return;91 }92 var typeofPath = void 0;93 var typePath = void 0;94 if (left.isUnaryExpression({ operator: "typeof" })) {95 typeofPath = left;96 typePath = right;97 } else if (right.isUnaryExpression({ operator: "typeof" })) {98 typeofPath = right;99 typePath = left;100 }101 if (!typePath && !typeofPath) return;102 typePath = typePath.resolve();103 if (!typePath.isLiteral()) return;104 var typeValue = typePath.node.value;105 if (typeof typeValue !== "string") return;106 if (!typeofPath.get("argument").isIdentifier({ name: name })) return;107 return t.createTypeAnnotationBasedOnTypeof(typePath.node.value);108}109function getParentConditionalPath(path) {110 var parentPath = void 0;111 while (parentPath = path.parentPath) {112 if (parentPath.isIfStatement() || parentPath.isConditionalExpression()) {113 if (path.key === "test") {114 return;115 } else {116 return parentPath;117 }118 } else {119 path = parentPath;120 }121 }122}123function getConditionalAnnotation(path, name) {124 var ifStatement = getParentConditionalPath(path);125 if (!ifStatement) return;126 var test = ifStatement.get("test");127 var paths = [test];128 var types = [];129 do {130 var _path = paths.shift().resolve();131 if (_path.isLogicalExpression()) {132 paths.push(_path.get("left"));133 paths.push(_path.get("right"));134 }135 if (_path.isBinaryExpression()) {136 var type = inferAnnotationFromBinaryExpression(name, _path);137 if (type) types.push(type);138 }139 } while (paths.length);140 if (types.length) {141 return {142 typeAnnotation: t.createUnionTypeAnnotation(types),143 ifStatement: ifStatement144 };145 } else {146 return getConditionalAnnotation(ifStatement, name);147 }148}...
Using AI Code Generation
1import { typePath } from 'ts-auto-mock';2import { typePath } from 'ts-auto-mock';3import { typePath } from 'ts-auto-mock';4import { typePath } from 'ts-auto-mock';5import { typePath } from 'ts-auto-mock';6import { typePath } from 'ts-auto-mock';7import { typePath } from 'ts-auto-mock';8import { typePath } from 'ts-auto-mock';9import { typePath } from 'ts-auto-mock';10import { typePath } from 'ts-auto-mock';11import { typePath } from 'ts-auto-mock';12import { typePath } from 'ts-auto-mock';13import { typePath } from 'ts-auto-mock';14import { typePath } from 'ts-auto-mock';15import { typePath } from 'ts-auto-mock';16import { typePath } from 'ts-auto-mock';17import { typePath } from 'ts-auto-mock';18import { typePath } from 'ts-auto-mock';
Using AI Code Generation
1import {typePath} from 'ts-auto-mock';2console.log(typePath('test1.ts'));3import {typePath} from 'ts-auto-mock';4console.log(typePath('test2.ts'));5import {typePath} from 'ts-auto-mock';6console.log(typePath('test3.ts'));7import {typePath} from 'ts-auto-mock';8console.log(typePath('test4.ts'));9import {typePath} from 'ts-auto-mock';10console.log(typePath('test5.ts'));11import {typePath} from 'ts-auto-mock';12console.log(typePath('test6.ts'));13import {typePath} from 'ts-auto-mock';14console.log(typePath('test7.ts'));15import {typePath} from 'ts-auto-mock';16console.log(typePath('test8.ts'));17import {typePath} from 'ts-auto-mock';18console.log(typePath('test9.ts'));19import {typePath} from 'ts-auto-mock';20console.log(typePath('test10.ts'));21import {typePath} from 'ts-auto-mock';22console.log(typePath('test
Using AI Code Generation
1import {typePath} from 'ts-auto-mock';2typePath('src/test1.ts', 'src/test1.mock.ts');3import {typePath} from 'ts-auto-mock';4typePath('src/test2.ts', 'src/test2.mock.ts');5import {typePath} from 'ts-auto-mock';6typePath('src/test3.ts', 'src/test3.mock.ts');7import {typePath} from 'ts-auto-mock';8typePath('src/test4.ts', 'src/test4.mock.ts');9import {typePath} from 'ts-auto-mock';10typePath('src/test5.ts', 'src/test5.mock.ts');11import {typePath} from 'ts-auto-mock';12typePath('src/test6.ts', 'src/test6.mock.ts');13import {typePath} from 'ts-auto-mock';14typePath('src/test7.ts', 'src/test7.mock.ts');15import {typePath} from 'ts-auto-mock';16typePath('src/test8.ts', 'src/test8.mock.ts');17import {typePath} from 'ts-auto-mock';18typePath('src/test9.ts', 'src/test9.mock.ts');19import {typePath} from 'ts-auto-mock';20typePath('src/test10.ts', 'src/test10.mock.ts');21import {typePath} from 'ts-auto-mock';22typePath('src/test11.ts', 'src/test11.mock.ts');
Using AI Code Generation
1import { typePath } from 'ts-auto-mock';2describe('typePath', () => {3 it('should return the path of the type', () => {4 type MyType = {5 a: {6 b: {7 c: {8 d: {9 e: {10 f: {11 g: {12 h: {13 i: {14 j: {15 k: {16 l: {17 m: {18 n: {19 o: {20 p: {21 q: {22 r: {23 s: {24 t: {25 u: {26 v: {27 w: {28 x: {29 y: {30 z: {31 a: {32 b: {33 c: {34 d: {35 e: {36 f: {37 g: {38 h: {39 i: {40 j: {41 k: {42 l: {43 m: {44 n: {45 o: {46 p: {47 q: {48 r: {49 s: {50 t: {51 u: {52 v: {53 w: {54 x: {55 y: {56 z: {57 a: {58 b: {59 c: {60 d: {61 e: {62 f: {63 g: {64 h: {65 i: {66 j: {67 k: {68 l: {69 m: {70 n: {71 o: {72 p: {73 q: {74 r: {75 s: {76 t: {77 u: {78 v: {79 w: {80 x: {81 y: {82 z: {83 a: {84 b: {85 c: {86 d: {87 e: {88 f: {89 g: {90 h: {91 i: {92 j: {93 k: {94 l: {95 m: {96 n: {97 o: {98 p: {99 q: {100 r: {101 s: {102 t: {103 u: {104 v: {
Using AI Code Generation
1import {typePath} from 'ts-auto-mock';2const path = typePath<YourType>();3import {typePath} from 'ts-auto-mock';4const path = typePath<YourType>();5import {typePath} from 'ts-auto-mock';6const path = typePath<YourType>();7import {typePath} from 'ts-auto-mock';8const path = typePath<YourType>();9import {typePath} from 'ts-auto-mock';10const path = typePath<YourType>();11import {typePath} from 'ts-auto-mock';12const path = typePath<YourType>();13import {typePath} from 'ts-auto-mock';14const path = typePath<YourType>();15import {typePath} from 'ts-auto-mock';16const path = typePath<YourType>();17import {typePath} from 'ts-auto-mock';18const path = typePath<YourType>();19import {typePath} from 'ts-auto-mock';20const path = typePath<YourType>();21import {typePath} from 'ts-auto-mock';
Using AI Code Generation
1import { typePath } from 'ts-auto-mock';2typePath('src/test1.ts');3import { typePath } from 'ts-auto-mock';4typePath('src/test2.ts');5import { typePath } from 'ts-auto-mock';6typePath('src/test3.ts');7import { typePath } from 'ts-auto-mock';8typePath('src/test4.ts');9import { typePath } from 'ts-auto-mock';10typePath('src/test5.ts');11import { typePath } from 'ts-auto-mock';12typePath('src/test6.ts');13import { typePath } from 'ts-auto-mock';14typePath('src/test7.ts');15import { typePath } from 'ts-auto-mock';16typePath('src/test8.ts');
Using AI Code Generation
1import {typePath} from 'ts-auto-mock';2import * as tsAutoMock from 'ts-auto-mock';3import * as tsAutoMock from 'ts-auto-mock/extension';4import tsAutoMock from 'ts-auto-mock/extension';5import {tsAutoMock} from 'ts-auto-mock/extension';6import {typePath} from 'ts-auto-mock';7import * as tsAutoMock from 'ts-auto-mock';8import * as tsAutoMock from 'ts-auto-mock/extension';9import tsAutoMock from 'ts-auto-mock/extension';10import {tsAutoMock} from 'ts-auto-mock/extension';11import {typePath} from 'ts-auto-mock/extension';12import {typePath} from 'ts-auto-mock/extension';13import {typePath} from 'ts-auto-mock/extension';14import {typePath} from 'ts-auto-mock/extension';15import {typePath} from 'ts-auto-mock/extension';16import {typePath} from 'ts-auto-mock/extension';17import {typePath} from 'ts-auto-mock/extension';18import {typePath} from 'ts-auto-mock/extension';19import {typePath} from 'ts-auto-mock/extension';20import {typePath} from 'ts-auto-mock/extension';21import {typePath} from 'ts-auto-mock/extension';22import {typePath} from 'ts-auto-mock/extension';23import {typePath} from 'ts-auto-mock/extension';
Using AI Code Generation
1import {typePath} from 'ts-auto-mock';2const path = typePath<InterfaceName>();3console.log(path);4import {typePath} from 'ts-auto-mock';5const path = typePath<InterfaceName>();6console.log(path);
Using AI Code Generation
1import { typePath } from 'ts-auto-mock';2import { Test1 } from './test1';3typePath<Test1>('/Users/username/Projects/myproject/src/test1.ts');4import { typePath } from 'ts-auto-mock';5import { Test2 } from './test2';6typePath<Test2>('/Users/username/Projects/myproject/src/test2.ts');7import {typePath} from 'ts-auto-mock';8const path = typePath<YourType>();9import {typePath} from 'ts-auto-mock';10const path = typePath<YourType>();11import {typePath} from 'ts-auto-mock';12const path = typePath<YourType>();13import {typePath} from 'ts-auto-mock';14const path = typePath<YourType>();15import {typePath} from 'ts-auto-mock';16const path = typePath<YourType>();17import {typePath} from 'ts-auto-mock';18const path = typePath<YourType>();19import {typePath} from 'ts-auto-mock';20const path = typePath<YourType>();21import {typePath} from 'ts-auto-mock';22const path = typePath<YourType>();23import {typePath} from 'ts-auto-mock';24const path = typePath<YourType>();25import {typePath} from 'ts-auto-mock';26const path = typePath<YourType>();27import {typePath} from 'ts-auto-mock';
Using AI Code Generation
1import { typePath } from 'ts-auto-mock';2typePath('src/test1.ts');3import { typePath } from 'ts-auto-mock';4typePath('src/test2.ts');5import { typePath } from 'ts-auto-mock';6typePath('src/test3.ts');7import { typePath } from 'ts-auto-mock';8typePath('src/test4.ts');9import { typePath } from 'ts-auto-mock';10typePath('src/test5.ts');11import { typePath } from 'ts-auto-mock';12typePath('src/test6.ts');13import { typePath } from 'ts-auto-mock';14typePath('src/test7.ts');15import { typePath } from 'ts-auto-mock';16typePath('src/test8.ts');
Using AI Code Generation
1import {typePath} from 'ts-auto-mock';2import * as tsAutoMock from 'ts-auto-mock';3import * as tsAutoMock from 'ts-auto-mock/extension';4import tsAutoMock from 'ts-auto-mock/extension';5import {tsAutoMock} from 'ts-auto-mock/extension';6import {typePath} from 'ts-auto-mock';7import * as tsAutoMock from 'ts-auto-mock';8import * as tsAutoMock from 'ts-auto-mock/extension';9import tsAutoMock from 'ts-auto-mock/extension';10import {tsAutoMock} from 'ts-auto-mock/extension';11import {typePath} from 'ts-auto-mock/extension';12import {typePath} from 'ts-auto-mock/extension';13import {typePath} from 'ts-auto-mock/extension';14import {typePath} from 'ts-auto-mock/extension';15import {typePath} from 'ts-auto-mock/extension';16import {typePath} from 'ts-auto-mock/extension';17import {typePath} from 'ts-auto-mock/extension';18import {typePath} from 'ts-auto-mock/extension';19import {typePath} from 'ts-auto-mock/extension';20import {typePath} from 'ts-auto-mock/extension';21import {typePath} from 'ts-auto-mock/extension';22import {typePath} from 'ts-auto-mock/extension';23import {typePath} from 'ts-auto-mock/extension';
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!