@jskit-ai/agent-docs 0.1.278 → 0.1.280
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.
- package/guide/agent/app-extras/assistant.md +123 -0
- package/guide/agent/app-setup/authentication.md +46 -4
- package/guide/agent/app-setup/database-layer.md +35 -6
- package/guide/agent/app-setup/material-3-migration.md +53 -10
- package/guide/agent/app-setup/multi-homing.md +8 -2
- package/guide/agent/app-setup/upgrading-jskit.md +30 -0
- package/guide/agent/app-setup/users.md +9 -1
- package/guide/agent/framework/material-3.md +153 -71
- package/guide/agent/framework/sanity-checks.md +180 -0
- package/guide/agent/framework/translation.md +4 -0
- package/guide/agent/framework/typed-features.md +158 -105
- package/guide/agent/framework/ui-operations.md +3 -1
- package/guide/agent/index.md +3 -0
- package/package.json +2 -2
- package/patterns/feature-package/example/booking-engine/package.json +1 -1
- package/patterns/minimal-foundation/PATTERN.md +6 -2
- package/patterns/minimal-foundation/example/AGENTS.md +10 -0
- package/patterns/minimal-foundation/example/package.json +6 -6
- package/patterns/minimal-foundation/example/playwright.config.mjs +3 -0
- package/patterns/minimal-foundation/example/src/main.js +3 -2
- package/patterns/minimal-foundation/example/vite.config.mjs +3 -1
- package/patterns/shell-foundation/PATTERN.md +4 -1
- package/patterns/shell-foundation/example/AGENTS.md +10 -0
- package/patterns/shell-foundation/example/package.json +7 -7
- package/patterns/shell-foundation/example/packages/main/package.json +1 -1
- package/patterns/shell-foundation/example/packages/main/src/client/providers/MainClientProvider.js +3 -0
- package/patterns/shell-foundation/example/playwright.config.mjs +3 -0
- package/patterns/shell-foundation/example/src/components/menus/SectionTabLinkItem.vue +42 -0
- package/patterns/shell-foundation/example/src/main.js +3 -2
- package/patterns/shell-foundation/example/src/pages/home.vue +1 -1
- package/patterns/shell-foundation/example/src/views/NotFound.vue +1 -1
- package/patterns/shell-foundation/example/vite.config.mjs +3 -1
- package/reference/autogen/PATTERN_INDEX.md +37 -37
- package/reference/autogen/packages/agent-docs.md +4 -0
- package/reference/autogen/packages/assistant-runtime.md +27 -2
- package/reference/autogen/packages/auth-provider-local-core.md +1 -1
- package/reference/autogen/packages/auth-web.md +10 -0
- package/reference/autogen/packages/crud-core.md +3 -0
- package/reference/autogen/packages/http-web.md +0 -6
- package/reference/autogen/packages/json-rest-api-core.md +17 -4
- package/reference/autogen/packages/kernel.md +10 -1
- package/reference/autogen/packages/material-web.md +2 -1
- package/reference/autogen/packages/shell-web.md +95 -4
- package/reference/autogen/packages/users-web.md +9 -2
- package/reference/autogen/packages/workspaces-core.md +2 -0
- package/reference/autogen/tooling/jskit-catalog.md +55 -6
- package/reference/autogen/tooling/testUtils.md +15 -1
- package/skills/jskit/SKILL.md +15 -5
- package/skills/jskit/references/heuristics/INDEX.md +3 -1
- package/skills/jskit/references/heuristics/row-policies.md +3 -3
- package/skills/jskit/references/heuristics/typed-features.md +7 -7
- package/skills/jskit/references/heuristics/ui-testing.md +8 -7
- package/skills/jskit/references/material-3.md +153 -71
- package/skills/jskit/references/multi-homing.md +8 -2
- package/skills/jskit/references/pattern-index.md +37 -37
- package/skills/jskit/references/patterns/app/minimal-foundation/PATTERN.md +6 -2
- package/skills/jskit/references/patterns/app/minimal-foundation/example/AGENTS.md +10 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +6 -6
- package/skills/jskit/references/patterns/app/minimal-foundation/example/playwright.config.mjs +3 -0
- package/skills/jskit/references/patterns/app/minimal-foundation/example/src/main.js +3 -2
- package/skills/jskit/references/patterns/app/minimal-foundation/example/vite.config.mjs +3 -1
- package/skills/jskit/references/patterns/app/shell-foundation/PATTERN.md +4 -1
- package/skills/jskit/references/patterns/app/shell-foundation/example/AGENTS.md +10 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +7 -7
- package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +1 -1
- package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/client/providers/MainClientProvider.js +3 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/playwright.config.mjs +3 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/components/menus/SectionTabLinkItem.vue +42 -0
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/main.js +3 -2
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/pages/home.vue +1 -1
- package/skills/jskit/references/patterns/app/shell-foundation/example/src/views/NotFound.vue +1 -1
- package/skills/jskit/references/patterns/app/shell-foundation/example/vite.config.mjs +3 -1
- package/skills/jskit/references/patterns/auth/accounts-hub/example/package.json +2 -2
- package/skills/jskit/references/patterns/auth/auth-surface/PATTERN.md +18 -5
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/components/AppBrand.vue +17 -0
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/login.vue +2 -2
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/reset-password.vue +2 -2
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/pages/auth/signout.vue +2 -2
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/LoginView.vue +6 -1
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/ResetPasswordView.vue +6 -1
- package/skills/jskit/references/patterns/auth/auth-surface/example/src/views/auth/SignOutView.vue +6 -1
- package/skills/jskit/references/patterns/auth/oidc-sign-in/example/package.json +2 -2
- package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +1 -1
- package/skills/jskit/references/patterns/connectors/aws-storage-queries/example/formats/package.json +1 -1
- package/skills/jskit/references/patterns/connectors/calendar-cli/example/package.json +4 -4
- package/skills/jskit/references/patterns/console/console-surface/example/src/pages/console.vue +1 -1
- package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +2 -2
- package/skills/jskit/references/patterns/database/mysql-application/example/package.json +1 -1
- package/skills/jskit/references/patterns/database/postgres-application/example/package.json +1 -1
- package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +2 -2
- package/skills/jskit/references/patterns/rewards/google-rewarded/example/googlePublisherTag.js +5 -2
- package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +1 -1
- package/skills/jskit/references/patterns/shell/application-shell/PATTERN.md +11 -6
- package/skills/jskit/references/patterns/shell/application-shell/example/src/components/menus/SectionTabLinkItem.vue +42 -0
- package/skills/jskit/references/patterns/shell/application-shell/example/src/pages/home.vue +1 -1
- package/skills/jskit/references/patterns/shell/application-shell/example/src/views/NotFound.vue +1 -1
- package/skills/jskit/references/patterns/ui/page-and-placement/PATTERN.md +6 -0
- package/skills/jskit/references/patterns/ui/page-and-placement/example/src/pages/home/reports.vue +9 -4
- package/skills/jskit/references/patterns/ui/page-and-placement/example/src/placementTopology.js +5 -3
- package/skills/jskit/references/patterns/users/account-settings/PATTERN.md +28 -2
- package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsNotificationsSection.vue +1 -1
- package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsPreferencesSection.vue +2 -1
- package/skills/jskit/references/patterns/users/account-settings/example/src/components/account/settings/AccountSettingsProfileSection.vue +3 -2
- package/skills/jskit/references/patterns/users/account-settings/example/src/pages/account/[section].vue +23 -0
- package/skills/jskit/references/patterns/users/account-settings/example/src/pages/account.vue +23 -0
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +2 -2
- package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +3 -3
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/packages/main/src/client/components/AccountPendingInvitesCue.vue +3 -3
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/admin/root.vue +1 -1
- package/skills/jskit/references/patterns/workspaces/workspace-surfaces/example/src/surfaces/app/root.vue +1 -1
- package/skills/jskit/references/sanity-checks.md +180 -0
- package/skills/jskit/references/translation.md +4 -0
- package/skills/jskit/references/typed-features.md +158 -105
- package/skills/jskit/references/ui-operations.md +3 -1
|
@@ -92,6 +92,9 @@ Exports
|
|
|
92
92
|
### `src/server/jsonApiModule/repository.js`
|
|
93
93
|
Exports
|
|
94
94
|
- `createCrudJsonApiRepository({ api, resource, resourceScopeName })`
|
|
95
|
+
- `type WriteReturning`
|
|
96
|
+
Local functions
|
|
97
|
+
- `writeReturning(options, fallback = "full")`
|
|
95
98
|
|
|
96
99
|
### `src/server/jsonApiModule/routes.js`
|
|
97
100
|
Exports
|
|
@@ -43,10 +43,6 @@ Local functions
|
|
|
43
43
|
- `isActionExecuting(action)`
|
|
44
44
|
- `actionLabel(action = {})`
|
|
45
45
|
|
|
46
|
-
### `src/client/components/CrudListCreateAction.vue`
|
|
47
|
-
Exports
|
|
48
|
-
- None
|
|
49
|
-
|
|
50
46
|
### `src/client/components/CrudListDateFilterControl.vue`
|
|
51
47
|
Exports
|
|
52
48
|
- None
|
|
@@ -724,8 +720,6 @@ Exports
|
|
|
724
720
|
### `fixtures/crud-screens/main.js`
|
|
725
721
|
Exports
|
|
726
722
|
- None
|
|
727
|
-
Local functions
|
|
728
|
-
- `destination(order, label, suffix, icon)`
|
|
729
723
|
|
|
730
724
|
### `fixtures/crud-screens/vite.config.mjs`
|
|
731
725
|
Exports
|
|
@@ -19,16 +19,16 @@ Exports
|
|
|
19
19
|
- `addResourceIfMissing(api, scopeName, resourceConfig)`
|
|
20
20
|
- `buildJsonRestQueryParams(resourceType = "", query = {}, { include = undefined } = {})`
|
|
21
21
|
- `createJsonRestResourceScopeOptions(resource = {}, { writeSerializers = {}, normalizeId, rowPolicy, searchSchema, queryFields } = {})`
|
|
22
|
-
- `createJsonRestContext
|
|
23
|
-
- `extractJsonRestCollectionRows
|
|
24
|
-
- `
|
|
22
|
+
- `createJsonRestContext`
|
|
23
|
+
- `extractJsonRestCollectionRows`
|
|
24
|
+
- `queryAllJsonRestCollectionDocument`
|
|
25
|
+
- `queryAllJsonRestCollectionRows`
|
|
25
26
|
- `returnNullWhenJsonRestResourceMissing(run)`
|
|
26
27
|
- `returnBadRequestWhenJsonRestFieldsetInvalid(run)`
|
|
27
28
|
- `resolveWorkspaceScopeValue(context = null)`
|
|
28
29
|
- `resolveUserScopeValue(context = null)`
|
|
29
30
|
- `createJsonRestApiHost({ knex, logger })`
|
|
30
31
|
Local functions
|
|
31
|
-
- `isPlainJsonRestObject(value)`
|
|
32
32
|
- `cloneJsonRestResourceValue(value, { writeSerializers = {} } = {})`
|
|
33
33
|
- `normalizeScopeValue(value)`
|
|
34
34
|
- `normalizeJsonRestFilterValue(value)`
|
|
@@ -47,6 +47,19 @@ Local functions
|
|
|
47
47
|
Exports
|
|
48
48
|
- `JsonRestApiProvider`
|
|
49
49
|
|
|
50
|
+
### `src/server/jsonRestCollectionReads.js`
|
|
51
|
+
Exports
|
|
52
|
+
- `createJsonRestContext(context = null)`
|
|
53
|
+
- `extractJsonRestCollectionRows(payload)`
|
|
54
|
+
- `queryAllJsonRestCollectionDocument(resource, params, context)`
|
|
55
|
+
- `queryAllJsonRestCollectionRows(resource, params, context)`
|
|
56
|
+
Local functions
|
|
57
|
+
- `readEveryJsonRestCollectionPage(resource, { queryParams, ...params }, context, { caller, onPage })`
|
|
58
|
+
|
|
59
|
+
### `src/server/jsonRestValues.js`
|
|
60
|
+
Exports
|
|
61
|
+
- `isPlainJsonRestObject(value)`
|
|
62
|
+
|
|
50
63
|
### `src/server/types.js`
|
|
51
64
|
Exports
|
|
52
65
|
- `type RuntimeJsonRestApi`
|
|
@@ -536,6 +536,8 @@ Local functions
|
|
|
536
536
|
- `ignoreBootstrapStep()`
|
|
537
537
|
- `installAppPlugins(app, appPlugins = [])`
|
|
538
538
|
- `isSurfaceRootRecord(record)`
|
|
539
|
+
- `hostsChildViews(record)`
|
|
540
|
+
- `hashScrollMargin(hash)`
|
|
539
541
|
|
|
540
542
|
### `client/shellRouting.js`
|
|
541
543
|
Exports
|
|
@@ -579,6 +581,9 @@ Exports
|
|
|
579
581
|
Exports
|
|
580
582
|
- `installedClientModules`
|
|
581
583
|
- `bootInstalledClientModules(context = {})`
|
|
584
|
+
- `VUETIFY_LAYER_ORDER`
|
|
585
|
+
- `namedCascadeLayers(css)`
|
|
586
|
+
- `checkVuetifyLayerOrder(stylesheets = [])`
|
|
582
587
|
- `CLIENT_BOOTSTRAP_VIRTUAL_ID`
|
|
583
588
|
- `CLIENT_BOOTSTRAP_RESOLVED_ID`
|
|
584
589
|
- `createVirtualModuleSource(clientModules, localePackageIds)`
|
|
@@ -593,6 +598,7 @@ Exports
|
|
|
593
598
|
- `resolveInstalledViteProxyEntries(installedPackages = [], { proxyTarget = "" } = {})`
|
|
594
599
|
- `createJskitClientBootstrapPlugin({ proxyTarget = "" } = {})`
|
|
595
600
|
Local functions
|
|
601
|
+
- `builtPageStylesheets(bundle)`
|
|
596
602
|
- `isLocalScopePackageId(value)`
|
|
597
603
|
- `readJsonFile(filePath, fallback)`
|
|
598
604
|
- `hasClientExport(packageJson)`
|
|
@@ -637,7 +643,10 @@ Exports
|
|
|
637
643
|
Local functions
|
|
638
644
|
- `normalizeActionDomain(value, { context = "domain" } = {})`
|
|
639
645
|
- `normalizeStringArray(value, fieldName)`
|
|
640
|
-
- `
|
|
646
|
+
- `schemaFieldDefinitions(value)`
|
|
647
|
+
- `refuseOneOfFields(fields, fieldName, parentPath = "")`
|
|
648
|
+
- `refuseOneOfField(definition, fieldName, path)`
|
|
649
|
+
- `normalizeActionSchema(value, fieldName, { required = false, defaultMode = "", refuseOneOf = false } = {})`
|
|
641
650
|
- `normalizeActionPermission(permission, actionId)`
|
|
642
651
|
- `normalizeActionExtensions(value)`
|
|
643
652
|
- `normalizeActionEvents(value, actionId)`
|
|
@@ -33,8 +33,9 @@ Exports
|
|
|
33
33
|
### `src/client/index.js`
|
|
34
34
|
Exports
|
|
35
35
|
- `materialThemes`
|
|
36
|
-
- `createMaterialVuetifyOptions({ seed = DEFAULT_SEED, colors = {}, icons = {} } = {})`
|
|
36
|
+
- `createMaterialVuetifyOptions({ seed = DEFAULT_SEED, colors = {}, icons = {}, typography = {} } = {})`
|
|
37
37
|
Local functions
|
|
38
|
+
- `typefaceVariables({ brand = ROBOTO_FLEX, plain = ROBOTO_FLEX } = {})`
|
|
38
39
|
- `appIconAliases(icons)`
|
|
39
40
|
|
|
40
41
|
### `src/client/symbols.js`
|
|
@@ -125,15 +125,25 @@ Exports
|
|
|
125
125
|
### `src/client/components/ShellPageActionsTarget.vue`
|
|
126
126
|
Exports
|
|
127
127
|
- None
|
|
128
|
+
Local functions
|
|
129
|
+
- `itemProps(entry)`
|
|
128
130
|
|
|
129
131
|
### `src/client/components/ShellPageTitle.vue`
|
|
130
132
|
Exports
|
|
131
133
|
- None
|
|
132
134
|
|
|
135
|
+
### `src/client/components/ShellPrimaryAction.vue`
|
|
136
|
+
Exports
|
|
137
|
+
- None
|
|
138
|
+
|
|
133
139
|
### `src/client/components/ShellRouteTransition.vue`
|
|
134
140
|
Exports
|
|
135
141
|
- None
|
|
136
142
|
|
|
143
|
+
### `src/client/components/ShellSectionTabLinkItem.vue`
|
|
144
|
+
Exports
|
|
145
|
+
- None
|
|
146
|
+
|
|
137
147
|
### `src/client/components/ShellSurfaceAwareMenuLinkItem.vue`
|
|
138
148
|
Exports
|
|
139
149
|
- None
|
|
@@ -182,6 +192,14 @@ Exports
|
|
|
182
192
|
- `shellNavigationLinkProps`
|
|
183
193
|
- `useShellNavigationLink(props)`
|
|
184
194
|
|
|
195
|
+
### `src/client/composables/useShellOutletPlacements.js`
|
|
196
|
+
Exports
|
|
197
|
+
- `useShellOutletPlacements(target, context = {})`
|
|
198
|
+
|
|
199
|
+
### `src/client/composables/useShellPageClose.js`
|
|
200
|
+
Exports
|
|
201
|
+
- `useShellPageClose({ label, close })`
|
|
202
|
+
|
|
185
203
|
### `src/client/composables/useShellPageTitle.js`
|
|
186
204
|
Exports
|
|
187
205
|
- `useShellPageTitle(title)`
|
|
@@ -292,8 +310,10 @@ Exports
|
|
|
292
310
|
- `ShellMenuLinkItem`
|
|
293
311
|
- `ShellSurfaceAwareMenuLinkItem`
|
|
294
312
|
- `ShellTabLinkItem`
|
|
313
|
+
- `ShellSectionTabLinkItem`
|
|
295
314
|
- `ShellPageActions`
|
|
296
315
|
- `ShellPageAction`
|
|
316
|
+
- `ShellPrimaryAction`
|
|
297
317
|
- `ShellListDetail`
|
|
298
318
|
- `ShellUpButton`
|
|
299
319
|
- `ShellPageTitle`
|
|
@@ -301,6 +321,7 @@ Exports
|
|
|
301
321
|
- `useShellAppBar`
|
|
302
322
|
- `useShellLayoutState`
|
|
303
323
|
- `useShellPageTitle`
|
|
324
|
+
- `useShellPageClose`
|
|
304
325
|
- `useShellWindowSizeClass`
|
|
305
326
|
- `useShellNavigation`
|
|
306
327
|
- `leaveApp`
|
|
@@ -327,7 +348,7 @@ Local functions
|
|
|
327
348
|
|
|
328
349
|
### `src/client/navigation/documentNavigation.js`
|
|
329
350
|
Exports
|
|
330
|
-
- `leaveApp(url)`
|
|
351
|
+
- `leaveApp(url, { replace = false } = {})`
|
|
331
352
|
- `reloadAppPage(target)`
|
|
332
353
|
|
|
333
354
|
### `src/client/navigation/linkResolver.js`
|
|
@@ -335,7 +356,7 @@ Exports
|
|
|
335
356
|
- `resolveShellLinkPath({ context = null, surface = "", explicitTo = "", relativePath = "/", surfaceRelativePath = "", params = {}, strictParams = true } = {})`
|
|
336
357
|
- `useShellLinkResolver({ surface = "" } = {})`
|
|
337
358
|
Local functions
|
|
338
|
-
- `
|
|
359
|
+
- `fillPathParams(pathTemplate = "/", { params = {}, strictParams = true, label = "route params" } = {})`
|
|
339
360
|
- `resolveSurfaceBasePath(context = null, surface = "", { params = {}, strictParams = true } = {})`
|
|
340
361
|
|
|
341
362
|
### `src/client/navigation/shellNavigationRuntime.js`
|
|
@@ -346,9 +367,11 @@ Exports
|
|
|
346
367
|
- `createShellNavigationRuntime({ router })`
|
|
347
368
|
- `resolvePageParent(matched)`
|
|
348
369
|
- `resolvePageTitle(matched)`
|
|
370
|
+
- `type ShellPageClose`
|
|
349
371
|
Local functions
|
|
350
372
|
- `normalizeTrail(value)`
|
|
351
373
|
- `cssAttributeValue(value)`
|
|
374
|
+
- `createClaimStack()`
|
|
352
375
|
|
|
353
376
|
### `src/client/navigation/usePaths.js`
|
|
354
377
|
Exports
|
|
@@ -547,6 +570,8 @@ Exports
|
|
|
547
570
|
- `normalizeDesktopDrawerClosedMode(value = "rail")`
|
|
548
571
|
- `resolveShellDrawerPresentation({ modal = false, open = false, desktopClosedMode = "rail" } = {})`
|
|
549
572
|
- `resolveShellDrawerToggleLabel({ modal = false, open = false } = {})`
|
|
573
|
+
- `shellLayoutHasDrawer({ menuSlot = false, menuCount = 0, identityCount = 0, bottomNavigationCount = 0 } = {})`
|
|
574
|
+
- `shellLayoutHasNavigationBar({ bottomNavigationCount = 0, menuCount = 0 } = {})`
|
|
550
575
|
|
|
551
576
|
### `src/client/support/drawerWidth.js`
|
|
552
577
|
Exports
|
|
@@ -597,6 +622,18 @@ Exports
|
|
|
597
622
|
- `VUETIFY_ICONS_KEY`
|
|
598
623
|
- `filledIconAlias(icon, aliases)`
|
|
599
624
|
|
|
625
|
+
### `src/client/support/pageActions.js`
|
|
626
|
+
Exports
|
|
627
|
+
- `NO_SHELL_PAGE_ACTIONS_REGISTRY`
|
|
628
|
+
- `SHELL_PAGE_ACTIONS_REGISTRY_KEY`
|
|
629
|
+
- `createShellPageActionsRegistry({ isCompact })`
|
|
630
|
+
- `overflowEntries(entries, compact)`
|
|
631
|
+
- `type ShellPageActionState`
|
|
632
|
+
- `type ShellPageActionEntry`
|
|
633
|
+
- `type ShellPageActionsRegistry`
|
|
634
|
+
Local functions
|
|
635
|
+
- `documentOrder(left, right)`
|
|
636
|
+
|
|
600
637
|
### `src/client/support/primaryNavigation.js`
|
|
601
638
|
Exports
|
|
602
639
|
- `normalizeComparablePathname(value = "")`
|
|
@@ -649,16 +686,42 @@ Exports
|
|
|
649
686
|
|
|
650
687
|
### fixtures
|
|
651
688
|
|
|
689
|
+
### `fixtures/adaptive-shell/src/ActionsFormPage.vue`
|
|
690
|
+
Exports
|
|
691
|
+
- None
|
|
692
|
+
|
|
693
|
+
### `fixtures/adaptive-shell/src/ActionsPage.vue`
|
|
694
|
+
Exports
|
|
695
|
+
- None
|
|
696
|
+
|
|
652
697
|
### `fixtures/adaptive-shell/src/App.vue`
|
|
653
698
|
Exports
|
|
654
699
|
- None
|
|
655
700
|
|
|
701
|
+
### `fixtures/adaptive-shell/src/ButtonsPage.vue`
|
|
702
|
+
Exports
|
|
703
|
+
- None
|
|
704
|
+
|
|
705
|
+
### `fixtures/adaptive-shell/src/ButtonStatesPage.vue`
|
|
706
|
+
Exports
|
|
707
|
+
- None
|
|
708
|
+
|
|
709
|
+
### `fixtures/adaptive-shell/src/ComponentsPage.vue`
|
|
710
|
+
Exports
|
|
711
|
+
- None
|
|
712
|
+
Local functions
|
|
713
|
+
- `jumpToLastBooking()`
|
|
714
|
+
|
|
715
|
+
### `fixtures/adaptive-shell/src/FeedbackPage.vue`
|
|
716
|
+
Exports
|
|
717
|
+
- None
|
|
718
|
+
Local functions
|
|
719
|
+
- `press(name)`
|
|
720
|
+
|
|
656
721
|
### `fixtures/adaptive-shell/src/main.js`
|
|
657
722
|
Exports
|
|
658
723
|
- None
|
|
659
724
|
Local functions
|
|
660
|
-
- `createSurfacePlacement(surface, order, label, suffix)`
|
|
661
|
-
- `createSurfacePlacements(surface)`
|
|
662
725
|
- `refuseBlockedRecord(to)`
|
|
663
726
|
|
|
664
727
|
### `fixtures/adaptive-shell/src/OwnBarLayout.vue`
|
|
@@ -677,6 +740,10 @@ Exports
|
|
|
677
740
|
Exports
|
|
678
741
|
- `records`
|
|
679
742
|
|
|
743
|
+
### `fixtures/adaptive-shell/src/ReportsPage.vue`
|
|
744
|
+
Exports
|
|
745
|
+
- None
|
|
746
|
+
|
|
680
747
|
### `fixtures/adaptive-shell/src/ScreenPage.vue`
|
|
681
748
|
Exports
|
|
682
749
|
- None
|
|
@@ -685,6 +752,10 @@ Exports
|
|
|
685
752
|
Exports
|
|
686
753
|
- None
|
|
687
754
|
|
|
755
|
+
### `fixtures/adaptive-shell/src/StatusButton.vue`
|
|
756
|
+
Exports
|
|
757
|
+
- None
|
|
758
|
+
|
|
688
759
|
### `fixtures/adaptive-shell/src/StudioPage.vue`
|
|
689
760
|
Exports
|
|
690
761
|
- None
|
|
@@ -694,10 +765,26 @@ Exports
|
|
|
694
765
|
- `theme`
|
|
695
766
|
- `adminTheme`
|
|
696
767
|
|
|
768
|
+
### `fixtures/adaptive-shell/src/TitleClaim.vue`
|
|
769
|
+
Exports
|
|
770
|
+
- None
|
|
771
|
+
|
|
697
772
|
### `fixtures/adaptive-shell/vite.config.mjs`
|
|
698
773
|
Exports
|
|
699
774
|
- None
|
|
700
775
|
|
|
776
|
+
### `fixtures/production-build/src/App.vue`
|
|
777
|
+
Exports
|
|
778
|
+
- None
|
|
779
|
+
|
|
780
|
+
### `fixtures/production-build/src/main.js`
|
|
781
|
+
Exports
|
|
782
|
+
- None
|
|
783
|
+
|
|
784
|
+
### `fixtures/production-build/vite.config.mjs`
|
|
785
|
+
Exports
|
|
786
|
+
- None
|
|
787
|
+
|
|
701
788
|
### patterns
|
|
702
789
|
|
|
703
790
|
### `patterns/application-shell/example/expected-existing/src/App.vue`
|
|
@@ -724,6 +811,10 @@ Exports
|
|
|
724
811
|
Exports
|
|
725
812
|
- None
|
|
726
813
|
|
|
814
|
+
### `patterns/application-shell/example/src/components/menus/SectionTabLinkItem.vue`
|
|
815
|
+
Exports
|
|
816
|
+
- None
|
|
817
|
+
|
|
727
818
|
### `patterns/application-shell/example/src/components/menus/SurfaceAwareMenuLinkItem.vue`
|
|
728
819
|
Exports
|
|
729
820
|
- None
|
|
@@ -34,8 +34,7 @@ Exports
|
|
|
34
34
|
Exports
|
|
35
35
|
- None
|
|
36
36
|
Local functions
|
|
37
|
-
- `
|
|
38
|
-
- `readRouteSection()`
|
|
37
|
+
- `sectionTarget(value)`
|
|
39
38
|
|
|
40
39
|
### `src/client/components/ProfileClientElement.vue`
|
|
41
40
|
Exports
|
|
@@ -209,6 +208,14 @@ Exports
|
|
|
209
208
|
Exports
|
|
210
209
|
- None
|
|
211
210
|
|
|
211
|
+
### `patterns/account-settings/example/src/pages/account.vue`
|
|
212
|
+
Exports
|
|
213
|
+
- None
|
|
214
|
+
|
|
215
|
+
### `patterns/account-settings/example/src/pages/account/[section].vue`
|
|
216
|
+
Exports
|
|
217
|
+
- None
|
|
218
|
+
|
|
212
219
|
### `patterns/account-settings/example/src/pages/account/index.vue`
|
|
213
220
|
Exports
|
|
214
221
|
- None
|
|
@@ -74,12 +74,20 @@ Local functions
|
|
|
74
74
|
|
|
75
75
|
### `scripts/material3-source.mjs`
|
|
76
76
|
Exports
|
|
77
|
+
- `DEFAULT_IMPORT`
|
|
78
|
+
- `TEMPLATE_TAG`
|
|
79
|
+
- `VOID_TAGS`
|
|
77
80
|
- `HEX_COLOUR`
|
|
81
|
+
- `balancedFrom(text, start, open = "{", close = "}")`
|
|
78
82
|
- `blankCssComments(source)`
|
|
79
83
|
- `blankHtmlComments(source)`
|
|
80
84
|
- `blankJsComments(source)`
|
|
85
|
+
- `enclosingObject(text, offset)`
|
|
86
|
+
- `exclusiveBranches(left, right)`
|
|
81
87
|
- `kebab(name)`
|
|
82
88
|
- `lineIndex(text)`
|
|
89
|
+
- `localComponent(file, specifier, known)`
|
|
90
|
+
- `readConditionalBranches(template)`
|
|
83
91
|
- `readDeclarations(css, offset)`
|
|
84
92
|
- `readExceptions(source)`
|
|
85
93
|
- `readInlineDeclarations(text, offset)`
|
|
@@ -99,11 +107,13 @@ Exports
|
|
|
99
107
|
- `formatNavigationReport(result)`
|
|
100
108
|
Local functions
|
|
101
109
|
- `hexPattern()`
|
|
110
|
+
- `channelColour()`
|
|
102
111
|
- `quotedHex()`
|
|
103
112
|
- `isNavigationRule(rule)`
|
|
104
113
|
- `isSkippedDirectory(name)`
|
|
105
114
|
- `isSourceFile(relativePath)`
|
|
106
|
-
- `
|
|
115
|
+
- `isFrameworkPackage(projectRoot, directory)`
|
|
116
|
+
- `walk(projectRoot, directory, files, wholeApp = false)`
|
|
107
117
|
- `collectFiles(projectRoot, paths)`
|
|
108
118
|
- `createReporter(file, source, { navigationOnly = false } = {})`
|
|
109
119
|
- `checkCode(code, offset, { report, themed })`
|
|
@@ -131,6 +141,7 @@ Exports
|
|
|
131
141
|
- `checkScriptBackNames(code, offset, report)`
|
|
132
142
|
- `isInAppPath(value)`
|
|
133
143
|
- `isPageFile(file)`
|
|
144
|
+
- `readTitledFiles({ root, appFiles })`
|
|
134
145
|
Local functions
|
|
135
146
|
- `compact(text)`
|
|
136
147
|
- `isPlacementLink(code, offset)`
|
|
@@ -140,12 +151,11 @@ Local functions
|
|
|
140
151
|
- `navigatesFromControl(tag, script)`
|
|
141
152
|
- `attribute(tag, name)`
|
|
142
153
|
- `visibleText(inner)`
|
|
143
|
-
- `
|
|
154
|
+
- `isBackComponentName(name)`
|
|
144
155
|
- `looksLikeBack(tag)`
|
|
145
|
-
- `balancedFrom(text, start, open = "{", close = "}")`
|
|
146
|
-
- `enclosingObject(text, offset)`
|
|
147
156
|
- `stringValue(text, key)`
|
|
148
157
|
- `readMainNavigation(sources)`
|
|
158
|
+
- `computedPlacementPart(placement)`
|
|
149
159
|
- `normalisePath(value)`
|
|
150
160
|
- `routeOf(file)`
|
|
151
161
|
- `routePattern(route)`
|
|
@@ -153,10 +163,20 @@ Local functions
|
|
|
153
163
|
- `surfaceOf(route, surfaces)`
|
|
154
164
|
- `routeDeclarations(source)`
|
|
155
165
|
- `readPage(file, source)`
|
|
156
|
-
- `createShellBarReader(appFiles, read)`
|
|
157
|
-
- `
|
|
166
|
+
- `createShellBarReader(appFiles, read, tag = SHELL_UP_TAG)`
|
|
167
|
+
- `shellPlacement(file, source, drawsShellBar, known, barTag = SHELL_UP_TAG)`
|
|
168
|
+
- `rendersOutsideLayouts(code, name)`
|
|
169
|
+
- `judgePackageRoute(route, { surfaces, appShell, drawsShellBar, isDestination, isAddress, readable, report })`
|
|
158
170
|
- `pageKey(file)`
|
|
159
171
|
|
|
172
|
+
### `scripts/package-routes.mjs`
|
|
173
|
+
Exports
|
|
174
|
+
- `readPackageRoutes(root, known)`
|
|
175
|
+
Local functions
|
|
176
|
+
- `isRecord(value)`
|
|
177
|
+
- `clientEntryOf(manifest, directory)`
|
|
178
|
+
- `readRouteComponents(entry, code, known)`
|
|
179
|
+
|
|
160
180
|
### `scripts/pattern-assets.mjs`
|
|
161
181
|
Exports
|
|
162
182
|
- `PATTERN_DOCUMENT_NAME`
|
|
@@ -216,6 +236,34 @@ Local functions
|
|
|
216
236
|
- `alignLockManifestRecord(lockRecord, manifest, localPackageNames)`
|
|
217
237
|
- `preparePackageLockForInstall(projectRoot, manifests, packageLockPath)`
|
|
218
238
|
|
|
239
|
+
### `scripts/test-budget.mjs`
|
|
240
|
+
Exports
|
|
241
|
+
- `BUDGET_VARIABLE`
|
|
242
|
+
- `testConcurrency({ env = process.env, parallelism = os.availableParallelism() } = {})`
|
|
243
|
+
|
|
244
|
+
### `scripts/test-command.mjs`
|
|
245
|
+
Exports
|
|
246
|
+
- `planTestRuns(args, { cwd = process.cwd(), concurrency = testConcurrency() } = {})`
|
|
247
|
+
- `runTests(args)`
|
|
248
|
+
Local functions
|
|
249
|
+
- `findTestFiles(patterns, cwd)`
|
|
250
|
+
- `readAloneFiles(files, cwd)`
|
|
251
|
+
- `runNode(args)`
|
|
252
|
+
|
|
253
|
+
### `scripts/test-runs.mjs`
|
|
254
|
+
Exports
|
|
255
|
+
- `checkTestRuns({ projectRoot, manifests })`
|
|
256
|
+
- `formatTestRunsReport(result)`
|
|
257
|
+
Local functions
|
|
258
|
+
- `commandsOf(script)`
|
|
259
|
+
- `isProgram(token, name)`
|
|
260
|
+
- `runsNodeTest(tokens)`
|
|
261
|
+
- `runnerArguments(tokens, runner)`
|
|
262
|
+
- `configOption(args)`
|
|
263
|
+
- `lineOf(contents, needle, after = "")`
|
|
264
|
+
- `findConfig(directory, explicit, names)`
|
|
265
|
+
- `checkRunnerConfig({ root, configPath, directory, runner, report })`
|
|
266
|
+
|
|
219
267
|
### `scripts/verify-packages.mjs`
|
|
220
268
|
Exports
|
|
221
269
|
- `main()`
|
|
@@ -232,3 +280,4 @@ Local functions
|
|
|
232
280
|
- `validateMigrationsAfter(packageJson)`
|
|
233
281
|
- `validateMigrationDirectory(packageName, absoluteDirectory, relativeDirectory, migrationOwners)`
|
|
234
282
|
- `validatePackage(packageRecord, localVersions, migrationOwners)`
|
|
283
|
+
- `verifyTestRuns()`
|
|
@@ -14,13 +14,22 @@ Use this on demand; do not load the full index at startup.
|
|
|
14
14
|
|
|
15
15
|
### root
|
|
16
16
|
|
|
17
|
+
### `browserExpect.mjs`
|
|
18
|
+
Exports
|
|
19
|
+
- `expect`
|
|
20
|
+
|
|
17
21
|
### `browserFixture.mjs`
|
|
18
22
|
Exports
|
|
19
23
|
- `createChromiumLaunchOptions({ env = process.env } = {})`
|
|
20
24
|
- `reservePort()`
|
|
25
|
+
- `sharedBrowserFixture(viteOptions)`
|
|
21
26
|
- `startCapturedProcess(command, args, { cwd, env = {} } = {})`
|
|
22
|
-
- `startViteFixture({ fixtureRoot, configFile = "vite.config.mjs", env = {}, port: requestedPort } = {})`
|
|
27
|
+
- `startViteFixture({ fixtureRoot, configFile = "vite.config.mjs", env = {}, port: requestedPort, cacheDir: requestedCacheDir } = {})`
|
|
23
28
|
- `stopProcess(runtime)`
|
|
29
|
+
Local functions
|
|
30
|
+
- `stopChild(child)`
|
|
31
|
+
- `takeCacheDir(configPath)`
|
|
32
|
+
- `returnCacheDir(configPath, cacheDir)`
|
|
24
33
|
|
|
25
34
|
### `fakeFastify.mjs`
|
|
26
35
|
Exports
|
|
@@ -34,3 +43,8 @@ Exports
|
|
|
34
43
|
- `readMaterialStyles(page, probes)`
|
|
35
44
|
Local functions
|
|
36
45
|
- `comparePixels(page, actual, expected)`
|
|
46
|
+
- `waitForStillPage(page)`
|
|
47
|
+
|
|
48
|
+
### `viteFixtureServer.mjs`
|
|
49
|
+
Exports
|
|
50
|
+
- None
|
package/skills/jskit/SKILL.md
CHANGED
|
@@ -58,6 +58,8 @@ manifests, migrations, tests, and runtime behaviour are the evidence.
|
|
|
58
58
|
also read [Material 3](references/material-3.md) completely before acting.
|
|
59
59
|
- For a UI pass (the changes, a section, or the whole app), also read
|
|
60
60
|
[UI pass](references/ui-pass.md) completely.
|
|
61
|
+
- Before writing a list, save, batch or test, a refactor, or calling work
|
|
62
|
+
done, read [sanity checks](references/sanity-checks.md).
|
|
61
63
|
|
|
62
64
|
These are complete operational references required by this skill. Do not load
|
|
63
65
|
irrelevant references or other docs.
|
|
@@ -122,8 +124,16 @@ whole changeset. Use the current-state owners in application operations and
|
|
|
122
124
|
Playwright for affected UI. There is no current JSKIT Doctor command; ignore
|
|
123
125
|
old CLI authoring-history diagnoses. Never expose environment values.
|
|
124
126
|
|
|
125
|
-
Tests and requests take the time their work needs, no more: a list
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
Tests and requests take the time their work needs, no more: count a list's or
|
|
128
|
+
save's queries at a few rows and at a realistic number and
|
|
129
|
+
judge whether they grow with the rows, and read the suite's time and its
|
|
130
|
+
slowest files. Find why a check is slow; never raise its time limit. Typed
|
|
131
|
+
features' repository and Tests rules say how.
|
|
132
|
+
|
|
133
|
+
Test files run in parallel by default, bounded by the machine: a script runs
|
|
134
|
+
`jskit test`, never `node --test` or a fixed `--test-concurrency`, and
|
|
135
|
+
Playwright's `workers` and Vitest's `maxWorkers` are `testConcurrency()` from
|
|
136
|
+
`@jskit-ai/jskit-catalog/test-budget`; plain `jskit check` fails anything else.
|
|
137
|
+
Files that collide when run together get isolated (their own port, temporary
|
|
138
|
+
directory and database), never serialised. A file that truly must run alone
|
|
139
|
+
says why on its first line, `// jskit-test: alone - <reason>`.
|
|
@@ -44,7 +44,9 @@ How to use it:
|
|
|
44
44
|
- [crud-repository-mapping.md](./crud-repository-mapping.md)
|
|
45
45
|
- row policy, permission filtering, visibility before pagination, recursive CTE, descendants, package cycle, `RowPolicyPlugin`, row policy cost, slow writes through a policy, access check per history item
|
|
46
46
|
- [row-policies.md](./row-policies.md)
|
|
47
|
-
- typed features, server feature, provider, service, repository, collaborator, `typeof`, `= null`, `setProvider`, `register`, `input || {}`, `payload = {}`, `async execute`, `Object.freeze`, `requires`, `optional`, `types.js`, `RuntimeKnex`, `silentLogger`, `create<Name>Actions`, `ActionSpecifications`, request context, `api.resources.x.query`, every row, list stops at 20 rows, `queryAllJsonRestCollectionRows`, `jskit/*` lint findings, `readable-check: allow`, `optional operation:`, `process.env`, `AppError` code, `Object.assign(new Error`, `idempotency`, `…ForTests` export, file or function size, read per row, N+1 queries, slow endpoint, query budget, realistic row counts, slow tests, raised timeout, `migrate.latest()` in tests, test database snapshot
|
|
47
|
+
- typed features, server feature, provider, service, repository, collaborator, `typeof`, `= null`, `setProvider`, `register`, `input || {}`, `payload = {}`, `async execute`, `Object.freeze`, `requires`, `optional`, `types.js`, `RuntimeKnex`, `silentLogger`, `create<Name>Actions`, `ActionSpecifications`, request context, `api.resources.x.query`, every row, list stops at 20 rows, `queryAllJsonRestCollectionRows`, `jskit/*` lint findings, `readable-check: allow`, `optional operation:`, `process.env`, `AppError` code, `Object.assign(new Error`, `idempotency`, `…ForTests` export, file or function size, read per row, N+1 queries, slow endpoint, query budget, realistic row counts, slow tests, raised timeout, `migrate.latest()` in tests, test database snapshot, `--test-concurrency=1`, `node --test`, `jskit test`, `testConcurrency()`, `V64_TEST_CONCURRENCY`, Playwright `workers`, Vitest `maxWorkers`, tests one file at a time, test files colliding in parallel, `jskit-test: alone`, `test/*` findings of `jskit check`
|
|
48
48
|
- [typed-features.md](./typed-features.md)
|
|
49
49
|
- client features, composable, `use<Name>`, Vue component, client provider, props, emits, `inject`, `provide`, `ref`, `reactive`, `watch`, `addEventListener`, `setInterval`, module state, `Object.freeze` on a composable, `?.()` in a template, `jskit/typed-inject`, `jskit/collaborator-props`, `jskit/fixed-result-shape`, `jskit/released-listeners`, `jskit/no-module-state`, `jskit/no-frozen-vue-state`, `clientFeaturesConfig`, `shared resource:`
|
|
50
50
|
- [client-features.md](./client-features.md)
|
|
51
|
+
- sanity checks, is this sane, query count that grows with the rows, a list that stops at 20 or 100 rows, `createDocument()` per row of a batch, `jskit test`, one file at a time, test database preparation, `TEST_DB_NAME`, `mode: "patch"`, a route `rateLimit` nothing tests, `input.workspaceId`, a refactor or consolidation that drops behaviour, a JSKIT update, a changed theme or Vuetify default, `jskit.surface` with a parent, an assistant tool's output contract, a screen that renders everything, feedback covering an action, `NODE_ENV=production`, a production start
|
|
52
|
+
- [Sanity checks](../sanity-checks.md)
|
|
@@ -39,9 +39,9 @@ Package composition:
|
|
|
39
39
|
|
|
40
40
|
Cost:
|
|
41
41
|
|
|
42
|
-
- a policy's cost follows the rows its query reads: add a join, `EXISTS` or subquery correlated with the row through `column()` and `value()`, on indexed columns
|
|
42
|
+
- a policy's cost follows the rows its query reads: add a join, `EXISTS` or subquery correlated with the row through `column()` and `value()`, on indexed columns; look at its SQL too, since a statement that runs to kilobytes is planned again on every read that carries it
|
|
43
43
|
- never load the subject's whole history (every source, notice or grant they were ever linked to) to build an `IN` list, and never call another owner's access check per item of it; another package's grant is a predicate contribution
|
|
44
|
-
- the policy runs on every single-record read, including the read-back after `createDocument()` and `patchDocumentById()` (`returning: "full"
|
|
44
|
+
- the policy runs on every single-record read, including the read-back after `createDocument()` and `patchDocumentById()` (`returning: "full"`, their default) and the lookup before `patch` and `delete`, so a write pays it once per row it writes
|
|
45
45
|
- a write decides access once, inside its transaction; a batch write that would pay an expensive read-back per row follows the typed features guide's [Bounded access checks](../typed-features.md#bounded-access-checks)
|
|
46
46
|
|
|
47
47
|
Child-resource rules:
|
|
@@ -58,7 +58,7 @@ Testing:
|
|
|
58
58
|
- assert hidden direct records behave as not found
|
|
59
59
|
- assert children and includes do not leak records
|
|
60
60
|
- assert package and provider dependencies stay one-way
|
|
61
|
-
-
|
|
61
|
+
- count the queries of one read and one write for a subject with a short history and with a realistic long one (hundreds of linked rows), and fail when the count grows with the history
|
|
62
62
|
|
|
63
63
|
AnyAPI boundary:
|
|
64
64
|
|
|
@@ -63,10 +63,10 @@ ends with the same link.
|
|
|
63
63
|
- [One helper per package](../typed-features.md#one-helper-per-package)
|
|
64
64
|
- `options?.trx || options?.transaction`, a hand-read actor, cursor or created id
|
|
65
65
|
- [One reader per fact](../typed-features.md#one-reader-per-fact)
|
|
66
|
-
- `api.resources.x.query(…)` with no `page` for a list, `queryDocuments(query)` with no `limit` in a service, a list that stops at 20 rows
|
|
66
|
+
- `api.resources.x.query(…)` with no `page` for a list, `queryDocuments(query)` with no `limit` in a service, a list that stops at 20 rows, `page: { size: 500 }` or `limit: 500` that returns 100 rows
|
|
67
67
|
- [Every row](../typed-features.md#every-row)
|
|
68
|
-
- `await getDocumentById(…)`, `queryDocuments(…)` or a service `get` inside a loop or a `Promise.all` over a list, a single-record helper reused for a list, N+1 queries, a slow list endpoint
|
|
69
|
-
- [
|
|
68
|
+
- `await getDocumentById(…)`, `queryDocuments(…)` or a service `get` inside a loop or a `Promise.all` over a list, a single-record helper reused for a list, N+1 queries, a list whose query count grows with its rows, a slow list endpoint
|
|
69
|
+
- [Lists read related rows in batches](../typed-features.md#lists-read-related-rows-in-batches)
|
|
70
70
|
- a `rowPolicy` that loads a person's whole history or calls an access check per item, `createDocument` per row of a batch, a write that gets slower as history grows
|
|
71
71
|
- [Bounded access checks](../typed-features.md#bounded-access-checks)
|
|
72
72
|
- a route that queries storage, `boot*.js` holding routes
|
|
@@ -85,10 +85,10 @@ ends with the same link.
|
|
|
85
85
|
- [Tests are not callers](../typed-features.md#tests-are-not-callers)
|
|
86
86
|
- `…ForTests`, `__reset…`, `testOnly…` exports (`jskit/no-test-only-export`)
|
|
87
87
|
- [No test-only exports](../typed-features.md#no-test-only-exports)
|
|
88
|
-
- a list, batch or write test with one to three rows, no query count, a slow endpoint first seen with real data
|
|
89
|
-
- [
|
|
90
|
-
-
|
|
91
|
-
- [
|
|
88
|
+
- a list, batch or write test with one to three rows, no query count, a fixed query ceiling tuned to pass, a slow endpoint first seen with real data
|
|
89
|
+
- [Query counts at realistic sizes](../typed-features.md#query-counts-at-realistic-sizes)
|
|
90
|
+
- `node --test --test-concurrency=1`, `workers: 1`, `fileParallelism: false`, a suite that runs one file at a time, test files that collide when run together, `test/*` findings of `jskit check`
|
|
91
|
+
- [Test files run in parallel](../typed-features.md#test-files-run-in-parallel)
|
|
92
92
|
- `knex.migrate.latest()` in each test file, a template database rebuilt by migrating, test preparation slower than its tests
|
|
93
93
|
- [Test databases are prepared once](../typed-features.md#test-databases-are-prepared-once)
|
|
94
94
|
- a file over 750 lines, a function over 600 (`max-lines`, `max-lines-per-function`), a data module
|
|
@@ -64,16 +64,17 @@ collision before connecting. Include disposable cleanup between browser starts
|
|
|
64
64
|
in the regression: one test's teardown must not erase another test's migrations.
|
|
65
65
|
|
|
66
66
|
Do not drop/recreate the database, replay completed migrations, build every
|
|
67
|
-
module fixture, or run a production frontend build for each focused check.
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
module fixture, or run a production frontend build for each focused check. A
|
|
68
|
+
build made once for a whole run is different: it is the fix when a development
|
|
69
|
+
server makes every page load slow. Choose small fixture sets for the selected
|
|
70
|
+
suite; realistic row counts belong in the database tests that compare each
|
|
71
|
+
endpoint's query counts. Fresh-schema
|
|
70
72
|
migration tests and production-artifact tests are separate operations. Measure
|
|
71
73
|
migration, fixture, and server startup time and fix the slow phase; never retry
|
|
72
74
|
a slow launch, or raise its deadline or a spec's timeout, to absorb it. A page
|
|
73
|
-
that needs a longer timeout to load is a slow endpoint to fix
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
restores normal Preview.
|
|
75
|
+
that needs a longer timeout to load is a slow endpoint to fix. When a host
|
|
76
|
+
supplies a managed target, use its scoped suite command so one startup serves
|
|
77
|
+
the whole batch and cleanup restores normal Preview.
|
|
77
78
|
|
|
78
79
|
## Keep browser evidence focused
|
|
79
80
|
|