@jskit-ai/agent-docs 0.1.246 → 0.1.248
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-conversation.md +10 -4
- package/guide/agent/app-extras/realtime.md +8 -4
- package/guide/agent/framework/translation.md +227 -0
- package/guide/agent/index.md +1 -0
- package/package.json +1 -1
- package/patterns/feature-package/example/booking-engine/package.json +1 -1
- package/patterns/minimal-foundation/example/package.json +3 -3
- package/patterns/shell-foundation/example/package.json +4 -4
- package/patterns/shell-foundation/example/packages/main/package.json +1 -1
- package/reference/autogen/KERNEL_MAP.md +29 -2
- package/reference/autogen/PATTERN_INDEX.md +37 -37
- package/reference/autogen/packages/assistant-core.md +22 -4
- package/reference/autogen/packages/assistant-runtime.md +15 -0
- package/reference/autogen/packages/assistant-voice.md +13 -5
- package/reference/autogen/packages/auth-core.md +14 -1
- package/reference/autogen/packages/auth-provider-local-core.md +1 -1
- package/reference/autogen/packages/auth-web.md +12 -2
- package/reference/autogen/packages/connector-google-calendar.md +6 -1
- package/reference/autogen/packages/connectors-catalog.md +19 -4
- package/reference/autogen/packages/connectors-core.md +5 -1
- package/reference/autogen/packages/connectors-web.md +5 -0
- package/reference/autogen/packages/database-runtime.md +8 -1
- package/reference/autogen/packages/http-runtime.md +6 -3
- package/reference/autogen/packages/http-web.md +27 -18
- package/reference/autogen/packages/kernel.md +76 -7
- package/reference/autogen/packages/mobile-capacitor.md +6 -1
- package/reference/autogen/packages/payments-core.md +2 -2
- package/reference/autogen/packages/payments-web.md +8 -0
- package/reference/autogen/packages/realtime.md +6 -0
- package/reference/autogen/packages/rewarded-web.md +5 -0
- package/reference/autogen/packages/shell-web.md +13 -3
- package/reference/autogen/packages/uploads-image-web.md +5 -0
- package/reference/autogen/packages/uploads-runtime.md +1 -1
- package/reference/autogen/packages/users-core.md +1 -0
- package/reference/autogen/packages/users-web.md +22 -0
- package/reference/autogen/packages/workspaces-core.md +10 -3
- package/reference/autogen/packages/workspaces-web.md +4 -0
- package/reference/autogen/tooling/jskit-catalog.md +28 -0
- package/skills/jskit/SKILL.md +3 -3
- package/skills/jskit/references/pattern-index.md +37 -37
- package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +3 -3
- package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +4 -4
- package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +1 -1
- package/skills/jskit/references/patterns/auth/accounts-hub/example/package.json +2 -2
- 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/calendar-cli/example/package.json +4 -4
- 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/server/feature-package/example/booking-engine/package.json +1 -1
- package/skills/jskit/references/patterns/users/account-settings/PATTERN.md +10 -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-server/PATTERN.md +7 -0
- package/skills/jskit/references/translation.md +227 -0
|
@@ -725,8 +725,11 @@ actor may recover that conversation. The supplied runtime binding derives this
|
|
|
725
725
|
from its existing access-denial state; a 401/403 still clears private history and
|
|
726
726
|
drafts and offers no error-only Reload. Restore access or sign in through the
|
|
727
727
|
application before reopening. A subscription transport failure says **Chat
|
|
728
|
-
updates could not reconnect. Reload chat to try
|
|
729
|
-
error as `cause`; provider errors keep their own wording.
|
|
728
|
+
updates could not reconnect. Retrying automatically; Reload chat to try now.** and
|
|
729
|
+
retains its original error as `cause`; provider errors keep their own wording.
|
|
730
|
+
After a transport failure or a 5xx subscription response, the subscription retries
|
|
731
|
+
by itself after 1 s, doubling up to 30 s, while the socket stays connected; Reload,
|
|
732
|
+
a reconnect or disposal replaces that pending retry. Denials (4xx) never retry.
|
|
730
733
|
|
|
731
734
|
When `runtime.logger` is supplied, subscriptions emit structured
|
|
732
735
|
`assistant.conversation.subscription` records containing `stage`, `previousStage`,
|
|
@@ -4121,8 +4124,11 @@ model keeps calling native tools that the conversation was not granted stops wit
|
|
|
4121
4124
|
a visible failure and keeps the authored message instead of running without an answer. The common driver's internal configuration
|
|
4122
4125
|
uses that same server startup, authentication, version, observation and cleanup
|
|
4123
4126
|
implementation. `openCodeProcessEnvironment(baseEnv, { cacheRoot, dbPath,
|
|
4124
|
-
inlineConfig, outputTokenMax, password })` assembles native
|
|
4125
|
-
loopback proxy bypass and supplied inline configuration.
|
|
4127
|
+
inlineConfig, outputTokenMax, packageInstalls, password })` assembles native
|
|
4128
|
+
flags, cache, loopback proxy bypass and supplied inline configuration.
|
|
4129
|
+
`packageInstalls: false` is for short-lived servers that need no packages, such
|
|
4130
|
+
as a catalogue read: OpenCode's background plugin install then fails at once, so
|
|
4131
|
+
it cannot hold the server alive after its first SIGTERM. A managed host supplies
|
|
4126
4132
|
its isolated environment, credential roots, approved plugin configuration and
|
|
4127
4133
|
application command hooks around those native values. That boundary preserves
|
|
4128
4134
|
the host's existing permission and process policies while using the same native
|
|
@@ -90,10 +90,14 @@ normal component and placement APIs. Installing realtime does not append it to
|
|
|
90
90
|
the shell.
|
|
91
91
|
|
|
92
92
|
The standard status indicator is a button while disconnected. Clicking it starts
|
|
93
|
-
a fresh connection attempt
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
a fresh connection attempt at once, even while Socket.IO is waiting out a
|
|
94
|
+
reconnection delay; application reconnect controls use `reconnectSocketIoClient`
|
|
95
|
+
from `@jskit-ai/realtime/client/runtime` for the same behavior. The client also
|
|
96
|
+
retries server-initiated disconnects and rejected handshakes, backing off from
|
|
97
|
+
one second to at most thirty seconds. Those extra retries pause while the page
|
|
98
|
+
is hidden or offline. When it becomes visible or online again, a disconnected
|
|
99
|
+
socket reconnects immediately instead of finishing a delay scheduled before the
|
|
100
|
+
device slept. Socket.IO continues to own ordinary transport reconnection.
|
|
97
101
|
Explicit client disconnection and `reconnection: false` remain respected.
|
|
98
102
|
|
|
99
103
|
Every attempt goes through normal authentication. Reconnection does not restore
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
<!-- Generated by `npm run agent-docs:build` from `packages/agent-docs/site/guide/framework/translation.md`. Do not edit manually. -->
|
|
2
|
+
|
|
3
|
+
# Translating a JSKIT app
|
|
4
|
+
|
|
5
|
+
JSKIT ships every screen, message and error in English and can show all of them
|
|
6
|
+
in another language. An app supplies translation files only: it never copies or
|
|
7
|
+
overrides JSKIT components to translate them. An app that supplies no
|
|
8
|
+
translations looks and behaves exactly as an English-only app.
|
|
9
|
+
|
|
10
|
+
## How it fits together
|
|
11
|
+
|
|
12
|
+
- Every JSKIT package with user-visible text ships `locales/en.json`, a nested
|
|
13
|
+
catalog under its own namespace: `jskit.auth.*`, `jskit.users.*`,
|
|
14
|
+
`jskit.shell.*`, `jskit.http.*`, and so on.
|
|
15
|
+
- JSKIT components translate through the app's
|
|
16
|
+
[vue-i18n](https://vue-i18n.intlify.dev/) instance when the app supplies one,
|
|
17
|
+
and through the bundled English otherwise. `vue-i18n` is an optional peer
|
|
18
|
+
dependency; install it only when the app is translated.
|
|
19
|
+
- The server never decides the language of an error. Every error response
|
|
20
|
+
carries a stable `code`, its `params` and the English `message`; the client
|
|
21
|
+
renders the code in the user's language.
|
|
22
|
+
- Choosing and switching the language is the app's job. JSKIT components follow
|
|
23
|
+
vue-i18n's active locale.
|
|
24
|
+
|
|
25
|
+
## Pass the app's vue-i18n instance
|
|
26
|
+
|
|
27
|
+
Create the instance in composition mode and give it to the client bootstrap:
|
|
28
|
+
|
|
29
|
+
```js
|
|
30
|
+
import { createI18n } from "vue-i18n";
|
|
31
|
+
import { bootstrapClientShellApp } from "@jskit-ai/kernel/client";
|
|
32
|
+
import it from "./locales/it/jskit.json" with { type: "json" };
|
|
33
|
+
|
|
34
|
+
const i18n = createI18n({
|
|
35
|
+
legacy: false,
|
|
36
|
+
locale: "en",
|
|
37
|
+
fallbackLocale: "en",
|
|
38
|
+
messages: { it }
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
await bootstrapClientShellApp({ /* existing options */, i18n });
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The bootstrap installs the instance (unless `appPlugins` already does) and
|
|
45
|
+
merges every installed package's English into its `en` messages. The app's own
|
|
46
|
+
`en` messages win, so an app can reword a JSKIT text by defining the same key.
|
|
47
|
+
JSKIT refuses a legacy-mode instance (`createI18n({ legacy: true })`).
|
|
48
|
+
|
|
49
|
+
## Add a language
|
|
50
|
+
|
|
51
|
+
1. Write the merged English of the app's installed JSKIT packages to a file for
|
|
52
|
+
translators:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx jskit i18n export it
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
This creates `src/locales/it/jskit.json`. Running it again after upgrading
|
|
59
|
+
JSKIT adds new keys in English and keeps every existing translation.
|
|
60
|
+
2. Translate the values. Keep every `{placeholder}` exactly; plural messages
|
|
61
|
+
keep the same number of `|`-separated choices as the English.
|
|
62
|
+
3. Check the file against the installed packages:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
npx jskit i18n check it
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
It reports missing and extra keys, invalid messages, placeholder and plural
|
|
69
|
+
mismatches, and (as warnings) values still identical to the English. It exits
|
|
70
|
+
non-zero when keys are missing, a message is invalid or placeholders differ,
|
|
71
|
+
so it can run in CI.
|
|
72
|
+
4. Load the file into the vue-i18n instance under its locale code, as above.
|
|
73
|
+
|
|
74
|
+
Missing keys fall back to English, so a partly translated language still works.
|
|
75
|
+
|
|
76
|
+
### Message syntax
|
|
77
|
+
|
|
78
|
+
JSKIT catalogs use a subset of vue-i18n's syntax, and translations must too:
|
|
79
|
+
|
|
80
|
+
- named placeholders: `Use at least {min} characters.`
|
|
81
|
+
- literal text in quotes for the characters `{ } @ $ |`: `support{'@'}example.com`
|
|
82
|
+
- plural choices separated by `|`, chosen by `count`:
|
|
83
|
+
`{count} file | {count} files` (one | other) or
|
|
84
|
+
`no files | one file | {count} files` (zero | one | other)
|
|
85
|
+
|
|
86
|
+
Linked messages (`@:key`), list placeholders (`{0}`) and HTML are not used.
|
|
87
|
+
|
|
88
|
+
## Use the user's saved language
|
|
89
|
+
|
|
90
|
+
Account preferences store the user's language in `user_settings.locale` as a
|
|
91
|
+
BCP 47 code (for example `it-IT`). The "Language / locale" select offers the
|
|
92
|
+
app's configured languages:
|
|
93
|
+
|
|
94
|
+
```js
|
|
95
|
+
// config/public.js
|
|
96
|
+
config.languages = [
|
|
97
|
+
{ code: "en-US", name: "English (US)" },
|
|
98
|
+
{ code: "it-IT", name: "Italiano" }
|
|
99
|
+
];
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Each `name` may also be a message key. A saved locale that is not among the
|
|
103
|
+
configured languages stays selectable under its language name. Without
|
|
104
|
+
`config.languages` the select keeps JSKIT's built-in list, unchanged.
|
|
105
|
+
|
|
106
|
+
JSKIT never switches the app's language itself. `useAccountLocale()` from
|
|
107
|
+
`@jskit-ai/users-web/client` is a read-only ref holding the signed-in user's
|
|
108
|
+
saved locale (`""` when nobody is signed in); it updates after sign-in and after
|
|
109
|
+
the preferences are saved. Follow it in the app:
|
|
110
|
+
|
|
111
|
+
```js
|
|
112
|
+
import { watch } from "vue";
|
|
113
|
+
import { useAccountLocale } from "@jskit-ai/users-web/client";
|
|
114
|
+
|
|
115
|
+
watch(useAccountLocale(), (locale) => {
|
|
116
|
+
if (locale) i18n.global.locale.value = pickSupportedLocale(locale);
|
|
117
|
+
}, { immediate: true });
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`pickSupportedLocale` is the app's own choice, for example `it-IT` → `it` when
|
|
121
|
+
the app ships only `src/locales/it/jskit.json`.
|
|
122
|
+
|
|
123
|
+
## How errors are shown
|
|
124
|
+
|
|
125
|
+
Every error response from a JSKIT HTTP API has a `code` and `params` next to
|
|
126
|
+
the English `message`:
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{ "error": "Invalid email or password.", "code": "auth.login.invalidCredentials", "params": {} }
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
- Codes added for translation are dotted (`<namespace>.<area>.<name>`) and
|
|
133
|
+
render from the key `jskit.<code>`.
|
|
134
|
+
- Older codes such as `ACTION_PERMISSION_DENIED` or `not_found` keep their
|
|
135
|
+
values and render from `jskit.errors.<code>`.
|
|
136
|
+
- Validation errors keep `details.fieldErrors` (English) and add
|
|
137
|
+
`details.fieldErrorCodes: { field: { code, params } }`.
|
|
138
|
+
- Where one code covers several different sentences (for example
|
|
139
|
+
`connector_input_invalid`), the response also has `messageCode` and
|
|
140
|
+
`messageParams` for the exact sentence.
|
|
141
|
+
|
|
142
|
+
The client translates a code only when the English the server sent is JSKIT's
|
|
143
|
+
English for that code. An app's own sentence under a shared code (for example
|
|
144
|
+
`throw new NotFoundError("Contact not found.")`) is shown exactly as written, and
|
|
145
|
+
so is any text whose code has no catalog entry.
|
|
146
|
+
|
|
147
|
+
App code that shows errors uses the same helper JSKIT's components use:
|
|
148
|
+
|
|
149
|
+
```js
|
|
150
|
+
import { useJskitText } from "@jskit-ai/kernel/client";
|
|
151
|
+
|
|
152
|
+
const { serverMessage, fieldErrorMessages } = useJskitText();
|
|
153
|
+
const message = serverMessage(error); // translated, or the English sent
|
|
154
|
+
const fieldMessages = fieldErrorMessages(error); // { field: text }
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
To give the app's own errors codes, throw them with a code and params and add
|
|
158
|
+
the app's English and translations to its vue-i18n messages under the key the
|
|
159
|
+
code maps to:
|
|
160
|
+
|
|
161
|
+
```js
|
|
162
|
+
throw new AppError(409, "That slug is taken.", { code: "app.project.slugTaken" });
|
|
163
|
+
// en: { jskit: { app: { project: { slugTaken: "That slug is taken." } } } }
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Placement labels
|
|
167
|
+
|
|
168
|
+
A placement `label` or `title` may be a message key, `{ key, fallback, params }`
|
|
169
|
+
or plain text. JSKIT's menus, tabs, profile menu and account-settings sections
|
|
170
|
+
translate a key and show any other string as written:
|
|
171
|
+
|
|
172
|
+
```js
|
|
173
|
+
{ label: "jskit.users.accountSettings.menuLabel" }
|
|
174
|
+
{ label: { key: "app.menu.reports", fallback: "Reports" } }
|
|
175
|
+
{ label: "Reports" }
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Dates and numbers
|
|
179
|
+
|
|
180
|
+
JSKIT formats dates, times, numbers and relative times with `Intl` in the
|
|
181
|
+
active vue-i18n locale. Without an instance, each text keeps the format it had
|
|
182
|
+
before translation support (usually the browser's default).
|
|
183
|
+
App code can use the same helpers from `useJskitText()`: `formatDate`,
|
|
184
|
+
`formatTime`, `formatDateTime`, `formatNumber` and `formatRelativeTime`.
|
|
185
|
+
|
|
186
|
+
## Emails
|
|
187
|
+
|
|
188
|
+
The workspace invitation email is rendered in the recipient's saved
|
|
189
|
+
`user_settings.locale` when the recipient already has an account, and in English
|
|
190
|
+
otherwise. The server reads the same `src/locales/<code>/jskit.json` files the
|
|
191
|
+
client uses, so translating `jskit.workspaces.inviteEmail.*` there translates
|
|
192
|
+
the email too. It looks for the exact locale (`it-IT`), then the language
|
|
193
|
+
(`it`), then English. The app's invite mailer also receives the chosen `locale`.
|
|
194
|
+
|
|
195
|
+
Server code that renders JSKIT-style messages itself uses the same lookup:
|
|
196
|
+
|
|
197
|
+
```js
|
|
198
|
+
import { createServerI18n } from "@jskit-ai/kernel/server/i18n";
|
|
199
|
+
|
|
200
|
+
const i18n = createServerI18n({ appRoot, catalogs: [english] });
|
|
201
|
+
i18n.t("it-IT", "jskit.workspaces.inviteEmail.subject", { workspace: "Acme" });
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Password-reset emails are sent by the app's own recovery sender (local
|
|
205
|
+
accounts) or by the identity provider (Supabase, OIDC), so their language is
|
|
206
|
+
the app's or the provider's choice.
|
|
207
|
+
|
|
208
|
+
## What the app translates itself
|
|
209
|
+
|
|
210
|
+
JSKIT's catalogs cover JSKIT's own code. These texts belong to the app:
|
|
211
|
+
|
|
212
|
+
- Vuetify's built-in texts (close buttons, pagination, "No data available").
|
|
213
|
+
Translate them through Vuetify's locale options, or let Vuetify share the
|
|
214
|
+
vue-i18n instance with its `createVueI18nAdapter`.
|
|
215
|
+
- Files the app copied from a JSKIT starter or pattern, such as its
|
|
216
|
+
account-settings sections, placement entries and pages. Once copied they are
|
|
217
|
+
app code: give their texts the app's own keys.
|
|
218
|
+
- The startup HTML in `index.html` (for example "Loading application…"), shown
|
|
219
|
+
before any JavaScript runs.
|
|
220
|
+
|
|
221
|
+
## Checks inside JSKIT
|
|
222
|
+
|
|
223
|
+
Each JSKIT package with a catalog has a test that compiles every message with
|
|
224
|
+
vue-i18n, requires every key and dotted code its source uses to exist, rejects
|
|
225
|
+
unused keys and refuses a key another package already defines. ESLint's
|
|
226
|
+
`@intlify/vue-i18n/no-raw-text` rule rejects untranslated template text in JSKIT
|
|
227
|
+
client code.
|
package/guide/agent/index.md
CHANGED
|
@@ -28,6 +28,7 @@ apply or adapt. It does not prescribe an agent host or project orchestrator.
|
|
|
28
28
|
- [Record form actions](/guide/framework/crud-form-actions)
|
|
29
29
|
- [UI operations](/guide/framework/ui-operations)
|
|
30
30
|
- [Material 3](/guide/framework/material-3)
|
|
31
|
+
- [Translating a JSKIT app](/guide/framework/translation)
|
|
31
32
|
- [Complete source pattern library](/patterns/)
|
|
32
33
|
|
|
33
34
|
## Optional capabilities
|
package/package.json
CHANGED
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@local/main": "0.1.0",
|
|
36
36
|
"@fastify/static": "^10.1.3",
|
|
37
|
-
"@jskit-ai/kernel": "0.
|
|
37
|
+
"@jskit-ai/kernel": "0.2.0",
|
|
38
38
|
"@tanstack/vue-query": "^5.101.0",
|
|
39
39
|
"fastify": "^5.8.5",
|
|
40
40
|
"json-rest-schema": "^1.0.17",
|
|
@@ -42,13 +42,13 @@
|
|
|
42
42
|
"vue": "^3.5.44",
|
|
43
43
|
"vue-router": "^5.3.1",
|
|
44
44
|
"vuetify": "^4.1.2",
|
|
45
|
-
"@jskit-ai/http-runtime": "0.
|
|
45
|
+
"@jskit-ai/http-runtime": "0.2.0",
|
|
46
46
|
"@fastify/fast-json-stringify-compiler": "^5.1.0",
|
|
47
47
|
"@vue/devtools-api": "^8.2.1"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@jskit-ai/config-eslint": "0.1.241",
|
|
51
|
-
"@jskit-ai/jskit-catalog": "0.
|
|
51
|
+
"@jskit-ai/jskit-catalog": "0.2.0",
|
|
52
52
|
"@playwright/test": "1.61.1",
|
|
53
53
|
"@vitejs/plugin-vue": "^6.0.7",
|
|
54
54
|
"eslint": "^10.8.0",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@local/main": "0.1.0",
|
|
36
36
|
"@fastify/static": "^10.1.3",
|
|
37
|
-
"@jskit-ai/kernel": "0.
|
|
37
|
+
"@jskit-ai/kernel": "0.2.0",
|
|
38
38
|
"@tanstack/vue-query": "^5.101.0",
|
|
39
39
|
"fastify": "^5.8.5",
|
|
40
40
|
"json-rest-schema": "^1.0.17",
|
|
@@ -42,15 +42,15 @@
|
|
|
42
42
|
"vue": "^3.5.44",
|
|
43
43
|
"vue-router": "^5.3.1",
|
|
44
44
|
"vuetify": "^4.1.2",
|
|
45
|
-
"@jskit-ai/http-runtime": "0.
|
|
45
|
+
"@jskit-ai/http-runtime": "0.2.0",
|
|
46
46
|
"@mdi/js": "^7.4.47",
|
|
47
|
-
"@jskit-ai/shell-web": "0.
|
|
47
|
+
"@jskit-ai/shell-web": "0.2.0",
|
|
48
48
|
"@fastify/fast-json-stringify-compiler": "^5.1.0",
|
|
49
49
|
"@vue/devtools-api": "^8.2.1"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@jskit-ai/config-eslint": "0.1.241",
|
|
53
|
-
"@jskit-ai/jskit-catalog": "0.
|
|
53
|
+
"@jskit-ai/jskit-catalog": "0.2.0",
|
|
54
54
|
"@playwright/test": "1.61.1",
|
|
55
55
|
"@vitejs/plugin-vue": "^6.0.7",
|
|
56
56
|
"eslint": "^10.8.0",
|
|
@@ -81,6 +81,8 @@ Exports
|
|
|
81
81
|
- `normalizeQueryToken(value, { fallback = "__none__" } = {})`
|
|
82
82
|
- `normalizeObject(value, { fallback = {} } = {})`
|
|
83
83
|
- `normalizeIfInSource(source, normalized, fieldName, normalizer = (value) => value)`
|
|
84
|
+
- `normalizeIfPresent(value, normalizer = (entry) => entry)`
|
|
85
|
+
- `normalizeOrNull(value, normalizer = (entry) => entry)`
|
|
84
86
|
- `isRecord(value)`
|
|
85
87
|
- `normalizeArray(value)`
|
|
86
88
|
- `normalizeUniqueTextList(value, { acceptSingle = false } = {})`
|
|
@@ -276,7 +278,9 @@ Exports
|
|
|
276
278
|
- `resolveSchemaTransportSchemaDefinition`
|
|
277
279
|
- `executeJsonRestSchemaDefinition`
|
|
278
280
|
- `buildSchemaValidationError`
|
|
281
|
+
- `codedFieldErrors`
|
|
279
282
|
- `validateSchemaPayload`
|
|
283
|
+
- `resolveValidationIssueCode`
|
|
280
284
|
- `RECORD_ID_PATTERN`
|
|
281
285
|
- `recordIdSchema`
|
|
282
286
|
- `nullableRecordIdSchema`
|
|
@@ -299,7 +303,8 @@ Local functions
|
|
|
299
303
|
- `requireJsonRestSchemaInstance(schemaDefinition = null, { context = "schema definition.schema" } = {})`
|
|
300
304
|
- `resolveJsonRestSchemaFieldMessages(schemaDefinition = null, fieldName = "")`
|
|
301
305
|
- `resolveJsonRestSchemaParentFieldMessages(schemaDefinition = null, fieldName = "")`
|
|
302
|
-
- `
|
|
306
|
+
- `resolveFieldMessageOverride(messages, key)`
|
|
307
|
+
- `resolveJsonRestSchemaFieldError(fieldName, entry, schemaDefinition = null)`
|
|
303
308
|
|
|
304
309
|
### `validators/mergeObjectSchemas.js`
|
|
305
310
|
Exports
|
|
@@ -333,9 +338,15 @@ Local functions
|
|
|
333
338
|
|
|
334
339
|
### `validators/schemaPayloadValidation.js`
|
|
335
340
|
Exports
|
|
336
|
-
- `buildSchemaValidationError({ message =
|
|
341
|
+
- `buildSchemaValidationError({ message = SCHEMA_VALIDATION_FAILED_MESSAGE, fieldErrors = null, fieldErrorCodes = null, errors = null, cause, statusCode = null } = {})`
|
|
342
|
+
- `codedFieldErrors(error)`
|
|
343
|
+
- `errorFieldErrors(error)`
|
|
337
344
|
- `validateSchemaPayload(schemaDefinition, payload, { phase = "input", context = "schema definition", statusCode = null } = {})`
|
|
338
345
|
|
|
346
|
+
### `validators/validationIssueCodes.js`
|
|
347
|
+
Exports
|
|
348
|
+
- `resolveValidationIssueCode(issue = {})`
|
|
349
|
+
|
|
339
350
|
### root
|
|
340
351
|
|
|
341
352
|
### `index.js`
|
|
@@ -371,3 +382,19 @@ Local functions
|
|
|
371
382
|
- `buildProviderOrder(providers, inputCapabilities)`
|
|
372
383
|
- `resolveProviderDependencies(provider, capabilities)`
|
|
373
384
|
- `normalizeProviderOutputs(provider, value)`
|
|
385
|
+
|
|
386
|
+
### i18n
|
|
387
|
+
|
|
388
|
+
### `i18n/index.js`
|
|
389
|
+
Exports
|
|
390
|
+
- `catalogMessage(catalog, key = "")`
|
|
391
|
+
- `flattenCatalog(catalog, prefix = "")`
|
|
392
|
+
- `formatMessage(template = "", params = {})`
|
|
393
|
+
- `mergeCatalogs(...catalogs)`
|
|
394
|
+
- `messageKeyForCode(code = "")`
|
|
395
|
+
- `messageParams(template = "")`
|
|
396
|
+
Local functions
|
|
397
|
+
- `isRecord(value)`
|
|
398
|
+
- `placeholderEnd(template, start)`
|
|
399
|
+
- `parseMessage(template = "")`
|
|
400
|
+
- `pluralChoice(count, choices)`
|