create-appraisejs 0.1.9 → 0.1.10-alpha.1

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 (159) hide show
  1. package/README.md +24 -17
  2. package/dist/cli.d.ts +2 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.e2e.test.js +11 -8
  5. package/dist/cli.e2e.test.js.map +1 -1
  6. package/dist/cli.js +32 -48
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +5 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/config.test.js +9 -5
  12. package/dist/config.test.js.map +1 -1
  13. package/dist/copy-template.d.ts +1 -1
  14. package/dist/copy-template.d.ts.map +1 -1
  15. package/dist/copy-template.js +7 -3
  16. package/dist/copy-template.js.map +1 -1
  17. package/dist/copy-template.test.js +14 -9
  18. package/dist/copy-template.test.js.map +1 -1
  19. package/dist/create-project.d.ts +23 -0
  20. package/dist/create-project.d.ts.map +1 -0
  21. package/dist/create-project.js +58 -0
  22. package/dist/create-project.js.map +1 -0
  23. package/dist/create-project.test.d.ts +2 -0
  24. package/dist/create-project.test.d.ts.map +1 -0
  25. package/dist/create-project.test.js +80 -0
  26. package/dist/create-project.test.js.map +1 -0
  27. package/dist/install.d.ts +8 -4
  28. package/dist/install.d.ts.map +1 -1
  29. package/dist/install.js +22 -72
  30. package/dist/install.js.map +1 -1
  31. package/dist/install.test.js +26 -10
  32. package/dist/install.test.js.map +1 -1
  33. package/dist/package-manager.d.ts +11 -0
  34. package/dist/package-manager.d.ts.map +1 -0
  35. package/dist/package-manager.js +47 -0
  36. package/dist/package-manager.js.map +1 -0
  37. package/dist/package-manager.test.d.ts +2 -0
  38. package/dist/package-manager.test.d.ts.map +1 -0
  39. package/dist/package-manager.test.js +51 -0
  40. package/dist/package-manager.test.js.map +1 -0
  41. package/dist/prepare-template-utils.d.ts +10 -0
  42. package/dist/prepare-template-utils.d.ts.map +1 -0
  43. package/dist/prepare-template-utils.js +53 -0
  44. package/dist/prepare-template-utils.js.map +1 -0
  45. package/dist/prepare-template-utils.test.d.ts +2 -0
  46. package/dist/prepare-template-utils.test.d.ts.map +1 -0
  47. package/dist/prepare-template-utils.test.js +67 -0
  48. package/dist/prepare-template-utils.test.js.map +1 -0
  49. package/dist/prompts.d.ts +2 -0
  50. package/dist/prompts.d.ts.map +1 -1
  51. package/dist/prompts.js +11 -3
  52. package/dist/prompts.js.map +1 -1
  53. package/dist/prompts.test.js +17 -7
  54. package/dist/prompts.test.js.map +1 -1
  55. package/dist/template-sync-utils.test.d.ts +2 -0
  56. package/dist/template-sync-utils.test.d.ts.map +1 -0
  57. package/dist/template-sync-utils.test.js +41 -0
  58. package/dist/template-sync-utils.test.js.map +1 -0
  59. package/package.json +3 -2
  60. package/templates/default/.appraise-template-meta.json +5 -0
  61. package/templates/default/.env.example +1 -1
  62. package/templates/default/.vscode/settings.json +10 -3
  63. package/templates/default/README.md +27 -25
  64. package/templates/default/automation/features/base/login.feature +15 -0
  65. package/templates/default/automation/locators/base/home.json +3 -0
  66. package/templates/default/automation/locators/base/login.json +6 -0
  67. package/templates/default/automation/locators/base/test.json +1 -0
  68. package/templates/default/automation/mapping/locator-map.json +14 -0
  69. package/templates/default/{src/tests → automation}/steps/actions/click.step.ts +1 -4
  70. package/templates/default/{src/tests → automation}/steps/actions/hover.step.ts +1 -4
  71. package/templates/default/{src/tests → automation}/steps/actions/input.step.ts +1 -4
  72. package/templates/default/{src/tests → automation}/steps/actions/navigation.step.ts +1 -3
  73. package/templates/default/{src/tests → automation}/steps/actions/random_data.step.ts +1 -3
  74. package/templates/default/{src/tests → automation}/steps/actions/store.step.ts +1 -4
  75. package/templates/default/automation/steps/actions/wait.step.ts +91 -0
  76. package/templates/default/{src/tests → automation}/steps/validations/active_state_assertion.step.ts +1 -4
  77. package/templates/default/{src/tests → automation}/steps/validations/navigation_assertion.step.ts +1 -2
  78. package/templates/default/{src/tests → automation}/steps/validations/text_assertion.step.ts +1 -4
  79. package/templates/default/{src/tests → automation}/steps/validations/visibility_assertion.step.ts +1 -4
  80. package/templates/default/cucumber.mjs +6 -6
  81. package/templates/default/eslint.config.mjs +5 -4
  82. package/templates/default/package-lock.json +322 -485
  83. package/templates/default/package.json +12 -6
  84. package/templates/default/packages/cucumber-runtime/package.json +13 -0
  85. package/templates/default/packages/cucumber-runtime/src/cache.util.ts +93 -0
  86. package/templates/default/packages/cucumber-runtime/src/cli.ts +68 -0
  87. package/templates/default/packages/cucumber-runtime/src/environment.util.ts +21 -0
  88. package/templates/default/packages/cucumber-runtime/src/executor.ts +32 -0
  89. package/templates/default/{src/tests/hooks → packages/cucumber-runtime/src}/hooks.ts +17 -32
  90. package/templates/default/packages/cucumber-runtime/src/index.ts +17 -0
  91. package/templates/default/{src/tests/utils → packages/cucumber-runtime/src}/locator.util.ts +50 -64
  92. package/templates/default/packages/cucumber-runtime/src/parameter-types.ts +7 -0
  93. package/templates/default/packages/cucumber-runtime/src/paths.ts +33 -0
  94. package/templates/default/packages/cucumber-runtime/src/random-data.util.ts +35 -0
  95. package/templates/default/packages/cucumber-runtime/src/types.ts +13 -0
  96. package/templates/default/{src/tests/config/executor → packages/cucumber-runtime/src}/world.ts +4 -1
  97. package/templates/default/packages/cucumber-runtime/tsconfig.json +11 -0
  98. package/templates/default/scripts/setup-env.ts +4 -4
  99. package/templates/default/scripts/sync-appraise-base-template.ts +124 -105
  100. package/templates/default/scripts/sync-environments.ts +8 -5
  101. package/templates/default/scripts/sync-locator-groups.ts +7 -10
  102. package/templates/default/scripts/sync-locators.ts +5 -9
  103. package/templates/default/scripts/sync-modules.ts +9 -17
  104. package/templates/default/scripts/sync-tags.ts +2 -2
  105. package/templates/default/scripts/sync-template-step-groups.ts +16 -6
  106. package/templates/default/scripts/sync-template-steps.ts +16 -5
  107. package/templates/default/scripts/sync-test-cases.ts +6 -3
  108. package/templates/default/scripts/sync-test-suites.ts +7 -4
  109. package/templates/default/src/actions/environments/environment-actions.ts +6 -23
  110. package/templates/default/src/actions/locator/locator-actions.ts +36 -93
  111. package/templates/default/src/actions/locator-groups/locator-group-actions.ts +24 -78
  112. package/templates/default/src/actions/modules/module-actions.ts +4 -2
  113. package/templates/default/src/actions/tags/tag-actions.ts +4 -1
  114. package/templates/default/src/actions/template-step/template-step-actions.ts +10 -101
  115. package/templates/default/src/actions/template-step-group/template-step-group-actions.ts +31 -130
  116. package/templates/default/src/actions/test-case/test-case-actions.ts +31 -94
  117. package/templates/default/src/actions/test-run/test-run-actions.ts +11 -13
  118. package/templates/default/src/actions/test-suite/test-suite-actions.ts +29 -82
  119. package/templates/default/src/app/(base)/locator-groups/page.tsx +1 -3
  120. package/templates/default/src/app/(base)/reports/page.tsx +1 -1
  121. package/templates/default/src/app/(base)/reports/test-cases/page.tsx +2 -2
  122. package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +1 -1
  123. package/templates/default/src/app/(base)/tags/page.tsx +2 -2
  124. package/templates/default/src/app/(base)/template-steps/page.tsx +1 -2
  125. package/templates/default/src/app/(base)/test-runs/page.tsx +2 -2
  126. package/templates/default/src/app/api/test-runs/[runId]/logs/route.ts +2 -1
  127. package/templates/default/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.ts +2 -1
  128. package/templates/default/src/app/page.tsx +4 -5
  129. package/templates/default/src/components/diagram/dynamic-parameters.tsx +76 -40
  130. package/templates/default/src/components/diagram/options-header-node.tsx +1 -1
  131. package/templates/default/src/components/ui/data-table.tsx +33 -39
  132. package/templates/default/src/lib/automation/paths.ts +181 -0
  133. package/templates/default/src/lib/automation/projection-service.ts +230 -0
  134. package/templates/default/src/lib/environment-file-utils.ts +14 -51
  135. package/templates/default/src/lib/executor/local-executor-adapter.ts +101 -0
  136. package/templates/default/src/lib/executor/types.ts +24 -0
  137. package/templates/default/src/lib/feature-file-generator.ts +22 -112
  138. package/templates/default/src/lib/locator-group-file-utils.ts +57 -120
  139. package/templates/default/src/lib/process/task-spawner.ts +236 -0
  140. package/templates/default/src/lib/template-sync-utils.d.ts +7 -0
  141. package/templates/default/src/lib/template-sync-utils.d.ts.map +1 -0
  142. package/templates/default/src/lib/template-sync-utils.js +47 -0
  143. package/templates/default/src/lib/template-sync-utils.js.map +1 -0
  144. package/templates/default/src/lib/template-sync-utils.ts +63 -0
  145. package/templates/default/src/lib/test-run/process-manager.ts +9 -87
  146. package/templates/default/src/lib/test-run/test-run-executor.ts +7 -136
  147. package/templates/default/src/lib/test-run/winston-logger.ts +6 -35
  148. package/templates/default/src/lib/utils/template-step-file-generator.ts +22 -85
  149. package/templates/default/src/lib/utils/template-step-file-manager-intelligent.ts +7 -22
  150. package/templates/default/public/favicon.ico +0 -0
  151. package/templates/default/src/tests/executor.ts +0 -80
  152. package/templates/default/src/tests/mapping/locator-map.json +0 -1
  153. package/templates/default/src/tests/steps/actions/wait.step.ts +0 -107
  154. package/templates/default/src/tests/support/parameter-types.ts +0 -12
  155. package/templates/default/src/tests/utils/cache.util.ts +0 -260
  156. package/templates/default/src/tests/utils/cli.util.ts +0 -177
  157. package/templates/default/src/tests/utils/environment.util.ts +0 -65
  158. package/templates/default/src/tests/utils/random-data.util.ts +0 -45
  159. package/templates/default/src/tests/utils/spawner.util.ts +0 -617
