@solidxai/core 0.1.10-beta.21 → 0.1.10-beta.22

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 (45) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/CLAUDE.md +18 -0
  3. package/CURRENT_PROMPT +6 -0
  4. package/dist/helpers/bootstrap.helper.js +1 -1
  5. package/dist/helpers/bootstrap.helper.js.map +1 -1
  6. package/dist/seeders/seed-data/solid-core-metadata.json +159 -81
  7. package/dist/services/module-metadata.service.js +1 -1
  8. package/dist/services/module-metadata.service.js.map +1 -1
  9. package/dist/testing/adapters/ui/playwright-adapter.d.ts +1 -0
  10. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  11. package/dist/testing/adapters/ui/playwright-adapter.js +3 -0
  12. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  13. package/dist/testing/steps/ui/index.d.ts.map +1 -1
  14. package/dist/testing/steps/ui/index.js +2 -0
  15. package/dist/testing/steps/ui/index.js.map +1 -1
  16. package/dist/testing/steps/ui/manual.step.d.ts +3 -0
  17. package/dist/testing/steps/ui/manual.step.d.ts.map +1 -0
  18. package/dist/testing/steps/ui/manual.step.js +56 -0
  19. package/dist/testing/steps/ui/manual.step.js.map +1 -0
  20. package/package.json +1 -1
  21. package/src/helpers/bootstrap.helper.ts +1 -1
  22. package/src/helpers/field-crud-managers/field-quality-check-fixes.md +36 -6
  23. package/src/seeders/seed-data/solid-core-metadata.json +159 -81
  24. package/src/services/1.js +6 -0
  25. package/src/services/module-metadata.service.ts +1 -1
  26. package/src/testing/README.md +42 -4
  27. package/src/testing/adapters/ui/playwright-adapter.ts +4 -0
  28. package/src/testing/steps/ui/index.ts +2 -0
  29. package/src/testing/steps/ui/manual.step.ts +80 -0
  30. package/dist-tests/api/authenticate.spec.js +0 -119
  31. package/dist-tests/api/authenticate.spec.js.map +0 -1
  32. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  33. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  34. package/dist-tests/api/ping.spec.js +0 -21
  35. package/dist-tests/api/ping.spec.js.map +0 -1
  36. package/dist-tests/helpers/auth.js +0 -41
  37. package/dist-tests/helpers/auth.js.map +0 -1
  38. package/dist-tests/helpers/env.js +0 -11
  39. package/dist-tests/helpers/env.js.map +0 -1
  40. package/docs/grouping-enhancements.md +0 -89
  41. package/docs/java-spring/README.md +0 -3
  42. package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
  43. package/docs/seed-changes.md +0 -65
  44. package/docs/test-data-workflow.md +0 -200
  45. package/docs/type-declaration-import-issue.md +0 -24
