dceky 1.0.0-beta.6 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/.eslintrc.js +93 -0
  2. package/README.md +41 -0
  3. package/cypress/e2e/profile-test.cy.ts +10 -0
  4. package/cypress/fixtures/example.json +5 -0
  5. package/cypress/support/commands.ts +37 -0
  6. package/cypress/support/e2e.ts +17 -0
  7. package/cypress.config.ts +9 -0
  8. package/docs/GlobalsAndProfiles.md +23 -0
  9. package/lib/setup/addToGitIgnore.d.ts +6 -0
  10. package/lib/setup/addToGitIgnore.js +46 -0
  11. package/lib/setup/addToGitIgnore.js.map +1 -0
  12. package/lib/setup/checkRequiredFiles.d.ts +6 -0
  13. package/lib/setup/checkRequiredFiles.js +58 -0
  14. package/lib/setup/checkRequiredFiles.js.map +1 -0
  15. package/lib/setup/genCommandImportFile.d.ts +7 -0
  16. package/lib/setup/genCommandImportFile.js +66 -0
  17. package/lib/setup/genCommandImportFile.js.map +1 -0
  18. package/lib/setup/genConfiguration/helpers/resolveDependents.d.ts +13 -0
  19. package/lib/setup/genConfiguration/helpers/resolveDependents.js +50 -0
  20. package/lib/setup/genConfiguration/helpers/resolveDependents.js.map +1 -0
  21. package/lib/setup/genConfiguration/helpers/splitEnv.d.ts +10 -0
  22. package/lib/setup/genConfiguration/helpers/splitEnv.js +27 -0
  23. package/lib/setup/genConfiguration/helpers/splitEnv.js.map +1 -0
  24. package/lib/setup/genConfiguration/index.d.ts +15 -0
  25. package/lib/setup/genConfiguration/index.js +86 -0
  26. package/lib/setup/genConfiguration/index.js.map +1 -0
  27. package/lib/setup/genConfiguration/types/DependentValue.d.ts +11 -0
  28. package/lib/setup/genConfiguration/types/DependentValue.js +3 -0
  29. package/lib/setup/genConfiguration/types/DependentValue.js.map +1 -0
  30. package/lib/setup/genConfiguration/types/GlobalsOrProfile.d.ts +9 -0
  31. package/lib/setup/genConfiguration/types/GlobalsOrProfile.js +3 -0
  32. package/lib/setup/genConfiguration/types/GlobalsOrProfile.js.map +1 -0
  33. package/lib/setup/genConfiguration/types/SplitEnv.d.ts +13 -0
  34. package/lib/setup/genConfiguration/types/SplitEnv.js +3 -0
  35. package/lib/setup/genConfiguration/types/SplitEnv.js.map +1 -0
  36. package/lib/setup/genConfigurationFile.d.ts +2 -0
  37. package/lib/setup/genConfigurationFile.js +63 -0
  38. package/lib/setup/genConfigurationFile.js.map +1 -0
  39. package/lib/setup/genDynamicConfigFile.d.ts +5 -0
  40. package/lib/setup/genDynamicConfigFile.js +28 -0
  41. package/lib/setup/genDynamicConfigFile.js.map +1 -0
  42. package/lib/setup/index.d.ts +1 -0
  43. package/lib/setup/index.js +16 -0
  44. package/lib/setup/index.js.map +1 -0
  45. package/lib/setup/setupCypressDependencies.d.ts +6 -0
  46. package/lib/setup/setupCypressDependencies.js +40 -0
  47. package/lib/setup/setupCypressDependencies.js.map +1 -0
  48. package/lib/src/commands/assertDoesNotHaveClass.d.ts +20 -0
  49. package/lib/src/commands/assertDoesNotHaveClass.js +17 -0
  50. package/lib/src/commands/assertDoesNotHaveClass.js.map +1 -0
  51. package/lib/src/commands/assertHasClass.d.ts +20 -0
  52. package/lib/src/commands/assertHasClass.js +17 -0
  53. package/lib/src/commands/assertHasClass.js.map +1 -0
  54. package/lib/src/commands/assertNumElements.d.ts +19 -0
  55. package/lib/src/commands/assertNumElements.js +17 -0
  56. package/lib/src/commands/assertNumElements.js.map +1 -0
  57. package/lib/src/commands/extractDataFromClass.d.ts +18 -0
  58. package/lib/src/commands/extractDataFromClass.js +25 -0
  59. package/lib/src/commands/extractDataFromClass.js.map +1 -0
  60. package/lib/src/commands/extractDataFromClassByContents.d.ts +19 -0
  61. package/lib/src/commands/extractDataFromClassByContents.js +26 -0
  62. package/lib/src/commands/extractDataFromClassByContents.js.map +1 -0
  63. package/lib/src/commands/getJSON.d.ts +16 -0
  64. package/lib/src/commands/getJSON.js +21 -0
  65. package/lib/src/commands/getJSON.js.map +1 -0
  66. package/lib/src/commands/getNumElements.d.ts +15 -0
  67. package/lib/src/commands/getNumElements.js +19 -0
  68. package/lib/src/commands/getNumElements.js.map +1 -0
  69. package/lib/src/commands/handleHarvardKey.d.ts +15 -0
  70. package/lib/src/commands/handleHarvardKey.js +53 -0
  71. package/lib/src/commands/handleHarvardKey.js.map +1 -0
  72. package/lib/src/commands/launchAs.d.ts +25 -0
  73. package/lib/src/commands/launchAs.js +66 -0
  74. package/lib/src/commands/launchAs.js.map +1 -0
  75. package/lib/src/commands/launchLTIUsingToken.d.ts +21 -0
  76. package/lib/src/commands/launchLTIUsingToken.js +68 -0
  77. package/lib/src/commands/launchLTIUsingToken.js.map +1 -0
  78. package/lib/src/commands/navigateToHref.d.ts +15 -0
  79. package/lib/src/commands/navigateToHref.js +35 -0
  80. package/lib/src/commands/navigateToHref.js.map +1 -0
  81. package/lib/src/commands/runScript.d.ts +15 -0
  82. package/lib/src/commands/runScript.js +20 -0
  83. package/lib/src/commands/runScript.js.map +1 -0
  84. package/lib/src/commands/typeInto.d.ts +24 -0
  85. package/lib/src/commands/typeInto.js +41 -0
  86. package/lib/src/commands/typeInto.js.map +1 -0
  87. package/lib/src/commands/visitCanvasGETEndpoint.d.ts +20 -0
  88. package/lib/src/commands/visitCanvasGETEndpoint.js +26 -0
  89. package/lib/src/commands/visitCanvasGETEndpoint.js.map +1 -0
  90. package/lib/src/commands/waitForElementVisible.d.ts +16 -0
  91. package/lib/src/commands/waitForElementVisible.js +19 -0
  92. package/lib/src/commands/waitForElementVisible.js.map +1 -0
  93. package/lib/src/genConfiguration/helpers/resolveDependents.d.ts +13 -0
  94. package/lib/src/genConfiguration/helpers/resolveDependents.js +50 -0
  95. package/lib/src/genConfiguration/helpers/resolveDependents.js.map +1 -0
  96. package/lib/src/genConfiguration/helpers/splitEnv.d.ts +10 -0
  97. package/lib/src/genConfiguration/helpers/splitEnv.js +27 -0
  98. package/lib/src/genConfiguration/helpers/splitEnv.js.map +1 -0
  99. package/{src/genConfiguration.ts → lib/src/genConfiguration/index.d.ts} +3 -6
  100. package/lib/src/genConfiguration/index.js +88 -0
  101. package/lib/src/genConfiguration/index.js.map +1 -0
  102. package/lib/src/genConfiguration/types/DependentValue.d.ts +11 -0
  103. package/lib/src/genConfiguration/types/DependentValue.js +3 -0
  104. package/lib/src/genConfiguration/types/DependentValue.js.map +1 -0
  105. package/lib/src/genConfiguration/types/GlobalsOrProfile.d.ts +9 -0
  106. package/lib/src/genConfiguration/types/GlobalsOrProfile.js +3 -0
  107. package/lib/src/genConfiguration/types/GlobalsOrProfile.js.map +1 -0
  108. package/lib/src/genConfiguration/types/SplitEnv.d.ts +13 -0
  109. package/lib/src/genConfiguration/types/SplitEnv.js +3 -0
  110. package/lib/src/genConfiguration/types/SplitEnv.js.map +1 -0
  111. package/lib/{index.d.ts → src/index.d.ts} +1 -1
  112. package/lib/{index.js → src/index.js} +6 -3
  113. package/lib/src/index.js.map +1 -0
  114. package/lib/src/init.d.ts +6 -0
  115. package/lib/src/init.js +45 -0
  116. package/lib/src/init.js.map +1 -0
  117. package/lib/start/constants/AVAILABLE_BROWSERS.d.ts +9 -0
  118. package/lib/start/constants/AVAILABLE_BROWSERS.js +27 -0
  119. package/lib/start/constants/AVAILABLE_BROWSERS.js.map +1 -0
  120. package/lib/start/helpers/exec.d.ts +8 -0
  121. package/lib/start/helpers/exec.js +18 -0
  122. package/lib/start/helpers/exec.js.map +1 -0
  123. package/lib/start/helpers/extractArgValue.d.ts +10 -0
  124. package/lib/start/helpers/extractArgValue.js +39 -0
  125. package/lib/start/helpers/extractArgValue.js.map +1 -0
  126. package/lib/start/helpers/findProfilesByNames.d.ts +16 -0
  127. package/lib/start/helpers/findProfilesByNames.js +35 -0
  128. package/lib/start/helpers/findProfilesByNames.js.map +1 -0
  129. package/lib/start/helpers/parseCommaSeparated.d.ts +8 -0
  130. package/lib/start/helpers/parseCommaSeparated.js +23 -0
  131. package/lib/start/helpers/parseCommaSeparated.js.map +1 -0
  132. package/lib/start/helpers/print.d.ts +38 -0
  133. package/lib/start/helpers/print.js +145 -0
  134. package/lib/start/helpers/print.js.map +1 -0
  135. package/lib/start/helpers/prompt.d.ts +8 -0
  136. package/lib/start/helpers/prompt.js +25 -0
  137. package/lib/start/helpers/prompt.js.map +1 -0
  138. package/lib/start/helpers/showChooser.d.ts +21 -0
  139. package/lib/start/helpers/showChooser.js +116 -0
  140. package/lib/start/helpers/showChooser.js.map +1 -0
  141. package/lib/start/helpers/validateBrowsers.d.ts +8 -0
  142. package/lib/start/helpers/validateBrowsers.js +36 -0
  143. package/lib/start/helpers/validateBrowsers.js.map +1 -0
  144. package/lib/start/index.d.ts +7 -0
  145. package/lib/start/index.js +139 -0
  146. package/lib/start/index.js.map +1 -0
  147. package/lib/start/types/ChooserOption.d.ts +10 -0
  148. package/lib/start/types/ChooserOption.js +3 -0
  149. package/lib/start/types/ChooserOption.js.map +1 -0
  150. package/package.json +28 -8
  151. package/setup/addToGitIgnore.ts +47 -0
  152. package/setup/checkRequiredFiles.ts +62 -0
  153. package/setup/genCommandImportFile.ts +75 -0
  154. package/setup/genDynamicConfigFile.ts +28 -0
  155. package/setup/index.ts +11 -0
  156. package/setup/setupCypressDependencies.ts +38 -0
  157. package/src/commands/assertDoesNotHaveClass.ts +51 -0
  158. package/src/commands/assertHasClass.ts +51 -0
  159. package/src/commands/assertNumElements.ts +50 -0
  160. package/src/commands/extractDataFromClass.ts +52 -0
  161. package/src/commands/extractDataFromClassByContents.ts +55 -0
  162. package/src/commands/getJSON.ts +45 -0
  163. package/src/commands/getNumElements.ts +45 -0
  164. package/src/commands/handleHarvardKey.ts +91 -0
  165. package/src/commands/launchAs.ts +120 -0
  166. package/src/commands/launchLTIUsingToken.ts +115 -0
  167. package/src/commands/navigateToHref.ts +60 -0
  168. package/src/commands/runScript.ts +44 -0
  169. package/src/commands/typeInto.ts +88 -0
  170. package/src/commands/visitCanvasGETEndpoint.ts +61 -0
  171. package/src/commands/waitForElementVisible.ts +49 -0
  172. package/src/genConfiguration/helpers/resolveDependents.ts +47 -0
  173. package/src/genConfiguration/helpers/splitEnv.ts +30 -0
  174. package/src/genConfiguration/index.ts +94 -0
  175. package/src/genConfiguration/types/DependentValue.ts +14 -0
  176. package/src/genConfiguration/types/GlobalsOrProfile.ts +12 -0
  177. package/src/genConfiguration/types/SplitEnv.ts +18 -0
  178. package/src/index.ts +7 -4
  179. package/src/init.ts +36 -17
  180. package/start/constants/AVAILABLE_BROWSERS.ts +28 -0
  181. package/start/helpers/exec.ts +17 -0
  182. package/start/helpers/extractArgValue.ts +42 -0
  183. package/start/helpers/findProfilesByNames.ts +39 -0
  184. package/start/helpers/parseCommaSeparated.ts +23 -0
  185. package/start/helpers/print.ts +155 -0
  186. package/start/helpers/prompt.ts +23 -0
  187. package/start/helpers/showChooser.ts +140 -0
  188. package/start/helpers/validateBrowsers.ts +35 -0
  189. package/start/index.ts +163 -0
  190. package/start/types/ChooserOption.ts +11 -0
  191. package/tsconfig.json +3 -4
  192. package/.eslintrc.json +0 -58
  193. package/lib/genConfiguration.d.ts +0 -8
  194. package/lib/genConfiguration.js +0 -13
  195. package/lib/genConfiguration.js.map +0 -1
  196. package/lib/index.js.map +0 -1
  197. package/lib/init.d.ts +0 -13
  198. package/lib/init.js +0 -10
  199. package/lib/init.js.map +0 -1
