cabloy 5.1.177 → 5.1.179

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 (31) hide show
  1. package/.cabloy-version +1 -1
  2. package/CHANGELOG.md +18 -0
  3. package/package.json +1 -1
  4. package/repo-e2e/specs/cabloy-basic.spec.ts +68 -1
  5. package/repo-e2e/specs/controller-boundary.spec.ts +42 -0
  6. package/repo-e2e/specs/routed-dialog.spec.ts +15 -0
  7. package/vona/packages-cli/cli/package.json +1 -1
  8. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudBasic/boilerplate/src/controller/{{resourceName}}.ts_ +1 -1
  9. package/vona/packages-cli/cli-set-api/package.json +1 -1
  10. package/vona/pnpm-lock.yaml +85 -223
  11. package/vona/pnpm-workspace.yaml +1 -1
  12. package/zova/packages-utils/zova-jsx/package.json +2 -2
  13. package/zova/packages-zova/zova/package.json +3 -3
  14. package/zova/packages-zova/zova-core/package.json +1 -1
  15. package/zova/packages-zova/zova-core/src/bean/beanContainer.ts +4 -0
  16. package/zova/packages-zova/zova-core/src/composables/useController.ts +4 -1
  17. package/zova/pnpm-lock.yaml +21 -21
  18. package/zova/src/suite/a-home/modules/home-indexadmin/src/page/dashboard/controller.tsx +31 -0
  19. package/zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/render.tabs.tsx +18 -2
  20. package/zova/src/suite-vendor/a-zova/modules/a-router/package.json +1 -1
  21. package/zova/src/suite-vendor/a-zova/modules/a-router/src/bean/bean.router.ts +13 -22
  22. package/zova/src/suite-vendor/a-zova/modules/a-router/src/bean/sys.router.ts +1 -0
  23. package/zova/src/suite-vendor/a-zova/modules/a-router/src/lib/routerGuardDisposers.ts +19 -0
  24. package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkey.ts +1 -0
  25. package/zova/src/suite-vendor/a-zova/modules/a-router/src/service/routerGuards.ts +12 -3
  26. package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/pageMeta.ts +6 -1
  27. package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/routerView.ts +5 -0
  28. package/zova/src/suite-vendor/a-zova/modules/a-router/test/lib/routerGuardDisposers.test.ts +24 -0
  29. package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
  30. package/zova/src/suite-vendor/a-zova/package.json +3 -3
  31. /package/vona/patches/{zova-core@5.1.90.patch → zova-core@5.1.91.patch} +0 -0
package/.cabloy-version CHANGED
@@ -1 +1 @@
1
- 5.1.177
1
+ 5.1.179
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.1.179
4
+
5
+ ### Improvements
6
+
7
+ - Refresh the Zova lockfile and core patch dependencies.
8
+
9
+ ## 5.1.178
10
+
11
+ ### Features
12
+
13
+ - Add `setPageMeta` support for configuring page metadata.
14
+
15
+ ### Bug Fixes
16
+
17
+ - Fix router behavior.
18
+ - Correct `isAttemptActive` handling.
19
+ - Ensure route resources are ready before initializing controller data.
20
+
3
21
  ## 5.1.177
4
22
 
5
23
  ### Improvements
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cabloy",
3
- "version": "5.1.177",
3
+ "version": "5.1.179",
4
4
  "gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
5
5
  "description": "A Node.js fullstack framework",