@@ -7,6 +7,7 @@ export declare class PlaywrightAdapter {
7
7
  private context?;
8
8
  page?: Page;
9
9
  constructor(opts?: PlaywrightAdapterOptions);
10
+ isHeadless(): boolean;
10
11
  start(): Promise<void>;
11
12
  stop(): Promise<void>;
12
13
  resolveUrl(url: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"playwright-adapter.d.ts","sourceRoot":"","sources":["../../../../src/testing/adapters/ui/playwright-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,IAAI,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAM3D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAiB;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC;gBAEP,IAAI,CAAC,EAAE,wBAAwB;IAKrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAOhC"}
1
+ {"version":3,"file":"playwright-adapter.d.ts","sourceRoot":"","sources":["../../../../src/testing/adapters/ui/playwright-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,IAAI,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAM3D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAiB;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC;gBAEP,IAAI,CAAC,EAAE,wBAAwB;IAK3C,UAAU,IAAI,OAAO;IAIf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAOhC"}
@@ -42,6 +42,9 @@ class PlaywrightAdapter {
42
42
  this.baseUrl = opts?.baseUrl;
43
43
  this.headless = opts?.headless ?? true;
44
44
  }
45
+ isHeadless() {
46
+ return this.headless;
47
+ }
45
48
  async start() {
46
49
  const { chromium } = await Promise.resolve().then(() => __importStar(require('playwright')));
47
50
  this.browser = await chromium.launch({ headless: this.headless });
@@ -1 +1 @@
1
- {"version":3,"file":"playwright-adapter.js","sourceRoot":"","sources":["../../../../src/testing/adapters/ui/playwright-adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,MAAa,iBAAiB;IAO5B,YAAY,IAA+B;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,YAAY,GAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACxB,CAAC;QAED,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,aAAa,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACnC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AA7CD,8CA6CC","sourcesContent":["import type { Browser, BrowserContext, Page } from \"playwright\";\n\nimport type { PlaywrightAdapterOptions } from \"./ui.types\";\n\nfunction isAbsoluteUrl(url: string): boolean {\n return /^https?:\\/\\//i.test(url);\n}\n\nexport class PlaywrightAdapter {\n private readonly baseUrl?: string;\n private readonly headless: boolean;\n private browser?: Browser;\n private context?: BrowserContext;\n public page?: Page;\n\n constructor(opts?: PlaywrightAdapterOptions) {\n this.baseUrl = opts?.baseUrl;\n this.headless = opts?.headless ?? true;\n }\n\n async start(): Promise<void> {\n const { chromium } = await import('playwright');\n this.browser = await chromium.launch({ headless: this.headless });\n this.context = await this.browser.newContext();\n this.page = await this.context.newPage();\n }\n\n async stop(): Promise<void> {\n try {\n if (this.context) {\n await this.context.close();\n }\n } finally {\n this.context = undefined;\n this.page = undefined;\n }\n\n try {\n if (this.browser) {\n await this.browser.close();\n }\n } finally {\n this.browser = undefined;\n }\n }\n\n resolveUrl(url: string): string {\n if (isAbsoluteUrl(url)) return url;\n if (this.baseUrl) {\n return new URL(url, this.baseUrl).toString();\n }\n return url;\n }\n}\n"]}
1
+ {"version":3,"file":"playwright-adapter.js","sourceRoot":"","sources":["../../../../src/testing/adapters/ui/playwright-adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,MAAa,iBAAiB;IAO5B,YAAY,IAA+B;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC;IACzC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,YAAY,GAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACxB,CAAC;QAED,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,aAAa,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACnC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAjDD,8CAiDC","sourcesContent":["import type { Browser, BrowserContext, Page } from \"playwright\";\n\nimport type { PlaywrightAdapterOptions } from \"./ui.types\";\n\nfunction isAbsoluteUrl(url: string): boolean {\n return /^https?:\\/\\//i.test(url);\n}\n\nexport class PlaywrightAdapter {\n private readonly baseUrl?: string;\n private readonly headless: boolean;\n private browser?: Browser;\n private context?: BrowserContext;\n public page?: Page;\n\n constructor(opts?: PlaywrightAdapterOptions) {\n this.baseUrl = opts?.baseUrl;\n this.headless = opts?.headless ?? true;\n }\n\n isHeadless(): boolean {\n return this.headless;\n }\n\n async start(): Promise<void> {\n const { chromium } = await import('playwright');\n this.browser = await chromium.launch({ headless: this.headless });\n this.context = await this.browser.newContext();\n this.page = await this.context.newPage();\n }\n\n async stop(): Promise<void> {\n try {\n if (this.context) {\n await this.context.close();\n }\n } finally {\n this.context = undefined;\n this.page = undefined;\n }\n\n try {\n if (this.browser) {\n await this.browser.close();\n }\n } finally {\n this.browser = undefined;\n }\n }\n\n resolveUrl(url: string): string {\n if (isAbsoluteUrl(url)) return url;\n if (this.baseUrl) {\n return new URL(url, this.baseUrl).toString();\n }\n return url;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMxD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAK5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAOxD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAM5D"}
@@ -5,10 +5,12 @@ const navigation_step_1 = require("./navigation.step");
5
5
  const form_step_1 = require("./form.step");
6
6
  const actions_step_1 = require("./actions.step");
7
7
  const assertions_step_1 = require("./assertions.step");
8
+ const manual_step_1 = require("./manual.step");
8
9
  function registerUiSteps(registry) {
9
10
  (0, navigation_step_1.registerNavigationSteps)(registry);
10
11
  (0, form_step_1.registerFormSteps)(registry);
11
12
  (0, actions_step_1.registerActionSteps)(registry);
12
13
  (0, assertions_step_1.registerAssertionSteps)(registry);
14
+ (0, manual_step_1.registerManualSteps)(registry);
13
15
  }
14
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/testing/steps/ui/index.ts"],"names":[],"mappings":";;AAMA,0CAKC;AAVD,uDAA4D;AAC5D,2CAAgD;AAChD,iDAAqD;AACrD,uDAA2D;AAE3D,SAAgB,eAAe,CAAC,QAAsB;IACpD,IAAA,yCAAuB,EAAC,QAAQ,CAAC,CAAC;IAClC,IAAA,6BAAiB,EAAC,QAAQ,CAAC,CAAC;IAC5B,IAAA,kCAAmB,EAAC,QAAQ,CAAC,CAAC;IAC9B,IAAA,wCAAsB,EAAC,QAAQ,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import { StepRegistry } from \"../../core/step-registry\";\nimport { registerNavigationSteps } from \"./navigation.step\";\nimport { registerFormSteps } from \"./form.step\";\nimport { registerActionSteps } from \"./actions.step\";\nimport { registerAssertionSteps } from \"./assertions.step\";\n\nexport function registerUiSteps(registry: StepRegistry): void {\n registerNavigationSteps(registry);\n registerFormSteps(registry);\n registerActionSteps(registry);\n registerAssertionSteps(registry);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/testing/steps/ui/index.ts"],"names":[],"mappings":";;AAOA,0CAMC;AAZD,uDAA4D;AAC5D,2CAAgD;AAChD,iDAAqD;AACrD,uDAA2D;AAC3D,+CAAoD;AAEpD,SAAgB,eAAe,CAAC,QAAsB;IACpD,IAAA,yCAAuB,EAAC,QAAQ,CAAC,CAAC;IAClC,IAAA,6BAAiB,EAAC,QAAQ,CAAC,CAAC;IAC5B,IAAA,kCAAmB,EAAC,QAAQ,CAAC,CAAC;IAC9B,IAAA,wCAAsB,EAAC,QAAQ,CAAC,CAAC;IACjC,IAAA,iCAAmB,EAAC,QAAQ,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import { StepRegistry } from \"../../core/step-registry\";\nimport { registerNavigationSteps } from \"./navigation.step\";\nimport { registerFormSteps } from \"./form.step\";\nimport { registerActionSteps } from \"./actions.step\";\nimport { registerAssertionSteps } from \"./assertions.step\";\nimport { registerManualSteps } from \"./manual.step\";\n\nexport function registerUiSteps(registry: StepRegistry): void {\n registerNavigationSteps(registry);\n registerFormSteps(registry);\n registerActionSteps(registry);\n registerAssertionSteps(registry);\n registerManualSteps(registry);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { StepRegistry } from "../../core/step-registry";
2
+ export declare function registerManualSteps(registry: StepRegistry): void;
3
+ //# sourceMappingURL=manual.step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual.step.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/ui/manual.step.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAmBxD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAuDhE"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerManualSteps = registerManualSteps;
4
+ const promises_1 = require("node:readline/promises");
5
+ const node_process_1 = require("node:process");
6
+ function requirePage(ctx, op) {
7
+ if (!ctx.ui || !ctx.ui.page) {
8
+ throw new Error(`Missing UI page on context for op "${op}"`);
9
+ }
10
+ return ctx.ui.page;
11
+ }
12
+ function registerManualSteps(registry) {
13
+ registry.register("ui.waitForManual", async (ctx, step) => {
14
+ const page = requirePage(ctx, "ui.waitForManual");
15
+ const inputConfig = (step.with ?? {});
16
+ const message = inputConfig.message?.trim() || "Manual interaction required.";
17
+ const prompt = inputConfig.prompt?.trim() || "Press Enter to continue...";
18
+ const timeoutMs = inputConfig.timeoutMs;
19
+ const bringToFront = inputConfig.bringToFront ?? true;
20
+ if (ctx.ui?.isHeadless()) {
21
+ throw new Error('Op "ui.waitForManual" requires headed mode. Re-run with --headless false.');
22
+ }
23
+ if (!node_process_1.stdin.isTTY || !node_process_1.stdout.isTTY) {
24
+ throw new Error('Op "ui.waitForManual" requires an interactive terminal (TTY).');
25
+ }
26
+ if (bringToFront) {
27
+ await page.bringToFront();
28
+ }
29
+ console.log("");
30
+ console.log("════════ Manual Interaction Required ════════");
31
+ console.log(message);
32
+ console.log(`Scenario: ${ctx.scenarioId}`);
33
+ console.log(`Current URL: ${page.url()}`);
34
+ console.log(prompt);
35
+ const rl = (0, promises_1.createInterface)({ input: node_process_1.stdin, output: node_process_1.stdout });
36
+ try {
37
+ await rl.question("");
38
+ }
39
+ finally {
40
+ rl.close();
41
+ }
42
+ if (inputConfig.waitForSelector) {
43
+ await page.waitForSelector(inputConfig.waitForSelector, {
44
+ state: "visible",
45
+ timeout: timeoutMs,
46
+ });
47
+ }
48
+ if (inputConfig.waitForUrlEquals) {
49
+ await page.waitForURL((url) => url.toString() === inputConfig.waitForUrlEquals, { timeout: timeoutMs });
50
+ }
51
+ if (inputConfig.waitForUrlContains) {
52
+ await page.waitForURL((url) => url.toString().includes(String(inputConfig.waitForUrlContains)), { timeout: timeoutMs });
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=manual.step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual.step.js","sourceRoot":"","sources":["../../../../src/testing/steps/ui/manual.step.ts"],"names":[],"mappings":"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","sourcesContent":["import { createInterface } from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\n\nimport type { TestContext } from \"../../contracts/runtime-context.types\";\nimport type { OpStep } from \"../../contracts/testing-metadata.types\";\nimport { StepRegistry } from \"../../core/step-registry\";\n\ntype WaitForManualInput = {\n message?: string;\n prompt?: string;\n waitForSelector?: string;\n waitForUrlContains?: string;\n waitForUrlEquals?: string;\n timeoutMs?: number;\n bringToFront?: boolean;\n};\n\nfunction requirePage(ctx: TestContext, op: string) {\n if (!ctx.ui || !ctx.ui.page) {\n throw new Error(`Missing UI page on context for op \"${op}\"`);\n }\n return ctx.ui.page;\n}\n\nexport function registerManualSteps(registry: StepRegistry): void {\n registry.register(\"ui.waitForManual\", async (ctx: TestContext, step: OpStep) => {\n const page = requirePage(ctx, \"ui.waitForManual\");\n const inputConfig = (step.with ?? {}) as WaitForManualInput;\n const message = inputConfig.message?.trim() || \"Manual interaction required.\";\n const prompt = inputConfig.prompt?.trim() || \"Press Enter to continue...\";\n const timeoutMs = inputConfig.timeoutMs;\n const bringToFront = inputConfig.bringToFront ?? true;\n\n if (ctx.ui?.isHeadless()) {\n throw new Error('Op \"ui.waitForManual\" requires headed mode. Re-run with --headless false.');\n }\n if (!input.isTTY || !output.isTTY) {\n throw new Error('Op \"ui.waitForManual\" requires an interactive terminal (TTY).');\n }\n\n if (bringToFront) {\n await page.bringToFront();\n }\n\n console.log(\"\");\n console.log(\"════════ Manual Interaction Required ════════\");\n console.log(message);\n console.log(`Scenario: ${ctx.scenarioId}`);\n console.log(`Current URL: ${page.url()}`);\n console.log(prompt);\n\n const rl = createInterface({ input, output });\n try {\n await rl.question(\"\");\n } finally {\n rl.close();\n }\n\n if (inputConfig.waitForSelector) {\n await page.waitForSelector(inputConfig.waitForSelector, {\n state: \"visible\",\n timeout: timeoutMs,\n });\n }\n\n if (inputConfig.waitForUrlEquals) {\n await page.waitForURL(\n (url) => url.toString() === inputConfig.waitForUrlEquals,\n { timeout: timeoutMs },\n );\n }\n\n if (inputConfig.waitForUrlContains) {\n await page.waitForURL(\n (url) => url.toString().includes(String(inputConfig.waitForUrlContains)),\n { timeout: timeoutMs },\n );\n }\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidxai/core",
3
- "version": "0.1.10-beta.21",
3
+ "version": "0.1.10-beta.22",
4
4
  "description": "This module is a NestJS module containing all the required core providers required by a Solid application",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -188,7 +188,7 @@ export async function bootstrapSolidApp(
188
188
  app.useLogger(app.get(WINSTON_MODULE_NEST_PROVIDER));
189
189
 
190
190
  const elapsed = ((Date.now() - startTime) / 1000).toFixed(2);
191
- app.get(WINSTON_MODULE_NEST_PROVIDER).log(`\x1b[32mServer started on port ${port} in ${elapsed}s\x1b[0m`, 'Bootstrap');
191
+ process.stdout.write(`\x1b[32mServer started on port ${port} in ${elapsed}s\x1b[0m\n`);
192
192
  }
193
193
 
194
194
  // ---- CLI bootstrap ----
@@ -155,24 +155,54 @@ Frontend widget and rendering concerns belong in `solid-core-ui`.
155
155
 
156
156
  ## `many-to-one`
157
157
 
158
- - [ ] Review pending.
158
+ - [ ] Clarify and document the preferred request contract for single relations, because accepting both `<fieldName>Id` and `<fieldName>UserKey` is useful but easy to apply inconsistently across clients.
159
+ - [ ] Review whether the CRUD layer should normalize empty strings for `<fieldName>Id` and `<fieldName>UserKey` more explicitly before required validation runs.
160
+ - [ ] Decide whether user-key-based lookup failures should return a more specific error message than generic required or invalid relation errors.
161
+ - [ ] Review whether relation resolution should support optional fixed-filter enforcement at save time in addition to UI-level filtering.
162
+ - [ ] Consider whether uniqueness on a `many-to-one` field should receive clearer pre-save validation when the authored intent effectively makes the relation one-to-one.
163
+ - [ ] Add targeted coverage for id-based lookup, user-key-based lookup, missing required relations, invalid id shapes, invalid user keys, and partial update behavior.
159
164
 
160
165
  ## `one-to-many`
161
166
 
162
- - [ ] Review pending.
167
+ - [ ] Clarify and document the command contract for collection relations so `set`, `clear`, `link`, `unlink`, `create`, `update`, and `delete` are easier to use consistently from clients.
168
+ - [ ] Review whether malformed or unsupported command values should return more specific validation errors than the current generic failure path.
169
+ - [ ] Decide whether create-time and update-time collection mutation semantics should be normalized more explicitly, especially where some commands are intentionally update-only.
170
+ - [ ] Review whether `relationCoModelFieldName` should be validated more aggressively, because this field is central to child binding and inverse resolution.
171
+ - [ ] Consider whether `relationFieldFixedFilter` should be enforced during relation mutation so child records cannot be linked outside the authored collection scope.
172
+ - [ ] Add targeted coverage for `set`, `clear`, `link`, `unlink`, `create`, `update`, `delete`, invalid command payloads, and partial update behavior.
163
173
 
164
174
  ## `many-to-many`
165
175
 
166
- - [ ] Review pending.
176
+ - [ ] Clarify and document owner-side versus inverse-side mutation semantics so clients understand which effective field names and id lists are honored during CRUD operations.
177
+ - [ ] Review whether malformed owner-side metadata such as missing `isRelationManyToManyOwner` or mismatched inverse names should fail earlier and more clearly.
178
+ - [ ] Decide whether `relationJoinTableName` and related ownership attrs need stronger validation at metadata authoring time to avoid ambiguous join behavior later.
179
+ - [ ] Review whether `relationFieldFixedFilter` should be enforced during membership mutation so unsupported links cannot be created through direct payloads.
180
+ - [ ] Consider whether create, update, and delete operations against related entities should be more clearly separated from plain membership operations such as `set`, `link`, and `unlink`.
181
+ - [ ] Add targeted coverage for owner-side mutations, inverse-side mutations, `set`, `clear`, `link`, `unlink`, related-entity create/update/delete flows, and partial update behavior.
167
182
 
168
183
  ## `mediaSingle`
169
184
 
170
- - [ ] Review pending.
185
+ - [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `mediaSingle` field, including whether the field should ever accept persisted references without a new upload.
186
+ - [ ] Review whether media validation should normalize authored `mediaTypes` values more explicitly so unsupported tokens fail early and predictably.
187
+ - [ ] Consider whether storage-provider resolution should fail with a clearer field-specific error when `mediaStorageProviderUserKey` is missing or invalid.
188
+ - [ ] Review whether replace and delete semantics should be more explicit in the CRUD layer when an existing asset is being updated or removed.
189
+ - [ ] Consider whether upload validation should be refactored into shared utilities so size, type, and required checks stay consistent across media field types.
190
+ - [ ] Add targeted coverage for required create-time uploads, oversized files, unsupported media types, missing providers, replacement flows, and partial update behavior.
171
191
 
172
192
  ## `mediaMultiple`
173
193
 
174
- - [ ] Review pending.
194
+ - [ ] Align collection-level validation with the single-media path so `mediaTypes` and `mediaMaxSizeKb` are enforced consistently for every uploaded file.
195
+ - [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `mediaMultiple` field, including whether persisted media references should ever be accepted directly.
196
+ - [ ] Review whether storage-provider resolution should fail with a clearer field-specific error when `mediaStorageProviderUserKey` is missing or invalid.
197
+ - [ ] Decide what the canonical update semantics should be for attachment collections: append-only, replace-all, explicit remove, or a more command-style contract.
198
+ - [ ] Consider whether media collection validation should report per-file errors more explicitly when one file fails and others succeed.
199
+ - [ ] Add targeted coverage for required create-time collections, mixed valid and invalid uploads, oversized files, unsupported media types, missing providers, and partial update behavior.
175
200
 
176
201
  ## `computed`
177
202
 
178
- - [ ] Review pending.
203
+ - [ ] Clarify and document the supported provider contract more explicitly, including what a computed-field provider must return and how failures should be surfaced to callers.
204
+ - [ ] Review whether `computedFieldValueProviderCtxt` should be validated as JSON earlier and with clearer error messaging before provider execution begins.
205
+ - [ ] Decide whether inline computation should remain skipped on partial updates by default, or whether some computed fields need an opt-in recompute path during patch-style operations.
206
+ - [ ] Review whether `computedFieldTriggerConfig` should be validated more aggressively so unsupported operations or malformed trigger definitions fail earlier.
207
+ - [ ] Consider whether the CRUD layer should verify that the provider’s returned value matches `computedFieldValueType` before persistence.
208
+ - [ ] Add targeted coverage for inline provider execution, malformed provider context, missing providers, trigger-configured fields, partial updates, and mismatched computed value types.
@@ -14000,34 +14000,16 @@
14000
14000
  "children": [
14001
14001
  {
14002
14002
  "type": "column",
14003
- "attrs": { "name": "col-1", "label": "", "className": "col-12 sm:col-12 md:col-6 lg:col-6" },
14003
+ "attrs": { "name": "col-1", "label": "", "className": "col-12" },
14004
14004
  "children": [
14005
14005
  { "type": "field", "attrs": { "name": "sessionId" } },
14006
14006
  { "type": "field", "attrs": { "name": "modelName" } },
14007
14007
  { "type": "field", "attrs": { "name": "status" } },
14008
- { "type": "field", "attrs": { "name": "projectRoot" } }
14009
- ]
14010
- },
14011
- {
14012
- "type": "column",
14013
- "attrs": { "name": "col-2", "label": "", "className": "col-12 sm:col-12 md:col-6 lg:col-6" },
14014
- "children": [
14008
+ { "type": "field", "attrs": { "name": "projectRoot" } },
14015
14009
  { "type": "field", "attrs": { "name": "totalSteps" } },
14016
14010
  { "type": "field", "attrs": { "name": "totalCost" } },
14017
14011
  { "type": "field", "attrs": { "name": "totalInputTokens" } },
14018
- { "type": "field", "attrs": { "name": "totalOutputTokens" } }
14019
- ]
14020
- }
14021
- ]
14022
- },
14023
- {
14024
- "type": "row",
14025
- "attrs": { "name": "row-2" },
14026
- "children": [
14027
- {
14028
- "type": "column",
14029
- "attrs": { "name": "col-summary", "label": "", "className": "col-12" },
14030
- "children": [
14012
+ { "type": "field", "attrs": { "name": "totalOutputTokens" } },
14031
14013
  { "type": "field", "attrs": { "name": "summary" } }
14032
14014
  ]
14033
14015
  }
@@ -14091,46 +14073,94 @@
14091
14073
  "attrs": { "name": "sheet-1" },
14092
14074
  "children": [
14093
14075
  {
14094
- "type": "row",
14095
- "attrs": { "name": "row-1" },
14076
+ "type": "notebook",
14077
+ "attrs": { "name": "notebook-1" },
14096
14078
  "children": [
14097
14079
  {
14098
- "type": "column",
14099
- "attrs": { "name": "col-1", "label": "", "className": "col-12 sm:col-12 md:col-6 lg:col-6" },
14080
+ "type": "page",
14081
+ "attrs": { "name": "page-general", "label": "General" },
14100
14082
  "children": [
14101
- { "type": "field", "attrs": { "name": "sessionId" } },
14102
- { "type": "field", "attrs": { "name": "eventType" } },
14103
- { "type": "field", "attrs": { "name": "turnNumber" } },
14104
- { "type": "field", "attrs": { "name": "stepNumber" } },
14105
- { "type": "field", "attrs": { "name": "toolName" } },
14106
- { "type": "field", "attrs": { "name": "modelUsed" } }
14083
+ {
14084
+ "type": "row",
14085
+ "attrs": { "name": "page-general-row-1" },
14086
+ "children": [
14087
+ {
14088
+ "type": "column",
14089
+ "attrs": { "name": "page-general-col-1", "label": "", "className": "col-12" },
14090
+ "children": [
14091
+ { "type": "field", "attrs": { "name": "sessionId" } },
14092
+ { "type": "field", "attrs": { "name": "eventType" } },
14093
+ { "type": "field", "attrs": { "name": "turnNumber" } },
14094
+ { "type": "field", "attrs": { "name": "stepNumber" } },
14095
+ { "type": "field", "attrs": { "name": "toolName" } },
14096
+ { "type": "field", "attrs": { "name": "modelUsed" } },
14097
+ { "type": "field", "attrs": { "name": "durationMs" } },
14098
+ { "type": "field", "attrs": { "name": "cost" } },
14099
+ { "type": "field", "attrs": { "name": "inputTokens" } },
14100
+ { "type": "field", "attrs": { "name": "outputTokens" } },
14101
+ { "type": "field", "attrs": { "name": "toolReturncode" } },
14102
+ { "type": "field", "attrs": { "name": "content" } }
14103
+ ]
14104
+ }
14105
+ ]
14106
+ }
14107
14107
  ]
14108
14108
  },
14109
14109
  {
14110
- "type": "column",
14111
- "attrs": { "name": "col-2", "label": "", "className": "col-12 sm:col-12 md:col-6 lg:col-6" },
14110
+ "type": "page",
14111
+ "attrs": { "name": "page-tool-arguments", "label": "Tool Arguments" },
14112
14112
  "children": [
14113
- { "type": "field", "attrs": { "name": "durationMs" } },
14114
- { "type": "field", "attrs": { "name": "cost" } },
14115
- { "type": "field", "attrs": { "name": "inputTokens" } },
14116
- { "type": "field", "attrs": { "name": "outputTokens" } },
14117
- { "type": "field", "attrs": { "name": "toolReturncode" } }
14113
+ {
14114
+ "type": "row",
14115
+ "attrs": { "name": "page-tool-arguments-row-1" },
14116
+ "children": [
14117
+ {
14118
+ "type": "column",
14119
+ "attrs": { "name": "page-tool-arguments-col-1", "label": "", "className": "col-12" },
14120
+ "children": [
14121
+ { "type": "field", "attrs": { "name": "toolArguments", "viewWidget": "SolidJsonFormViewWidget" } }
14122
+ ]
14123
+ }
14124
+ ]
14125
+ }
14118
14126
  ]
14119
- }
14120
- ]
14121
- },
14122
- {
14123
- "type": "row",
14124
- "attrs": { "name": "row-2" },
14125
- "children": [
14127
+ },
14126
14128
  {
14127
- "type": "column",
14128
- "attrs": { "name": "col-content", "label": "", "className": "col-12" },
14129
+ "type": "page",
14130
+ "attrs": { "name": "page-tool-output", "label": "Tool Output" },
14129
14131
  "children": [
14130
- { "type": "field", "attrs": { "name": "content" } },
14131
- { "type": "field", "attrs": { "name": "toolArguments", "viewWidget": "SolidJsonFormViewWidget" } },
14132
- { "type": "field", "attrs": { "name": "toolOutput", "viewWidget": "SolidJsonFormViewWidget" } },
14133
- { "type": "field", "attrs": { "name": "eventData", "viewWidget": "SolidJsonFormViewWidget" } }
14132
+ {
14133
+ "type": "row",
14134
+ "attrs": { "name": "page-tool-output-row-1" },
14135
+ "children": [
14136
+ {
14137
+ "type": "column",
14138
+ "attrs": { "name": "page-tool-output-col-1", "label": "", "className": "col-12" },
14139
+ "children": [
14140
+ { "type": "field", "attrs": { "name": "toolOutput", "viewWidget": "SolidJsonFormViewWidget" } }
14141
+ ]
14142
+ }
14143
+ ]
14144
+ }
14145
+ ]
14146
+ },
14147
+ {
14148
+ "type": "page",
14149
+ "attrs": { "name": "page-event-data", "label": "Event Data" },
14150
+ "children": [
14151
+ {
14152
+ "type": "row",
14153
+ "attrs": { "name": "page-event-data-row-1" },
14154
+ "children": [
14155
+ {
14156
+ "type": "column",
14157
+ "attrs": { "name": "page-event-data-col-1", "label": "", "className": "col-12" },
14158
+ "children": [
14159
+ { "type": "field", "attrs": { "name": "eventData", "viewWidget": "SolidJsonFormViewWidget" } }
14160
+ ]
14161
+ }
14162
+ ]
14163
+ }
14134
14164
  ]
14135
14165
  }
14136
14166
  ]
@@ -14193,46 +14223,94 @@
14193
14223
  "attrs": { "name": "sheet-1" },
14194
14224
  "children": [
14195
14225
  {
14196
- "type": "row",
14197
- "attrs": { "name": "row-1" },
14226
+ "type": "notebook",
14227
+ "attrs": { "name": "notebook-1" },
14198
14228
  "children": [
14199
14229
  {
14200
- "type": "column",
14201
- "attrs": { "name": "col-1", "label": "", "className": "col-12 sm:col-12 md:col-6 lg:col-6" },
14230
+ "type": "page",
14231
+ "attrs": { "name": "page-general", "label": "General" },
14202
14232
  "children": [
14203
- { "type": "field", "attrs": { "name": "method" } },
14204
- { "type": "field", "attrs": { "name": "toolName" } },
14205
- { "type": "field", "attrs": { "name": "status" } },
14206
- { "type": "field", "attrs": { "name": "transport" } },
14207
- { "type": "field", "attrs": { "name": "mcpSessionId" } },
14208
- { "type": "field", "attrs": { "name": "requestId" } }
14233
+ {
14234
+ "type": "row",
14235
+ "attrs": { "name": "page-general-row-1" },
14236
+ "children": [
14237
+ {
14238
+ "type": "column",
14239
+ "attrs": { "name": "page-general-col-1", "label": "", "className": "col-12" },
14240
+ "children": [
14241
+ { "type": "field", "attrs": { "name": "method" } },
14242
+ { "type": "field", "attrs": { "name": "toolName" } },
14243
+ { "type": "field", "attrs": { "name": "status" } },
14244
+ { "type": "field", "attrs": { "name": "transport" } },
14245
+ { "type": "field", "attrs": { "name": "mcpSessionId" } },
14246
+ { "type": "field", "attrs": { "name": "requestId" } },
14247
+ { "type": "field", "attrs": { "name": "userId" } },
14248
+ { "type": "field", "attrs": { "name": "apiKeyId" } },
14249
+ { "type": "field", "attrs": { "name": "username" } },
14250
+ { "type": "field", "attrs": { "name": "clientAddr" } },
14251
+ { "type": "field", "attrs": { "name": "durationMs" } },
14252
+ { "type": "field", "attrs": { "name": "errorCode" } }
14253
+ ]
14254
+ }
14255
+ ]
14256
+ }
14209
14257
  ]
14210
14258
  },
14211
14259
  {
14212
- "type": "column",
14213
- "attrs": { "name": "col-2", "label": "", "className": "col-12 sm:col-12 md:col-6 lg:col-6" },
14260
+ "type": "page",
14261
+ "attrs": { "name": "page-request-params", "label": "Request Params" },
14214
14262
  "children": [
14215
- { "type": "field", "attrs": { "name": "userId" } },
14216
- { "type": "field", "attrs": { "name": "apiKeyId" } },
14217
- { "type": "field", "attrs": { "name": "username" } },
14218
- { "type": "field", "attrs": { "name": "clientAddr" } },
14219
- { "type": "field", "attrs": { "name": "durationMs" } },
14220
- { "type": "field", "attrs": { "name": "errorCode" } }
14263
+ {
14264
+ "type": "row",
14265
+ "attrs": { "name": "page-request-params-row-1" },
14266
+ "children": [
14267
+ {
14268
+ "type": "column",
14269
+ "attrs": { "name": "page-request-params-col-1", "label": "", "className": "col-12" },
14270
+ "children": [
14271
+ { "type": "field", "attrs": { "name": "requestParams", "viewWidget": "SolidJsonFormViewWidget" } }
14272
+ ]
14273
+ }
14274
+ ]
14275
+ }
14221
14276
  ]
14222
- }
14223
- ]
14224
- },
14225
- {
14226
- "type": "row",
14227
- "attrs": { "name": "row-2" },
14228
- "children": [
14277
+ },
14229
14278
  {
14230
- "type": "column",
14231
- "attrs": { "name": "col-payload", "label": "", "className": "col-12" },
14279
+ "type": "page",
14280
+ "attrs": { "name": "page-response-result", "label": "Response Result" },
14281
+ "children": [
14282
+ {
14283
+ "type": "row",
14284
+ "attrs": { "name": "page-response-result-row-1" },
14285
+ "children": [
14286
+ {
14287
+ "type": "column",
14288
+ "attrs": { "name": "page-response-result-col-1", "label": "", "className": "col-12" },
14289
+ "children": [
14290
+ { "type": "field", "attrs": { "name": "responseResult", "viewWidget": "SolidJsonFormViewWidget" } }
14291
+ ]
14292
+ }
14293
+ ]
14294
+ }
14295
+ ]
14296
+ },
14297
+ {
14298
+ "type": "page",
14299
+ "attrs": { "name": "page-error-message", "label": "Error Message" },
14232
14300
  "children": [
14233
- { "type": "field", "attrs": { "name": "requestParams", "viewWidget": "SolidJsonFormViewWidget" } },
14234
- { "type": "field", "attrs": { "name": "responseResult", "viewWidget": "SolidJsonFormViewWidget" } },
14235
- { "type": "field", "attrs": { "name": "errorMessage" } }
14301
+ {
14302
+ "type": "row",
14303
+ "attrs": { "name": "page-error-message-row-1" },
14304
+ "children": [
14305
+ {
14306
+ "type": "column",
14307
+ "attrs": { "name": "page-error-message-col-1", "label": "", "className": "col-12" },
14308
+ "children": [
14309
+ { "type": "field", "attrs": { "name": "errorMessage" } }
14310
+ ]
14311
+ }
14312
+ ]
14313
+ }
14236
14314
  ]
14237
14315
  }
14238
14316
  ]
@@ -0,0 +1,6 @@
1
+ 1. Do i need to create a storeStreams method for aws service too?
2
+ - Handle later
3
+ 2. queues handling -> if queues is enabled by default, i.e triggerExport(exportTransactionEntity.id).
4
+ - startExport should either return the data or return the transaction id
5
+ 3. How to handle scenarios wherein, nested related exist.(do i need to only get the userkey)
6
+ - show the userKey
@@ -410,7 +410,7 @@ export class ModuleMetadataService {
410
410
  const module = await this.findOne(moduleId);
411
411
  return this.commandService.executeCommandWithArgs({
412
412
  command: 'npx',
413
- args: ['@solixai/solidctl@latest', 'generate', 'module', `--name=${module.name}`],
413
+ args: ['@solidxai/solidctl@latest', 'generate', 'module', `--name=${module.name}`],
414
414
  cwd: path.join(process.cwd(), '..'),
415
415
  });
416
416
  }