@@ -0,0 +1,53 @@
1
+ import path from 'path';
2
+ import { existsSync, promises as fs } from 'fs';
3
+ export const TEMPLATE_PREP_SYNC_SCRIPTS = ['sync-template-step-groups', 'sync-template-steps'];
4
+ export async function collectFiles(dir, predicate, baseDir = dir) {
5
+ const entries = await fs.readdir(dir, { withFileTypes: true });
6
+ const files = [];
7
+ for (const entry of entries) {
8
+ const fullPath = path.join(dir, entry.name);
9
+ const relativePath = path.relative(baseDir, fullPath).replace(/\\/g, '/');
10
+ if (entry.isDirectory()) {
11
+ files.push(...(await collectFiles(fullPath, predicate, baseDir)));
12
+ continue;
13
+ }
14
+ if (!predicate || predicate(relativePath)) {
15
+ files.push(fullPath);
16
+ }
17
+ }
18
+ return files;
19
+ }
20
+ export function shouldAbortOnFallbackSeed(usedFallbackSeed, inputHash, previousMetadata) {
21
+ return usedFallbackSeed && previousMetadata?.inputHash !== inputHash;
22
+ }
23
+ export async function verifyPreparedTemplateState(packageTemplateDir, collectFilesFn = collectFiles) {
24
+ const seededDbPath = path.join(packageTemplateDir, 'prisma', 'dev.db');
25
+ const staleNestedDbPath = path.join(packageTemplateDir, 'prisma', 'prisma', 'dev.db');
26
+ const packageEnvPath = path.join(packageTemplateDir, '.env');
27
+ const starterFeaturePath = path.join(packageTemplateDir, 'automation', 'features', 'base', 'login.feature');
28
+ const starterEnvironmentPath = path.join(packageTemplateDir, 'automation', 'config', 'environments', 'environments.json');
29
+ const starterLocatorMapPath = path.join(packageTemplateDir, 'automation', 'mapping', 'locator-map.json');
30
+ const reportFiles = await collectFilesFn(path.join(packageTemplateDir, 'automation', 'reports'));
31
+ if (!existsSync(seededDbPath)) {
32
+ throw new Error(`Prepared template is missing ${seededDbPath}`);
33
+ }
34
+ if (existsSync(staleNestedDbPath)) {
35
+ throw new Error(`Prepared template still contains stale nested database ${staleNestedDbPath}`);
36
+ }
37
+ if (existsSync(packageEnvPath)) {
38
+ throw new Error(`Prepared template should not include ${packageEnvPath}`);
39
+ }
40
+ if (!existsSync(starterFeaturePath)) {
41
+ throw new Error(`Prepared template is missing starter automation feature ${starterFeaturePath}`);
42
+ }
43
+ if (!existsSync(starterEnvironmentPath)) {
44
+ throw new Error(`Prepared template is missing starter environments file ${starterEnvironmentPath}`);
45
+ }
46
+ if (!existsSync(starterLocatorMapPath)) {
47
+ throw new Error(`Prepared template is missing locator map ${starterLocatorMapPath}`);
48
+ }
49
+ if (reportFiles.length > 0) {
50
+ throw new Error(`Prepared template should not include report artifacts, found ${reportFiles.join(', ')}`);
51
+ }
52
+ }
53
+ //# sourceMappingURL=prepare-template-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-template-utils.js","sourceRoot":"","sources":["../src/prepare-template-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prepare-template-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-template-utils.test.d.ts","sourceRoot":"","sources":["../src/prepare-template-utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ import path from 'path';
2
+ import os from 'os';
3
+ import fs from 'fs-extra';
4
+ import { afterEach, describe, expect, it } from 'vitest';
5
+ import { shouldAbortOnFallbackSeed, verifyPreparedTemplateState, } from './prepare-template-utils.js';
6
+ async function createPreparedTemplateFixture(rootDir) {
7
+ await fs.ensureDir(path.join(rootDir, 'prisma'));
8
+ await fs.ensureDir(path.join(rootDir, 'automation', 'features', 'base'));
9
+ await fs.ensureDir(path.join(rootDir, 'automation', 'config', 'environments'));
10
+ await fs.ensureDir(path.join(rootDir, 'automation', 'mapping'));
11
+ await fs.ensureDir(path.join(rootDir, 'automation', 'reports'));
12
+ await fs.writeFile(path.join(rootDir, 'prisma', 'dev.db'), 'db');
13
+ await fs.writeFile(path.join(rootDir, 'automation', 'features', 'base', 'login.feature'), 'Feature: login');
14
+ await fs.writeFile(path.join(rootDir, 'automation', 'config', 'environments', 'environments.json'), '{"demo":{"baseUrl":"https://example.com","apiBaseUrl":"","email":"","password":""}}');
15
+ await fs.writeFile(path.join(rootDir, 'automation', 'mapping', 'locator-map.json'), '[]');
16
+ }
17
+ describe('shouldAbortOnFallbackSeed', () => {
18
+ const previousMetadata = {
19
+ preparedAt: '2026-03-11T00:00:00.000Z',
20
+ inputHash: 'previous-hash',
21
+ databasePath: 'prisma/dev.db',
22
+ };
23
+ it('aborts when fallback seed is used and the template input hash changed', () => {
24
+ expect(shouldAbortOnFallbackSeed(true, 'new-hash', previousMetadata)).toBe(true);
25
+ });
26
+ it('does not abort when fallback seed is not used', () => {
27
+ expect(shouldAbortOnFallbackSeed(false, 'new-hash', previousMetadata)).toBe(false);
28
+ });
29
+ it('does not abort when the previous hash matches', () => {
30
+ expect(shouldAbortOnFallbackSeed(true, 'previous-hash', previousMetadata)).toBe(false);
31
+ });
32
+ });
33
+ describe('verifyPreparedTemplateState', () => {
34
+ const tempDirs = [];
35
+ afterEach(async () => {
36
+ await Promise.all(tempDirs.map(dir => fs.remove(dir).catch(() => { })));
37
+ tempDirs.length = 0;
38
+ });
39
+ async function createTempTemplateDir() {
40
+ const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'create-appraisejs-prepare-'));
41
+ tempDirs.push(dir);
42
+ await createPreparedTemplateFixture(dir);
43
+ return dir;
44
+ }
45
+ it('accepts a prepared template with required starter assets and no reports', async () => {
46
+ const dir = await createTempTemplateDir();
47
+ await expect(verifyPreparedTemplateState(dir)).resolves.toBeUndefined();
48
+ });
49
+ it('fails when the environments starter file is missing', async () => {
50
+ const dir = await createTempTemplateDir();
51
+ await fs.remove(path.join(dir, 'automation', 'config', 'environments', 'environments.json'));
52
+ await expect(verifyPreparedTemplateState(dir)).rejects.toThrow(/starter environments file/);
53
+ });
54
+ it('fails when report artifacts are present', async () => {
55
+ const dir = await createTempTemplateDir();
56
+ await fs.ensureDir(path.join(dir, 'automation', 'reports', 'logs'));
57
+ await fs.writeFile(path.join(dir, 'automation', 'reports', 'logs', 'run.log'), 'artifact');
58
+ await expect(verifyPreparedTemplateState(dir)).rejects.toThrow(/report artifacts/);
59
+ });
60
+ it('fails when a stale nested prisma database is present', async () => {
61
+ const dir = await createTempTemplateDir();
62
+ await fs.ensureDir(path.join(dir, 'prisma', 'prisma'));
63
+ await fs.writeFile(path.join(dir, 'prisma', 'prisma', 'dev.db'), 'stale');
64
+ await expect(verifyPreparedTemplateState(dir)).rejects.toThrow(/stale nested database/);
65
+ });
66
+ });
67
+ //# sourceMappingURL=prepare-template-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-template-utils.test.js","sourceRoot":"","sources":["../src/prepare-template-utils.test.ts"],"names":[],"mappings":"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"}
package/dist/prompts.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';
2
+ export type PlaywrightBrowser = 'chromium' | 'firefox' | 'webkit';
2
3
  export interface PromptAnswers {
3
4
  directory: string;
4
5
  packageManager: PackageManager;
5
6
  runInstall: boolean;
7
+ playwrightBrowsers: PlaywrightBrowser[];
6
8
  }