@@ -0,0 +1,15 @@
1
+ declare global {
2
+ namespace Cypress {
3
+ interface Chainable {
4
+ /**
5
+ * Get number of elements
6
+ * @author Yuen Ler Chow
7
+ * @param selector a CSS selector corresponding to the item to count
8
+ * @return Cypress chainable containing the number of elements matching the selector
9
+ */
10
+ getNumElements(selector: string): Chainable<number>;
11
+ }
12
+ }
13
+ }
14
+ declare const getNumElements: () => void;
15
+ export default getNumElements;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ /// <reference types="cypress" />
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /*----------------------------------------*/
5
+ /* --------------- Command -------------- */
6
+ /*----------------------------------------*/
7
+ var getNumElements = function () {
8
+ Cypress.Commands.add('getNumElements', function (selector) {
9
+ cy.log("Count elements matching ".concat(selector));
10
+ return cy.get(selector).then(function ($elements) {
11
+ return Cypress.$($elements).length;
12
+ });
13
+ });
14
+ };
15
+ /*----------------------------------------*/
16
+ /* --------------- Export --------------- */
17
+ /*----------------------------------------*/
18
+ exports.default = getNumElements;
19
+ //# sourceMappingURL=getNumElements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getNumElements.js","sourceRoot":"","sources":["../../../src/commands/getNumElements.ts"],"names":[],"mappings":";AAAA,iCAAiC;;AAsBjC,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,IAAM,cAAc,GAAG;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAClB,gBAAgB,EAChB,UACE,QAAgB;QAEhB,EAAE,CAAC,GAAG,CAAC,kCAA2B,QAAQ,CAAE,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAC,SAA8B;YAC1D,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,kBAAe,cAAc,CAAC"}
@@ -0,0 +1,15 @@
1
+ declare global {
2
+ namespace Cypress {
3
+ interface Chainable {
4
+ /**
5
+ * Handle a HarvardKey login page for a user
6
+ * @author Yuen Ler Chow
7
+ * @param name the name of the user environment variable
8
+ * @return Cypress chainable (void) - performs authentication flow, no return value
9
+ */
10
+ handleHarvardKey(name: string): Chainable<void>;
11
+ }
12
+ }
13
+ }
14
+ declare const handleHarvardKey: () => void;
15
+ export default handleHarvardKey;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /// <reference types="cypress" />
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /*----------------------------------------*/
5
+ /* --------------- Command -------------- */
6
+ /*----------------------------------------*/
7
+ var handleHarvardKey = function () {
8
+ Cypress.Commands.add('handleHarvardKey', function (name) {
9
+ cy.log('Handling HarvardKey authentication');
10
+ var userInfo = Cypress.env(name);
11
+ if (!userInfo) {
12
+ throw new Error("Could not find ".concat(name, " in environment variables"));
13
+ }
14
+ // Destructure the user info object to get the username and password
15
+ var username = userInfo.username;
16
+ var password = userInfo.password;
17
+ // Get the Harvard login URL using originWithKaixa with auto-initialized functions
18
+ cy.origin('https://apps.cirrusidentity.com', function () {
19
+ Cypress.require('dceky');
20
+ // Clicking the button doesn't work for some reason, so we access the href attribute instead
21
+ return cy.navigateToHref('#idp_1001962798_button');
22
+ }).then(function (fullUrl) {
23
+ // Navigate to the Harvard login page using originWithKaixa
24
+ cy.origin('https://harvard.idp.cirrusidentity.com', {
25
+ args: { username: username, password: password, fullUrl: fullUrl },
26
+ }, function (args) {
27
+ Cypress.require('dceky');
28
+ var harvardUsername = args.username, harvardPassword = args.password, harvardLoginUrl = args.fullUrl;
29
+ cy.on('uncaught:exception', function (e) {
30
+ // Ignore known HarvardKey errors
31
+ if (!e.message.includes('ready is not defined')) {
32
+ throw e;
33
+ }
34
+ return false;
35
+ });
36
+ // Visit the Harvard login page
37
+ cy.visit(harvardLoginUrl);
38
+ // Wait for and fill in the login form
39
+ cy.waitForElementVisible('#username');
40
+ cy.waitForElementVisible('#password');
41
+ cy.typeInto({ item: '#username', text: harvardUsername });
42
+ cy.typeInto({ item: '#password', text: harvardPassword });
43
+ // Submit the form
44
+ cy.get('input[type="submit"], button[type="submit"], .btn-primary').click();
45
+ });
46
+ });
47
+ });
48
+ };
49
+ /*----------------------------------------*/
50
+ /* --------------- Export --------------- */
51
+ /*----------------------------------------*/
52
+ exports.default = handleHarvardKey;
53
+ //# sourceMappingURL=handleHarvardKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleHarvardKey.js","sourceRoot":"","sources":["../../../src/commands/handleHarvardKey.ts"],"names":[],"mappings":";AAAA,iCAAiC;;AAsBjC,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,IAAM,gBAAgB,GAAG;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAClB,kBAAkB,EAClB,UACE,IAAY;QAEZ,EAAE,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAE7C,IAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,yBAAkB,IAAI,8BAA2B,CAAC,CAAC;QACrE,CAAC;QAED,oEAAoE;QAC5D,IAAA,QAAQ,GAAK,QAAQ,SAAb,CAAc;QACtB,IAAA,QAAQ,GAAK,QAAQ,SAAb,CAAc;QAE9B,kFAAkF;QAClF,EAAE,CAAC,MAAM,CAAC,iCAAiC,EAAE;YAC3C,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzB,4FAA4F;YAC5F,OAAO,EAAE,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC,IAAI,CAAC,UAAC,OAAe;YACxB,2DAA2D;YACzD,EAAE,CAAC,MAAM,CAAC,wCAAwC,EAAE;gBAClD,IAAI,EAAE,EAAE,QAAQ,UAAA,EAAE,QAAQ,UAAA,EAAE,OAAO,SAAA,EAAE;aACtC,EAAE,UAAC,IAAI;gBACN,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAEvB,IAAU,eAAe,GAGvB,IAAI,SAHmB,EACf,eAAe,GAEvB,IAAI,SAFmB,EAChB,eAAe,GACtB,IAAI,QADkB,CACjB;gBAET,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,UAAC,CAAQ;oBACnC,iCAAiC;oBACjC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;wBAChD,MAAM,CAAC,CAAC;oBACV,CAAC;oBACD,OAAO,KAAK,CAAC;gBACf,CAAC,CAAC,CAAC;gBAEH,+BAA+B;gBAC/B,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAE1B,sCAAsC;gBACtC,EAAE,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;gBACtC,EAAE,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;gBAEtC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;gBAC1D,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;gBAE1D,kBAAkB;gBAClB,EAAE,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,KAAK,EAAE,CAAC;YAC9E,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,kBAAe,gBAAgB,CAAC"}
@@ -0,0 +1,25 @@
1
+ declare global {
2
+ namespace Cypress {
3
+ interface Chainable {
4
+ /**
5
+ * Log into Canvas and launch an LTI app as a specific user from environment variables.
6
+ * The user should be defined as an environment variable with the following properties:
7
+ * - accessToken: Canvas access token for the user (required for production mode)
8
+ * - type: User type ('student', 'ta', 'teacher') for local mode (defaults to 'teacher')
9
+ * - simIndex: Simulator index for local mode (defaults to '0')
10
+ * @author Yuen Ler Chow
11
+ * @param name the name of the user environment variable
12
+ * @param opts object containing all arguments
13
+ * @param [opts.courseId] the Canvas ID of the course to launch from
14
+ * @param [opts.appName] the name of the app as it appears in the course's left-hand nav
15
+ * @return Cypress chainable (void) - launches the LTI app, no return value
16
+ */
17
+ launchAs(name: string, opts?: {
18
+ courseId?: number;
19
+ appName?: string;
20
+ }): Chainable<void>;
21
+ }
22
+ }
23
+ }
24
+ declare const launchAs: () => void;
25
+ export default launchAs;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /// <reference types="cypress" />
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /*----------------------------------------*/
5
+ /* --------------- Command -------------- */
6
+ /*----------------------------------------*/
7
+ var launchAs = function () {
8
+ Cypress.Commands.add('launchAs', function (name, opts) {
9
+ if (opts === void 0) { opts = {}; }
10
+ var courseId = opts.courseId, appName = opts.appName;
11
+ // Get courseId from environment variables if not provided
12
+ if (!courseId) {
13
+ var envCourseId = Cypress.env('courseId');
14
+ if (!envCourseId) {
15
+ throw new Error('Could not find courseId in environment variables');
16
+ }
17
+ courseId = Number.parseInt(envCourseId, 10);
18
+ }
19
+ // Get appName from environment variables if not provided
20
+ appName = appName || Cypress.env('appName');
21
+ if (!appName) {
22
+ throw new Error('Could not find appName in environment variables');
23
+ }
24
+ // Get user info from environment variables
25
+ var userInfo = Cypress.env(name);
26
+ if (!userInfo) {
27
+ throw new Error("Could not find ".concat(name, " in environment variables"));
28
+ }
29
+ cy.log("\uD83D\uDE80 Launch as ".concat(name));
30
+ // Check if this is a local launch
31
+ var isLocal = Cypress.env('local') === 'true';
32
+ if (isLocal) {
33
+ // Handle local simulator launch
34
+ var userType = userInfo.type || 'teacher';
35
+ var simIndex = userInfo.simIndex || '0';
36
+ var simLaunchButtonId = "".concat(userType, "_").concat(simIndex, "-launch-button");
37
+ cy.log('Local mode: launching simulator');
38
+ cy.visit('https://localhost:8088/simulator');
39
+ // Handle potential SSL certificate issues
40
+ cy.get('body').then(function ($body) {
41
+ if ($body.find('.ssl').length > 0) {
42
+ cy.log('Handling SSL certificate issue');
43
+ cy.get('#details-button').click();
44
+ cy.get('#proceed-link').click();
45
+ }
46
+ });
47
+ // Launch the app
48
+ cy.get("#".concat(simLaunchButtonId)).click();
49
+ // Click the authorize button
50
+ cy.get('.authorize-button', { timeout: 1000 }).click();
51
+ return;
52
+ }
53
+ // Handle production launch with access token
54
+ var accessToken = userInfo.accessToken;
55
+ if (!accessToken) {
56
+ throw new Error("Could not find accessToken for ".concat(name, " in environment variables"));
57
+ }
58
+ // Launch using the access token
59
+ cy.launchLTIUsingToken(accessToken, { courseId: courseId, appName: appName });
60
+ });
61
+ };
62
+ /*----------------------------------------*/
63
+ /* --------------- Export --------------- */
64
+ /*----------------------------------------*/
65
+ exports.default = launchAs;
66
+ //# sourceMappingURL=launchAs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchAs.js","sourceRoot":"","sources":["../../../src/commands/launchAs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ declare global {
2
+ namespace Cypress {
3
+ interface Chainable {
4
+ /**
5
+ * Log into Canvas using an access token and launch an LTI app
6
+ * @author Yuen Ler Chow
7
+ * @param accessToken the user's Canvas access token
8
+ * @param opts object containing all arguments
9
+ * @param [opts.courseId] the Canvas ID of the course to launch from
10
+ * @param [opts.appName] the name of the app as it appears in the course's left-hand nav
11
+ * @return Cypress chainable (void) - launches the LTI app and navigates to it, no return value
12
+ */
13
+ launchLTIUsingToken(accessToken: string, opts?: {
14
+ courseId?: number;
15
+ appName?: string;
16
+ }): Chainable<void>;
17
+ }
18
+ }
19
+ }
20
+ declare const launchLTIUsingToken: () => void;
21
+ export default launchLTIUsingToken;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /// <reference types="cypress" />
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /*----------------------------------------*/
5
+ /* --------------- Command -------------- */
6
+ /*----------------------------------------*/
7
+ var launchLTIUsingToken = function () {
8
+ Cypress.Commands.add('launchLTIUsingToken', function (accessToken, opts) {
9
+ if (opts === void 0) { opts = {}; }
10
+ var courseId = opts.courseId, appName = opts.appName;
11
+ if (!courseId) {
12
+ var envCourseId = Cypress.env('courseId');
13
+ if (!envCourseId) {
14
+ throw new Error('Could not find courseId in environment variables');
15
+ }
16
+ courseId = Number.parseInt(envCourseId, 10);
17
+ }
18
+ appName = appName || Cypress.env('appName');
19
+ if (!appName) {
20
+ throw new Error('Could not find appName in environment variables');
21
+ }
22
+ cy.log("Launch LTI app \"".concat(appName, "\" in course ").concat(courseId, " using access token"));
23
+ // Get the external tools for the course
24
+ cy.visitCanvasGETEndpoint({
25
+ path: "/courses/".concat(courseId, "/external_tools"),
26
+ accessToken: accessToken,
27
+ }).then(function (externalTools) {
28
+ cy.log("Found ".concat(externalTools.length, " external tools"));
29
+ // Find the external tool of interest
30
+ var matchingTool = externalTools.find(function (externalTool) {
31
+ // Skip non-nav items
32
+ if (!externalTool.course_navigation || typeof externalTool.course_navigation !== 'object') {
33
+ return false;
34
+ }
35
+ // Skip non-labeled items
36
+ if (!externalTool.course_navigation.text) {
37
+ return false;
38
+ }
39
+ // Skip if the app name does not match the expected name
40
+ var thisAppName = externalTool.course_navigation.text.trim().toLowerCase();
41
+ return thisAppName === appName.trim().toLowerCase();
42
+ });
43
+ var toolId = (matchingTool === null || matchingTool === void 0 ? void 0 : matchingTool.id) || 0;
44
+ if (matchingTool) {
45
+ cy.log("Found matching app: \"".concat(matchingTool.course_navigation.text, "\" with ID ").concat(toolId));
46
+ }
47
+ // Make sure we found the app
48
+ if (toolId === 0) {
49
+ throw new Error("Could not find any apps named \"".concat(appName, "\" in course ").concat(courseId));
50
+ }
51
+ // Get a sessionless launch URL
52
+ cy.visitCanvasGETEndpoint({
53
+ path: "/courses/".concat(courseId, "/external_tools/sessionless_launch?id=").concat(toolId),
54
+ accessToken: accessToken,
55
+ }).then(function (sessionlessLaunchInfo) {
56
+ var launchURL = sessionlessLaunchInfo.url;
57
+ cy.log("Launching LTI app at: ".concat(launchURL));
58
+ // Launch the tool
59
+ cy.visit(launchURL);
60
+ });
61
+ });
62
+ });
63
+ };
64
+ /*----------------------------------------*/
65
+ /* --------------- Export --------------- */
66
+ /*----------------------------------------*/
67
+ exports.default = launchLTIUsingToken;
68
+ //# sourceMappingURL=launchLTIUsingToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchLTIUsingToken.js","sourceRoot":"","sources":["../../../src/commands/launchLTIUsingToken.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ declare global {
2
+ namespace Cypress {
3
+ interface Chainable {
4
+ /**
5
+ * Navigate to href attribute of Harvard identity provider button
6
+ * @author Yuen Ler Chow
7
+ * @param item the CSS selector of interest
8
+ * @return Cypress chainable containing the full URL string (hostname + href attribute value)
9
+ */
10
+ navigateToHref(item: string): Chainable<string>;
11
+ }
12
+ }
13
+ }
14
+ declare const navigateToHref: () => void;
15
+ export default navigateToHref;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /// <reference types="cypress" />
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /*----------------------------------------*/
5
+ /* --------------- Command -------------- */
6
+ /*----------------------------------------*/
7
+ var navigateToHref = function () {
8
+ Cypress.Commands.add('navigateToHref', function (item) {
9
+ cy.waitForElementVisible(item);
10
+ return cy
11
+ .url()
12
+ // get origin (protocol + '//' + host) from current URL
13
+ .then(function (url) {
14
+ var _a = new URL(url), protocol = _a.protocol, host = _a.host;
15
+ return "".concat(protocol, "//").concat(host);
16
+ })
17
+ .then(function (origin) {
18
+ return cy
19
+ .get(item)
20
+ .invoke('attr', 'href')
21
+ .then(function (href) {
22
+ // If the href is a relative URL, prepend the hostname
23
+ if (href.startsWith('/')) {
24
+ return origin + href;
25
+ }
26
+ return href;
27
+ });
28
+ });
29
+ });
30
+ };
31
+ /*----------------------------------------*/
32
+ /* --------------- Export --------------- */
33
+ /*----------------------------------------*/
34
+ exports.default = navigateToHref;
35
+ //# sourceMappingURL=navigateToHref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigateToHref.js","sourceRoot":"","sources":["../../../src/commands/navigateToHref.ts"],"names":[],"mappings":";AAAA,iCAAiC;;AAoBjC,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,IAAM,cAAc,GAAG;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAClB,gBAAgB,EAChB,UACE,IAAY;QAEZ,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE/B,OAAO,EAAE;aACN,GAAG,EAAE;YACN,uDAAuD;aACtD,IAAI,CAAC,UAAC,GAAW;YACV,IAAA,KAAqB,IAAI,GAAG,CAAC,GAAG,CAAC,EAA/B,QAAQ,cAAA,EAAE,IAAI,UAAiB,CAAC;YACxC,OAAO,UAAG,QAAQ,eAAK,IAAI,CAAE,CAAC;QAChC,CAAC,CAAC;aACD,IAAI,CAAC,UAAC,MAAc;YACnB,OAAO,EAAE;iBACN,GAAG,CAAC,IAAI,CAAC;iBACT,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;iBACtB,IAAI,CAAC,UAAC,IAAY;gBACjB,sDAAsD;gBACtD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,OAAO,MAAM,GAAG,IAAI,CAAC;gBACvB,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,kBAAe,cAAc,CAAC"}
@@ -0,0 +1,15 @@
1
+ declare global {
2
+ namespace Cypress {
3
+ interface Chainable {
4
+ /**
5
+ * Run a script on the page
6
+ * @author Yuen Ler Chow
7
+ * @param script the script to run
8
+ * @return Cypress chainable containing the return value from executing the script
9
+ */
10
+ runScript(scriptLines: string): Chainable<any>;
11
+ }
12
+ }
13
+ }
14
+ declare const runScript: () => void;
15
+ export default runScript;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /// <reference types="cypress" />
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /*----------------------------------------*/
5
+ /* --------------- Command -------------- */
6
+ /*----------------------------------------*/
7
+ var runScript = function () {
8
+ Cypress.Commands.add('runScript', function (script) {
9
+ cy.log('Running script');
10
+ return cy.window().then(function (win) {
11
+ var result = win.eval(script);
12
+ return cy.wrap(result);
13
+ });
14
+ });
15
+ };
16
+ /*----------------------------------------*/
17
+ /* --------------- Export --------------- */
18
+ /*----------------------------------------*/
19
+ exports.default = runScript;
20
+ //# sourceMappingURL=runScript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runScript.js","sourceRoot":"","sources":["../../../src/commands/runScript.ts"],"names":[],"mappings":";AAAA,iCAAiC;;AAoBjC,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,IAAM,SAAS,GAAG;IAChB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAClB,WAAW,EACX,UACE,MAAc;QAEd,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACzB,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAC,GAAG;YAC1B,IAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,kBAAe,SAAS,CAAC"}
@@ -0,0 +1,24 @@
1
+ declare global {
2
+ namespace Cypress {
3
+ interface Chainable {
4
+ /**
5
+ * Type text into an element. This function first removes the previous text in the element
6
+ * @author Yuen Ler Chow
7
+ * @param opts object containing all arguments
8
+ * @param opts.item the CSS selector of interest
9
+ * @param opts.text the text to type
10
+ * @param [opts.pressEnter] if true, after typing into the text field, simulate pressing enter
11
+ * @param [opts.append] if true, append the text to the end of the existing text in the element instead of replacing it
12
+ * @return Cypress chainable containing the input element that text was typed into
13
+ */
14
+ typeInto(opts: {
15
+ item: string;
16
+ text: string;
17
+ pressEnter?: boolean;
18
+ append?: boolean;
19
+ }): Chainable<Element>;
20
+ }
21
+ }
22
+ }
23
+ declare const typeInto: () => void;
24
+ export default typeInto;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /// <reference types="cypress" />
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /*----------------------------------------*/
5
+ /* --------------- Command -------------- */
6
+ /*----------------------------------------*/
7
+ var typeInto = function () {
8
+ Cypress.Commands.add('typeInto', function (opts) {
9
+ var item = opts.item, text = opts.text, pressEnter = opts.pressEnter, append = opts.append;
10
+ // Check if the text contains an enter key press
11
+ var enterAtEndOfText = text.charAt(text.length - 1) === '\n';
12
+ var willPressEnter = pressEnter || enterAtEndOfText;
13
+ var action = append ? 'Append' : 'Type';
14
+ var enterSuffix = willPressEnter ? ' and then press enter' : '';
15
+ cy.log("".concat(action, " \"").concat(text, "\" into ").concat(item).concat(enterSuffix));
16
+ // Type the text without a trailing enter if there was one
17
+ var textWithoutTrailingEnter = (enterAtEndOfText
18
+ ? text.substring(0, text.length - 1)
19
+ : text);
20
+ if (append) {
21
+ cy
22
+ .get(item)
23
+ .type(textWithoutTrailingEnter);
24
+ }
25
+ else {
26
+ cy
27
+ .get(item)
28
+ .clear()
29
+ .type(textWithoutTrailingEnter);
30
+ }
31
+ // Press enter if explicitly requested or if text ended with newline
32
+ if (willPressEnter) {
33
+ cy.get(item).type('{enter}');
34
+ }
35
+ });
36
+ };
37
+ /*----------------------------------------*/
38
+ /* --------------- Export --------------- */
39
+ /*----------------------------------------*/
40
+ exports.default = typeInto;
41
+ //# sourceMappingURL=typeInto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeInto.js","sourceRoot":"","sources":["../../../src/commands/typeInto.ts"],"names":[],"mappings":";AAAA,iCAAiC;;AA+BjC,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,IAAM,QAAQ,GAAG;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG,CAClB,UAAU,EACV,UACE,IAKC;QAGC,IAAA,IAAI,GACF,IAAI,KADF,EAAE,IAAI,GACR,IAAI,KADI,EAAE,UAAU,GACpB,IAAI,WADgB,EAAE,MAAM,GAC5B,IAAI,OADwB,CACvB;QACT,gDAAgD;QAChD,IAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;QAC/D,IAAM,cAAc,GAAG,UAAU,IAAI,gBAAgB,CAAC;QAEtD,IAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1C,IAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,EAAE,CAAC,GAAG,CAAC,UAAG,MAAM,gBAAK,IAAI,qBAAU,IAAI,SAAG,WAAW,CAAE,CAAC,CAAC;QAEzD,0DAA0D;QAC1D,IAAM,wBAAwB,GAAG,CAC/B,gBAAgB;YACd,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,CAAC,CAAC,IAAI,CACT,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,EAAE;iBACC,GAAG,CAAC,IAAI,CAAC;iBACT,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,EAAE;iBACC,GAAG,CAAC,IAAI,CAAC;iBACT,KAAK,EAAE;iBACP,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACpC,CAAC;QAED,oEAAoE;QACpE,IAAI,cAAc,EAAE,CAAC;YACnB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,kBAAe,QAAQ,CAAC"}
@@ -0,0 +1,20 @@
1
+ declare global {
2
+ namespace Cypress {
3
+ interface Chainable {
4
+ /**
5
+ * Makes a GET request to Canvas API endpoint
6
+ * @author Yuen Ler Chow
7
+ * @param opts object containing all arguments
8
+ * @param opts.path The API path (e.g., '/courses', '/users/self')
9
+ * @param opts.accessToken The Canvas access token
10
+ * @return Cypress chainable containing the Canvas API response body
11
+ */
12
+ visitCanvasGETEndpoint(opts: {
13
+ path: string;
14
+ accessToken: string;
15
+ }): Chainable<any>;
16
+ }
17
+ }
18
+ }
19
+ declare const visitCanvasGETEndpoint: () => void;
20
+ export default visitCanvasGETEndpoint;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /// <reference types="cypress" />
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /*----------------------------------------*/
5
+ /* --------------- Command -------------- */
6
+ /*----------------------------------------*/
7
+ var visitCanvasGETEndpoint = function () {
8
+ Cypress.Commands.add('visitCanvasGETEndpoint', function (opts) {
9
+ cy.log('Visiting Canvas GET endpoint');
10
+ var path = opts.path, accessToken = opts.accessToken;
11
+ cy.log("Canvas API: ".concat(path));
12
+ return cy.request({
13
+ method: 'GET',
14
+ url: "https://canvas.harvard.edu/api/v1".concat(path),
15
+ qs: {
16
+ per_page: 200,
17
+ access_token: accessToken,
18
+ },
19
+ }).its('body');
20
+ });
21
+ };
22
+ /*----------------------------------------*/
23
+ /* --------------- Export --------------- */
24
+ /*----------------------------------------*/
25
+ exports.default = visitCanvasGETEndpoint;
26
+ //# sourceMappingURL=visitCanvasGETEndpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitCanvasGETEndpoint.js","sourceRoot":"","sources":["../../../src/commands/visitCanvasGETEndpoint.ts"],"names":[],"mappings":";AAAA,iCAAiC;;AA2BjC,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,IAAM,sBAAsB,GAAG;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAClB,wBAAwB,EACxB,UACE,IAGC;QAED,EAAE,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC/B,IAAA,IAAI,GAAkB,IAAI,KAAtB,EAAE,WAAW,GAAK,IAAI,YAAT,CAAU;QAEnC,EAAE,CAAC,GAAG,CAAC,sBAAe,IAAI,CAAE,CAAC,CAAC;QAC9B,OAAO,EAAE,CAAC,OAAO,CAAC;YAChB,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,2CAAoC,IAAI,CAAE;YAC/C,EAAE,EAAE;gBACF,QAAQ,EAAE,GAAG;gBACb,YAAY,EAAE,WAAW;aAC1B;SACF,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjB,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,kBAAe,sBAAsB,CAAC"}
@@ -0,0 +1,16 @@
1
+ declare global {
2
+ namespace Cypress {
3
+ interface Chainable {
4
+ /**
5
+ * Wait for an element to be visible
6
+ * @author Yuen Ler Chow
7
+ * @param item the CSS selector of interest
8
+ * @param [timeoutSec=10] the number of seconds to wait before timing out
9
+ * @return Cypress chainable containing the visible element
10
+ */
11
+ waitForElementVisible(item: string, timeoutSec?: number): Chainable<JQuery<HTMLElement>>;
12
+ }
13
+ }
14
+ }
15
+ declare const waitForElementVisible: () => void;
16
+ export default waitForElementVisible;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ /// <reference types="cypress" />
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /*----------------------------------------*/
5
+ /* --------------- Command -------------- */
6
+ /*----------------------------------------*/
7
+ var waitForElementVisible = function () {
8
+ Cypress.Commands.add('waitForElementVisible', function (item, timeoutSec) {
9
+ cy.log('Waiting for element to be visible');
10
+ var timeoutMs = (timeoutSec || 10) * 1000;
11
+ cy.log("Wait for ".concat(item, " to be visible"));
12
+ return cy.get(item, { timeout: timeoutMs }).should('be.visible');
13
+ });
14
+ };
15
+ /*----------------------------------------*/
16
+ /* --------------- Export --------------- */
17
+ /*----------------------------------------*/
18
+ exports.default = waitForElementVisible;
19
+ //# sourceMappingURL=waitForElementVisible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitForElementVisible.js","sourceRoot":"","sources":["../../../src/commands/waitForElementVisible.ts"],"names":[],"mappings":";AAAA,iCAAiC;;AAwBjC,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,IAAM,qBAAqB,GAAG;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAClB,uBAAuB,EACvB,UACE,IAAY,EACZ,UAAmB;QAEnB,EAAE,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAE5C,IAAM,SAAS,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QAC5C,EAAE,CAAC,GAAG,CAAC,mBAAY,IAAI,mBAAgB,CAAC,CAAC;QACzC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACnE,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAE5C,kBAAe,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type GlobalsOrProfile from '../types/GlobalsOrProfile';
2
+ import type DependentValue from '../types/DependentValue';
3
+ /**
4
+ * Resolve all dependent values using already-merged basics.
5
+ * @author Gardenia Liu
6
+ * @param dependentMaps with dependencies on basics
7
+ * @param basics entries
8
+ * @returns env with all dependent values resolved
9
+ */
10
+ declare const resolveDependents: (dependentMaps: {
11
+ [k: string]: DependentValue;
12
+ }[], basics: GlobalsOrProfile) => GlobalsOrProfile;
13
+ export default resolveDependents;