6
6
  "keywords": [
@@ -28,6 +28,16 @@ function collectPageErrors(page: Page) {
28
28
  return errors;
29
29
  }
30
30
 
31
+ function collectConsoleErrors(page: Page) {
32
+ const errors: string[] = [];
33
+ page.on('console', message => {
34
+ if (message.type() === 'error') {
35
+ errors.push(message.text());
36
+ }
37
+ });
38
+ return errors;
39
+ }
40
+
31
41
  async function loginAsAdmin(page: Page) {
32
42
  await page.goto('/admin/', { waitUntil: 'load' });
33
43
  if (page.url().includes('/admin/login')) {
@@ -319,7 +329,64 @@ test(
319
329
  );
320
330
 
321
331
  test(
322
- 'ATP-BASIC-FLOW-01: Training Student flow filter wraps and submits queries',
332
+ 'ATP-BASIC-FLOW-01: cold Admin navigation initializes dynamic resource selectors',
333
+ { tag: ['@admin', '@flow'] },
334
+ async ({ browser }) => {
335
+ const context = await browser.newContext();
336
+ const page = await context.newPage();
337
+ const pageErrors = collectPageErrors(page);
338
+ const consoleErrors = collectConsoleErrors(page);
339
+ try {
340
+ await page.goto('/admin/login', { waitUntil: 'load' });
341
+ await page.evaluate(() => {
342
+ indexedDB.deleteDatabase('localforage');
343
+ localStorage.clear();
344
+ sessionStorage.clear();
345
+ });
346
+ await page.goto('/admin/login?returnTo=/rest/resource/training-student%253Astudent', {
347
+ waitUntil: 'load',
348
+ });
349
+ await page.getByPlaceholder('Your Username').fill('admin');
350
+ await page.getByPlaceholder('Your Password').fill('123456');
351
+ await expect(page.getByPlaceholder('Please input captcha')).not.toHaveValue('');
352
+
353
+ const initialSelect = waitForStudentSelect(page);
354
+ await page.getByRole('button', { name: 'Login', exact: true }).click();
355
+ try {
356
+ await expect(page).toHaveURL(studentResourceUrl);
357
+ await initialSelect;
358
+ } finally {
359
+ await initialSelect.catch(() => {});
360
+ }
361
+ await expect(page.getByLabel('Student Name')).toBeVisible();
362
+
363
+ await page.getByRole('link', { name: 'Home', exact: true }).click();
364
+ await expect(page).toHaveURL(/\/admin\/(?:\?|$)/);
365
+ await expect(page.locator('html')).toHaveAttribute('data-zova-hydrated', 'admin');
366
+ await expect(
367
+ page.getByRole('heading', { name: 'Vona integrated SSR', exact: true }),
368
+ ).toBeVisible();
369
+ await expect(
370
+ page.getByRole('heading', { name: 'Zova standalone SSR', exact: true }),
371
+ ).toBeVisible();
372
+ await expect(page.locator('body')).toBeVisible();
373
+
374
+ expect(pageErrors).toEqual([]);
375
+ expect(
376
+ consoleErrors.some(
377
+ error =>
378
+ error.includes("Cannot read properties of undefined (reading 'resource')") ||
379
+ error.includes('resource not specified'),
380
+ ),
381
+ ).toBeFalsy();
382
+ } finally {
383
+ await context.close();
384
+ }
385
+ },
386
+ );
387
+
388
+ test(
389
+ 'ATP-BASIC-FLOW-02: Training Student flow filter wraps and submits queries',
323
390
  { tag: ['@admin', '@flow'] },
324
391
  async ({ page }) => {
325
392
  await page.setViewportSize({ width: 1440, height: 900 });
@@ -101,6 +101,48 @@ test(
101
101
  },
102
102
  );
103
103
 
104
+ test(
105
+ 'ATP-BASIC-CONTROLLER-BOUNDARY-06: disposed and stale loads do not surface errors',
106
+ { tag: ['@web', '@flow'] },
107
+ async ({ page }) => {
108
+ const pageErrors = collectPageErrors(page);
109
+ const consoleErrors = collectConsoleErrors(page);
110
+ const response = await page.goto('/demo/basic/controllerBoundary', { waitUntil: 'load' });
111
+ expect(response?.ok()).toBeTruthy();
112
+ await expect(page.locator('html')).toHaveAttribute('data-zova-hydrated', 'web');
113
+ await page.waitForTimeout(1_000);
114
+
115
+ const loading = page.getByRole('status');
116
+ const error = page.locator('.alert.alert-error');
117
+ const ready = page.getByText('Controller boundary probe ready', { exact: true });
118
+
119
+ const disposedLoading = loading.waitFor({ state: 'visible' });
120
+ await page.getByRole('button', { name: 'Mount failing probe', exact: true }).click();
121
+ await disposedLoading;
122
+ await page.getByRole('button', { name: 'Clear probe', exact: true }).click();
123
+ await page.waitForTimeout(1_000);
124
+ await expect(loading).toHaveCount(0);
125
+ await expect(error).toHaveCount(0);
126
+ await expect(ready).toHaveCount(0);
127
+
128
+ const staleLoading = loading.waitFor({ state: 'visible' });
129
+ await page.getByRole('button', { name: 'Mount failing probe', exact: true }).click();
130
+ await staleLoading;
131
+ await page.getByRole('button', { name: 'Mount fast success probe', exact: true }).click();
132
+ await expect(ready).toBeVisible();
133
+ await page.waitForTimeout(1_000);
134
+ await expect(error).toHaveCount(0);
135
+ await expect(ready).toBeVisible();
136
+
137
+ expect(pageErrors).toEqual([]);
138
+ expect(
139
+ consoleErrors.filter(error =>
140
+ /Cannot read properties of null \(reading ['"]state['"]\)/.test(error),
141
+ ),
142
+ ).toEqual([]);
143
+ },
144
+ );
145
+
104
146
  test(
105
147
  'ATP-BASIC-CONTROLLER-BOUNDARY-02: inline boundaries preserve phrasing-content markup',
106
148
  { tag: ['@web', '@flow'] },
@@ -195,6 +195,21 @@ test(
195
195
  await expect(dialogA.getByRole('button', { name: 'Back', exact: true })).toHaveCount(0);
196
196
  expect(page.url()).toBe(browserUrl);
197
197
 
198
+ await page.keyboard.press('Escape');
199
+ await expect(dialogA).toHaveCount(0);
200
+ expect(page.url()).toBe(browserUrl);
201
+
202
+ await page.getByRole('button', { name: 'Open A', exact: true }).click();
203
+ await expect(dialogA).toHaveCount(1);
204
+ await expect(
205
+ dialogA.getByRole('heading', { name: 'Routed Dialog Entry', exact: true }),
206
+ ).toBeVisible();
207
+ await dialogA.getByRole('button', { name: 'Local push to detail', exact: true }).click();
208
+ await expect(
209
+ dialogA.getByRole('heading', { name: 'Routed Dialog Detail', exact: true }),
210
+ ).toBeVisible();
211
+ expect(page.url()).toBe(browserUrl);
212
+
198
213
  await page.keyboard.press('Escape');
199
214
  await expect(dialogA).toHaveCount(0);
200
215
  expect(page.url()).toBe(browserUrl);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-cli",
3
- "version": "1.1.150",
3
+ "version": "1.1.151",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "vona cli",
6
6
  "keywords": [
@@ -65,5 +65,5 @@ export class Controller<%=argv.resourceNameCapitalize%> extends BeanBase {
65
65
  @Passport.systemAdmin()
66
66
  async deleteBulk(@Arg.body() command: Dto<%=argv.resourceNameCapitalize%>DeleteBulk): Promise<void> {
67
67
  await this.scope.service.<%=argv.resourceName%>.deleteBulk(command.ids);
68
- }
68
+ }
69
69
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-cli-set-api",
3
- "version": "1.1.148",
3
+ "version": "1.1.149",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "vona cli-set-api",
6
6
  "keywords": [