7
9
  export declare function runPrompts(cwd: string): Promise<PromptAnswers>;
8
10
  //# sourceMappingURL=prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;CACrB;AAuBD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAqCpE"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAC7D,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;CACzC;AAuBD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA8CpE"}
package/dist/prompts.js CHANGED
@@ -1,4 +1,4 @@
1
- import { input, select, confirm } from '@inquirer/prompts';
1
+ import { checkbox, confirm, input, select } from '@inquirer/prompts';
2
2
  import path from 'path';
3
3
  import fs from 'fs';
4
4
  const DEFAULT_DIR = './my-appraisejs-app';
@@ -49,9 +49,17 @@ export async function runPrompts(cwd) {
49
49
  default: 'npm',
50
50
  });
51
51
  const runInstall = await confirm({
52
- message: 'Would you like to run the package installation now?',
52
+ message: 'Would you like to run the production setup now?',
53
53
  default: true,
54
54
  });
55
- return { directory: resolved, packageManager, runInstall };
55
+ const playwrightBrowsers = await checkbox({
56
+ message: 'Which Playwright browsers should we install?',
57
+ choices: [
58
+ { name: 'Chromium', value: 'chromium' },
59
+ { name: 'Firefox', value: 'firefox' },
60
+ { name: 'WebKit', value: 'webkit' },
61
+ ],
62
+ });
63
+ return { directory: resolved, packageManager, runInstall, playwrightBrowsers };
56
64
  }
57
65
  //# sourceMappingURL=prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAUpB,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAE1C,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IACrC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,4BAA4B,QAAQ,mDAAmD,CACxF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;QACzB,OAAO,EAAE,kCAAkC;QAC3C,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;gBAAE,OAAO,gCAAgC,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,WAAW,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,MAAM,CAAiB;QAClD,OAAO,EAAE,2CAA2C;QACpD,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;YAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAC/B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;SAC9B;QACD,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;QAC/B,OAAO,EAAE,qDAAqD;QAC9D,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,16 @@ vi.mock('@inquirer/prompts', () => ({
7
7
  input: vi.fn(),
8
8
  select: vi.fn(),
9
9
  confirm: vi.fn(),
10
+ checkbox: vi.fn(),
10
11
  }));
11
12
  async function getMocks() {
12
- const { input, select, confirm } = await import('@inquirer/prompts');
13
- return { input: input, select: select, confirm: confirm };
13
+ const { checkbox, input, select, confirm } = await import('@inquirer/prompts');
14
+ return {
15
+ checkbox: checkbox,
16
+ input: input,
17
+ select: select,
18
+ confirm: confirm,
19
+ };
14
20
  }
15
21
  describe('runPrompts', () => {
16
22
  let cwd;
@@ -25,16 +31,18 @@ describe('runPrompts', () => {
25
31
  }
26
32
  vi.clearAllMocks();
27
33
  });
28
- it('returns directory, packageManager, and runInstall from mocked prompts', async () => {
34
+ it('returns directory, packageManager, runInstall, and browsers from mocked prompts', async () => {
29
35
  fs.mkdirSync(tempDir, { recursive: true });
30
- const { input, select, confirm } = await getMocks();
36
+ const { checkbox, input, select, confirm } = await getMocks();
31
37
  input.mockResolvedValue(tempDir);
32
38
  select.mockResolvedValue('pnpm');
33
- confirm.mockResolvedValue(false);
39
+ confirm.mockResolvedValue(true);
40
+ checkbox.mockResolvedValue(['chromium', 'webkit']);
34
41
  const result = await runPrompts(cwd);
35
42
  expect(result.directory).toBe(path.resolve(cwd, tempDir));
36
43
  expect(result.packageManager).toBe('pnpm');
37
- expect(result.runInstall).toBe(false);
44
+ expect(result.runInstall).toBe(true);
45
+ expect(result.playwrightBrowsers).toEqual(['chromium', 'webkit']);
38
46
  });
39
47
  it('throws when target directory exists and is non-empty', async () => {
40
48
  fs.mkdirSync(tempDir, { recursive: true });
@@ -45,14 +53,16 @@ describe('runPrompts', () => {
45
53
  });
46
54
  it('accepts when target directory does not exist', async () => {
47
55
  const newPath = path.join(tempDir, 'new-app');
48
- const { input, select, confirm } = await getMocks();
56
+ const { checkbox, input, select, confirm } = await getMocks();
49
57
  input.mockResolvedValue(newPath);
50
58
  select.mockResolvedValue('npm');
51
59
  confirm.mockResolvedValue(true);
60
+ checkbox.mockResolvedValue([]);
52
61
  const result = await runPrompts(cwd);
53
62
  expect(result.directory).toBe(path.resolve(cwd, newPath));
54
63
  expect(result.packageManager).toBe('npm');
55
64
  expect(result.runInstall).toBe(true);
65
+ expect(result.playwrightBrowsers).toEqual([]);
56
66
  });
57
67
  });
58
68
  //# sourceMappingURL=prompts.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../src/prompts.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../src/prompts.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=template-sync-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-sync-utils.test.d.ts","sourceRoot":"","sources":["../src/template-sync-utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { extractModulePathFromAutomationFile, getAutomationLocatorMapPath, shouldBackfillLegacyEnvironmentConfig, shouldExcludeTemplatePath, } from '../../../src/lib/template-sync-utils.js';
2
+ import { describe, expect, it } from 'vitest';
3
+ describe('shouldExcludeTemplatePath', () => {
4
+ it('excludes report artifacts and database files', () => {
5
+ expect(shouldExcludeTemplatePath('automation/reports/logs/run.log')).toBe(true);
6
+ expect(shouldExcludeTemplatePath('prisma/dev.db')).toBe(true);
7
+ expect(shouldExcludeTemplatePath('tsconfig.tsbuildinfo')).toBe(true);
8
+ });
9
+ it('keeps normal source files and config files', () => {
10
+ expect(shouldExcludeTemplatePath('automation/features/base/login.feature')).toBe(false);
11
+ expect(shouldExcludeTemplatePath('prisma/schema.prisma')).toBe(false);
12
+ expect(shouldExcludeTemplatePath('package.json')).toBe(false);
13
+ });
14
+ });
15
+ describe('shouldBackfillLegacyEnvironmentConfig', () => {
16
+ it('backs fills only when the target file is missing and the legacy directory exists', () => {
17
+ expect(shouldBackfillLegacyEnvironmentConfig(false, true)).toBe(true);
18
+ expect(shouldBackfillLegacyEnvironmentConfig(true, true)).toBe(false);
19
+ expect(shouldBackfillLegacyEnvironmentConfig(false, false)).toBe(false);
20
+ });
21
+ });
22
+ describe('extractModulePathFromAutomationFile', () => {
23
+ it('derives locator module paths from automation locators', () => {
24
+ expect(extractModulePathFromAutomationFile('/repo/automation/locators/base/login.json', '/repo', 'locators')).toBe('/base');
25
+ });
26
+ it('derives nested feature module paths from automation features', () => {
27
+ expect(extractModulePathFromAutomationFile('/repo/automation/features/users/admins/directors/login.feature', '/repo', 'features')).toBe('/users/admins/directors');
28
+ });
29
+ it('handles windows-style paths', () => {
30
+ expect(extractModulePathFromAutomationFile('C:\\repo\\automation\\locators\\users\\admins\\dashboard.json', 'C:\\repo', 'locators')).toBe('/users/admins');
31
+ });
32
+ it('returns the root module for top-level feature files', () => {
33
+ expect(extractModulePathFromAutomationFile('/repo/automation/features/login.feature', '/repo', 'features')).toBe('/');
34
+ });
35
+ });
36
+ describe('getAutomationLocatorMapPath', () => {
37
+ it('points locator-map.json into the automation workspace', () => {
38
+ expect(getAutomationLocatorMapPath('/repo')).toBe('/repo/automation/mapping/locator-map.json');
39
+ });
40
+ });
41
+ //# sourceMappingURL=template-sync-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-sync-utils.test.js","sourceRoot":"","sources":["../src/template-sync-utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EACnC,2BAA2B,EAC3B,qCAAqC,EACrC,yBAAyB,GAC1B,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,yBAAyB,CAAC,iCAAiC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/E,MAAM,CAAC,yBAAyB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7D,MAAM,CAAC,yBAAyB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,yBAAyB,CAAC,wCAAwC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvF,MAAM,CAAC,yBAAyB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrE,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,CAAC,qCAAqC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrE,MAAM,CAAC,qCAAqC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrE,MAAM,CAAC,qCAAqC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CACJ,mCAAmC,CAAC,2CAA2C,EAAE,OAAO,EAAE,UAAU,CAAC,CACtG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CACJ,mCAAmC,CACjC,gEAAgE,EAChE,OAAO,EACP,UAAU,CACX,CACF,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CACJ,mCAAmC,CACjC,+DAA+D,EAC/D,UAAU,EACV,UAAU,CACX,CACF,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,mCAAmC,CAAC,yCAAyC,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAC9G,GAAG,CACJ,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IAChG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-appraisejs",
3
- "version": "0.1.9",
3
+ "version": "0.1.10-alpha.1",
4
4
  "description": "Scaffold a new AppraiseJS app in your directory",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Hasnat Jamil",
@@ -37,7 +37,8 @@
37
37
  ],
38
38
  "scripts": {
39
39
  "prepublishOnly": "npm run build",
40
- "build": "npm run sync-templates && tsc",
40
+ "build": "npm run prepare-template && tsc",
41
+ "prepare-template": "tsx scripts/prepare-template.ts",
41
42
  "sync-templates": "tsx scripts/sync-templates.ts",
42
43
  "test": "vitest run",
43
44
  "test:e2e": "vitest run --config vitest.e2e.config.ts",
@@ -0,0 +1,5 @@
1
+ {
2
+ "preparedAt": "2026-03-10T19:21:55.210Z",
3
+ "inputHash": "f696b7c9a5375303fc0767a08bdf6219126e0c471acfbb85604adcb1561959ba",
4
+ "databasePath": "prisma/dev.db"
5
+ }
@@ -1,2 +1,2 @@
1
1
  # Database configuration for local development
2
- DATABASE_URL="file:./prisma/dev.db"
2
+ DATABASE_URL="file:./dev.db"
@@ -1,5 +1,12 @@
1
1
  {
2
- "cucumber.features": ["src/tests/features/**/*.feature"],
3
- "cucumber.glue": ["src/tests/steps/**/*.ts"],
4
- "prisma.pinToPrisma6": true
2
+ "cucumber.features": ["automation/features/**/*.feature"],
3
+ "cucumber.glue": ["automation/steps/**/*.ts"],
4
+ "prisma.pinToPrisma6": true,
5
+ "cucumber.parameterTypes": [
6
+ {
7
+ "name": "boolean",
8
+ "regexp": "true|false"
9
+ }
10
+ ]
5
11
  }
12
+
@@ -1,51 +1,53 @@
1
1
  # Appraise Starter Template
2
2
 
3
- This is a standalone Appraise starter project. Copy this folder into a new directory to start a new project.
3
+ This is a production-first Appraise starter project. Copy this folder into a new directory to start a new project.
4
4
 
5
5
  ## Prerequisites
6
6
 
7
7
  - Node.js 18+
8
- - npm, pnpm, or yarn
8
+ - npm, pnpm, yarn, or bun
9
9
 
10
10
  ## Quick start
11
11
 
12
12
  ```bash
13
- # 1. Install dependencies
14
- npm install --legacy-peer-deps
15
-
16
- # 2. Setup: create .env, run migrations, install Playwright
13
+ # 1. Install dependencies, create .env, and build the production app
17
14
  npm run setup
18
15
 
19
- # 3. Sync entities from filesystem to database
20
- npm run sync-all
16
+ # 2. Optional: install Playwright browsers when you need test execution
17
+ npm run install-playwright -- chromium
21
18
 
22
- # 4. Start the dev server
23
- npm run dev
19
+ # 3. Start the local production server
20
+ npm run start
24
21
  ```
25
22
 
26
23
  ## What you get
27
24
 
28
25
  - **URL**: Open [http://localhost:3000](http://localhost:3000) in your browser.
29
- - **UI**: The full Appraise dashboard and UI — same as the main Appraise app. You can manage test suites, test cases, template steps, locators, environments, tags, and run tests.
26
+ - **Runtime**: A seeded local SQLite database at `prisma/dev.db`.
27
+ - **Automation**: Starter automation assets under `automation/`, including features, locators, environments, and reusable steps.
28
+ - **UI**: The full Appraise dashboard and UI, ready to run from a production build.
30
29
 
31
30
  ## Scripts
32
31
 
33
- | Script | Description |
34
- | ------------------------ | --------------------------------------------------------------------------------------------------------------- |
35
- | `npm run dev` | Start Next.js dev server |
36
- | `npm run build` | Build for production |
37
- | `npm run start` | Start production server |
38
- | `npm run setup` | Install deps, create .env, migrate DB, install Playwright |
39
- | `npm run appraisejs:setup` | Alias for `setup` |
40
- | `npm run sync-all` | Sync all entities (modules, environments, tags, steps, locators, test suites, test cases) from filesystem to DB |
41
- | `npm run appraisejs:sync` | Alias for `sync-all` |
42
- | `npm run test` | Run Cucumber tests |
32
+ | Script | Description |
33
+ | --- | --- |
34
+ | `npm run setup` | Install deps, create `.env`, and build the cucumber runtime plus the local production app |
35
+ | `npm run build:local` | Build the cucumber runtime and the local production app |
36
+ | `npm run start` | Start the local production server |
37
+ | `npm run dev` | Start the Next.js development server |
38
+ | `npm run install-playwright -- <browser...>` | Install selected Playwright browsers |
39
+ | `npm run setup:db` | Recreate the local SQLite database from migrations and rerun `sync-all` |
40
+ | `npm run setup:full` | Reinstall dependencies, rebuild the DB, rerun `sync-all`, and rebuild the production app |
41
+ | `npm run sync-all` | Sync all starter entities from the bundled automation workspace into the database |
42
+ | `npm run appraisejs:sync` | Alias for `sync-all` |
43
43
 
44
44
  ## Configuration
45
45
 
46
- - Copy `.env.example` to `.env` before running (or let `npm run setup` create it). Required: `DATABASE_URL="file:./prisma/dev.db"` for SQLite.
47
- - `appraisejs.config.json` minimal starter config for future CLI/tooling.
46
+ - Copy `.env.example` to `.env` before running, or let `npm run setup` create it.
47
+ - Default local database URL: `DATABASE_URL="file:./dev.db"`.
48
+ - The database file is created at `prisma/dev.db`.
48
49
 
49
- ## Note
50
+ ## Notes
50
51
 
51
- `npm run setup` runs `install-playwright`, which may require network access and a few minutes. The first `sync-all` run will sync entities from the included `src/tests` structure (locators, steps, environments) into the database.
52
+ - `npm run setup` does not install Playwright browsers automatically. Install them only when you need browser-based test execution.
53
+ - `npm run dev` is still available for development workflows, but `npm run start` is the primary path for day-to-day local usage.
@@ -0,0 +1,15 @@
1
+ # AUTO-GENERATED FILE - DO NOT EDIT MANUALLY
2
+ # This file is automatically generated from Test Suite data.
3
+ # Any manual changes will be overwritten when the Test Suite is updated.
4
+ # To modify this feature, update the corresponding Test Suite in the application.
5
+
6
+ Feature: login
7
+
8
+ @tc_7d56316baeced87a
9
+ Scenario: [Login] Verify user is able to login using valid credentials
10
+ Given the user navigates to the "https://demo-test-site-beta.vercel.app" url
11
+ When the user fills in the "email" input field with value "demo@example.com"
12
+ And the user fills in the "password" input field with value "test1234"
13
+ And the user clicks on the "submit" element
14
+ And the user waits for the route "/home" to be loaded
15
+ Then the element "home title" should true contain the text "Welcome to Home Page"
@@ -0,0 +1,3 @@
1
+ {
2
+ "home title": "h1[data-test-id='home-page-title']"
3
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "email": "#email",
3
+ "password": "#password",
4
+ "submit": "button[data-test-id='login-button']",
5
+ "test2": "/test1323"
6
+ }
@@ -0,0 +1,14 @@
1
+ [
2
+ {
3
+ "name": "login",
4
+ "path": "/login"
5
+ },
6
+ {
7
+ "name": "home",
8
+ "path": "/home"
9
+ },
10
+ {
11
+ "name": "test",
12
+ "path": "/test"
13
+ }
14
+ ]
@@ -1,12 +1,9 @@
1
+ import { When, Then, CustomWorld, expect, SelectorName, resolveLocator, getEnvironment, generateRandomData, RandomDataType } from '../../../packages/cucumber-runtime/src/index.js'
1
2
  /**
2
3
  * @name click
3
4
  * @description Template step for handling element click
4
5
  * @type ACTION
5
6
  */
6
- import { When } from '@cucumber/cucumber'
7
- import { CustomWorld } from '../../config/executor/world.js'
8
- import { SelectorName } from '@/types/locator/locator.type'
9
- import { resolveLocator } from '../../utils/locator.util.js'
10
7
 
11
8
  // This file is generated automatically. Add template steps to this group to generate content.
12
9
 
@@ -1,12 +1,9 @@
1
+ import { When, Then, CustomWorld, expect, SelectorName, resolveLocator, getEnvironment, generateRandomData, RandomDataType } from '../../../packages/cucumber-runtime/src/index.js'
1
2
  /**
2
3
  * @name hover
3
4
  * @description Template steps that handles hover actions
4
5
  * @type ACTION
5
6
  */
6
- import { When } from '@cucumber/cucumber';
7
- import { CustomWorld } from '../../config/executor/world.js';
8
- import { SelectorName } from '../../../types/locator/locator.type';
9
- import { resolveLocator } from '../../utils/locator.util.js';
10
7
 
11
8
  // This file is generated automatically. Add template steps to this group to generate content.
12
9
 
@@ -1,12 +1,9 @@
1
+ import { When, Then, CustomWorld, expect, SelectorName, resolveLocator, getEnvironment, generateRandomData, RandomDataType } from '../../../packages/cucumber-runtime/src/index.js'
1
2
  /**
2
3
  * @name input
3
4
  * @description Template steps that deal with inputs
4
5
  * @type ACTION
5
6
  */
6
- import { When } from '@cucumber/cucumber';
7
- import { CustomWorld } from '../../config/executor/world.js';
8
- import { SelectorName } from '@/types/locator/locator.type';
9
- import { resolveLocator } from '../../utils/locator.util.js';
10
7
 
11
8
  // This file is generated automatically. Add template steps to this group to generate content.
12
9
 
@@ -1,11 +1,9 @@
1
+ import { When, Then, CustomWorld, expect, SelectorName, resolveLocator, getEnvironment, generateRandomData, RandomDataType } from '../../../packages/cucumber-runtime/src/index.js'
1
2
  /**
2
3
  * @name navigation
3
4
  * @description Template steps that deals with browser navigation
4
5
  * @type ACTION
5
6
  */
6
- import { When } from '@cucumber/cucumber'
7
- import { CustomWorld } from '../../config/executor/world.js'
8
- import { getEnvironment } from '../../utils/environment.util.js'
9
7
 
10
8
  // This file is generated automatically. Add template steps to this group to generate content.
11
9
 
@@ -1,11 +1,9 @@
1
+ import { When, Then, CustomWorld, expect, SelectorName, resolveLocator, getEnvironment, generateRandomData, RandomDataType } from '../../../packages/cucumber-runtime/src/index.js'
1
2
  /**
2
3
  * @name random data
3
4
  * @description Template steps that handles random data generation
4
5
  * @type ACTION
5
6
  */
6
- import { When } from '@cucumber/cucumber';
7
- import { CustomWorld } from '../../config/executor/world.js';
8
- import { generateRandomData, RandomDataType } from '../../utils/random-data.util.js';
9
7
 
10
8
  // This file is generated automatically. Add template steps to this group to generate content.
11
9
 
@@ -1,12 +1,9 @@
1
+ import { When, Then, CustomWorld, expect, SelectorName, resolveLocator, getEnvironment, generateRandomData, RandomDataType } from '../../../packages/cucumber-runtime/src/index.js'
1
2
  /**
2
3
  * @name store
3
4
  * @description Template steps that handle data storage
4
5
  * @type ACTION
5
6
  */
6
- import { When } from '@cucumber/cucumber';
7
- import { CustomWorld } from '../../config/executor/world.js';
8
- import { SelectorName } from '@/types/locator/locator.type';
9
- import { resolveLocator } from '../../utils/locator.util.js';
10
7
 
11
8
  // This file is generated automatically. Add template steps to this group to generate content.
12
9