@shipfox/client-config 0.2.0

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/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@shipfox/client-config",
3
+ "license": "MIT",
4
+ "version": "0.2.0",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/ShipfoxHQ/shipfox.git",
8
+ "directory": "libs/client/config"
9
+ },
10
+ "type": "module",
11
+ "main": "dist/index.js",
12
+ "types": "dist/index.d.ts",
13
+ "imports": {
14
+ "#*": {
15
+ "workspace-source": "./src/*",
16
+ "development": "./src/*",
17
+ "default": "./dist/*"
18
+ }
19
+ },
20
+ "exports": {
21
+ ".": {
22
+ "development": {
23
+ "types": "./src/index.ts",
24
+ "default": "./src/index.ts"
25
+ },
26
+ "default": {
27
+ "types": "./dist/index.d.ts",
28
+ "default": "./dist/index.js"
29
+ }
30
+ }
31
+ },
32
+ "dependencies": {
33
+ "@swc/helpers": "^0.5.17",
34
+ "@shipfox/react-ui": "0.3.1"
35
+ },
36
+ "peerDependencies": {
37
+ "react": "^19.0.0",
38
+ "react-dom": "^19.0.0",
39
+ "zod": "^4.4.3"
40
+ },
41
+ "devDependencies": {
42
+ "@testing-library/jest-dom": "^6.6.3",
43
+ "@testing-library/react": "^16.3.2",
44
+ "@types/react": "^19.1.11",
45
+ "@types/react-dom": "^19.1.7",
46
+ "jsdom": "^29.0.0",
47
+ "react": "^19.1.1",
48
+ "react-dom": "^19.1.1",
49
+ "zod": "^4.4.3",
50
+ "@shipfox/biome": "1.8.1",
51
+ "@shipfox/client-test-setup": "0.0.2",
52
+ "@shipfox/ts-config": "1.3.8",
53
+ "@shipfox/typescript": "1.1.6",
54
+ "@shipfox/swc": "1.2.5",
55
+ "@shipfox/vitest": "1.2.2"
56
+ },
57
+ "scripts": {
58
+ "build": "shipfox-swc",
59
+ "check": "shipfox-biome-check",
60
+ "check:fix": "shipfox-biome-check --write",
61
+ "test": "shipfox-vitest-run",
62
+ "test:watch": "shipfox-vitest-watch",
63
+ "type": "shipfox-tsc-check",
64
+ "type:emit": "shipfox-tsc-emit"
65
+ }
66
+ }
@@ -0,0 +1,31 @@
1
+ import {render, screen} from '@testing-library/react';
2
+ import {ConfigErrorScreen} from './config-error-screen.js';
3
+ import type {ConfigKeyError} from './load-config.js';
4
+
5
+ const apiUrlError: ConfigKeyError = {
6
+ key: 'apiUrl',
7
+ envVars: ['SHIPFOX_PUBLIC_API_URL', 'VITE_API_URL'],
8
+ description: 'Base URL of the Shipfox API.',
9
+ message: 'Invalid URL',
10
+ };
11
+
12
+ describe('ConfigErrorScreen', () => {
13
+ it('shows each key with its description, reason, and env var', () => {
14
+ render(<ConfigErrorScreen errors={[apiUrlError]} />);
15
+
16
+ expect(screen.getByText('apiUrl')).toBeInTheDocument();
17
+ expect(screen.getByText('Base URL of the Shipfox API.')).toBeInTheDocument();
18
+ expect(screen.getByText('Invalid URL')).toBeInTheDocument();
19
+ expect(screen.getByText('SHIPFOX_PUBLIC_API_URL')).toBeInTheDocument();
20
+ });
21
+
22
+ it('renders the docs link only when a url is given', () => {
23
+ const {rerender} = render(<ConfigErrorScreen errors={[apiUrlError]} />);
24
+
25
+ expect(screen.queryByRole('link')).toBeNull();
26
+
27
+ rerender(<ConfigErrorScreen errors={[apiUrlError]} docsUrl="https://docs.shipfox.io/config" />);
28
+
29
+ expect(screen.getByRole('link')).toHaveAttribute('href', 'https://docs.shipfox.io/config');
30
+ });
31
+ });
@@ -0,0 +1,81 @@
1
+ import {ButtonLink} from '@shipfox/react-ui/button';
2
+ import {Card, CardContent, CardDescription, CardHeader, CardTitle} from '@shipfox/react-ui/card';
3
+ import {Icon} from '@shipfox/react-ui/icon';
4
+ import {Code, Text} from '@shipfox/react-ui/typography';
5
+ import type {ConfigKeyError} from './load-config.js';
6
+
7
+ export interface ConfigErrorScreenProps {
8
+ errors: ConfigKeyError[];
9
+ /** Link to the self-hosting configuration guide. */
10
+ docsUrl?: string;
11
+ }
12
+
13
+ /**
14
+ * Full-screen configuration diagnostic shown instead of the app when required
15
+ * config is missing or invalid. It lists every problem at once with the exact
16
+ * environment variable to set, so a self-hoster fixes the deployment in one pass
17
+ * rather than discovering errors one failed request at a time.
18
+ *
19
+ * Rendered outside the app's auth/router tree but inside `ThemeProvider` (see
20
+ * main.tsx), so it uses the design system directly.
21
+ */
22
+ export function ConfigErrorScreen({errors, docsUrl}: ConfigErrorScreenProps) {
23
+ return (
24
+ <main className="flex min-h-screen items-center justify-center bg-background-subtle-base px-24 py-32">
25
+ <Card className="w-full max-w-[512px]">
26
+ <CardHeader>
27
+ <div className="flex items-center gap-8">
28
+ <Icon name="errorWarningLine" className="size-20 text-tag-error-icon" />
29
+ <CardTitle variant="h2">Configuration error</CardTitle>
30
+ </div>
31
+ <CardDescription>
32
+ The Shipfox client could not start because its configuration is missing or invalid. Set
33
+ the environment variables below and restart the container.
34
+ </CardDescription>
35
+ </CardHeader>
36
+
37
+ <CardContent className="flex flex-col">
38
+ {errors.map((error) => (
39
+ <div
40
+ key={error.key}
41
+ className="flex flex-col gap-4 border-t border-border-neutral-base py-12 first:border-t-0 first:pt-0"
42
+ >
43
+ <Code variant="label" bold className="text-foreground-neutral-base">
44
+ {error.key}
45
+ </Code>
46
+ {error.description ? (
47
+ <Text size="sm" className="text-foreground-neutral-muted">
48
+ {error.description}
49
+ </Text>
50
+ ) : null}
51
+ <Text size="sm" className="text-tag-error-text">
52
+ {error.message}
53
+ </Text>
54
+ <Text size="xs" className="text-foreground-neutral-muted">
55
+ Set{' '}
56
+ <Code as="code" variant="label" className="text-foreground-neutral-subtle">
57
+ {error.envVars[0]}
58
+ </Code>{' '}
59
+ (self-hosting) or{' '}
60
+ <Code as="code" variant="label" className="text-foreground-neutral-subtle">
61
+ {error.envVars[1]}
62
+ </Code>{' '}
63
+ (build time).
64
+ </Text>
65
+ </div>
66
+ ))}
67
+ </CardContent>
68
+
69
+ {docsUrl ? (
70
+ <Text size="sm" className="text-foreground-neutral-muted">
71
+ See the{' '}
72
+ <ButtonLink href={docsUrl} variant="interactive" underline>
73
+ self-hosting configuration guide
74
+ </ButtonLink>
75
+ .
76
+ </Text>
77
+ ) : null}
78
+ </Card>
79
+ </main>
80
+ );
81
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './config-error-screen.js';
2
+ export * from './load-config.js';
3
+ export * from './runtime-config.js';
@@ -0,0 +1,86 @@
1
+ import {z} from 'zod';
2
+ import {envNameFor, envVarsFor, loadConfig} from './load-config.js';
3
+
4
+ const shape = {
5
+ apiUrl: z.string().url().or(z.literal('')).default('').describe('Base URL of the Shipfox API.'),
6
+ datadogClientToken: z.string().describe('Datadog RUM client token.'),
7
+ };
8
+
9
+ describe('envNameFor', () => {
10
+ it.each([
11
+ ['apiUrl', 'API_URL'],
12
+ ['datadogClientToken', 'DATADOG_CLIENT_TOKEN'],
13
+ ['datadogApplicationId', 'DATADOG_APPLICATION_ID'],
14
+ ['environment', 'ENVIRONMENT'],
15
+ ])('maps %s to %s', (key, expected) => {
16
+ const result = envNameFor(key);
17
+
18
+ expect(result).toBe(expected);
19
+ });
20
+ });
21
+
22
+ describe('envVarsFor', () => {
23
+ it('lists the self-host and build-time env vars', () => {
24
+ const result = envVarsFor('apiUrl');
25
+
26
+ expect(result).toEqual(['SHIPFOX_PUBLIC_API_URL', 'VITE_API_URL']);
27
+ });
28
+ });
29
+
30
+ describe('loadConfig', () => {
31
+ it('reads runtime values by their SCREAMING_SNAKE key', () => {
32
+ const result = loadConfig(shape, {
33
+ runtime: {API_URL: 'https://api.runtime.test', DATADOG_CLIENT_TOKEN: 'dd-token'},
34
+ });
35
+
36
+ expect(result).toEqual({
37
+ ok: true,
38
+ config: {apiUrl: 'https://api.runtime.test', datadogClientToken: 'dd-token'},
39
+ });
40
+ });
41
+
42
+ it('falls back to the build value when the runtime value is absent', () => {
43
+ const result = loadConfig(shape, {
44
+ runtime: {DATADOG_CLIENT_TOKEN: 'dd-token'},
45
+ build: {VITE_API_URL: 'https://api.build.test'},
46
+ });
47
+
48
+ expect(result.ok && result.config.apiUrl).toBe('https://api.build.test');
49
+ });
50
+
51
+ it('prefers the runtime value over the build value', () => {
52
+ const result = loadConfig(shape, {
53
+ runtime: {API_URL: 'https://api.runtime.test', DATADOG_CLIENT_TOKEN: 'dd-token'},
54
+ build: {VITE_API_URL: 'https://api.build.test'},
55
+ });
56
+
57
+ expect(result.ok && result.config.apiUrl).toBe('https://api.runtime.test');
58
+ });
59
+
60
+ it('applies schema defaults when a key is set in neither source', () => {
61
+ const result = loadConfig(shape, {runtime: {DATADOG_CLIENT_TOKEN: 'dd-token'}});
62
+
63
+ expect(result.ok && result.config.apiUrl).toBe('');
64
+ });
65
+
66
+ it('aggregates every missing or invalid key with its description and env vars', () => {
67
+ const result = loadConfig(shape, {runtime: {API_URL: 'not-a-url'}});
68
+
69
+ expect(result.ok).toBe(false);
70
+ if (result.ok) throw new Error('expected a config error');
71
+ expect(result.errors).toEqual([
72
+ {
73
+ key: 'apiUrl',
74
+ envVars: ['SHIPFOX_PUBLIC_API_URL', 'VITE_API_URL'],
75
+ description: 'Base URL of the Shipfox API.',
76
+ message: expect.any(String),
77
+ },
78
+ {
79
+ key: 'datadogClientToken',
80
+ envVars: ['SHIPFOX_PUBLIC_DATADOG_CLIENT_TOKEN', 'VITE_DATADOG_CLIENT_TOKEN'],
81
+ description: 'Datadog RUM client token.',
82
+ message: expect.any(String),
83
+ },
84
+ ]);
85
+ });
86
+ });
@@ -0,0 +1,93 @@
1
+ import {z} from 'zod';
2
+
3
+ /**
4
+ * A config schema fragment: the Zod shape a feature module contributes. The app
5
+ * composes fragments from every module into one shape, then validates it once.
6
+ */
7
+ export type ConfigShape = z.ZodRawShape;
8
+
9
+ /**
10
+ * The two places a config value can come from. The same image serves any
11
+ * deployment because the app reads both and lets `runtime` win:
12
+ *
13
+ * - `runtime` is `window.__SHIPFOX_CONFIG__`, written per deployment (the
14
+ * self-host Docker entrypoint, or a Vercel edge function). Keys are the
15
+ * SCREAMING_SNAKE form of each config key, matching the env var suffix
16
+ * (`apiUrl` -> `API_URL`).
17
+ * - `build` is `import.meta.env`, baked by Vite. Keys are `VITE_`-prefixed
18
+ * (`VITE_API_URL`). Used by the Vercel SaaS build and in local dev.
19
+ */
20
+ export interface ConfigSources {
21
+ runtime?: Record<string, unknown> | undefined;
22
+ build?: Record<string, unknown> | undefined;
23
+ }
24
+
25
+ /** One missing or invalid config key, shaped for reporting to a self-hoster. */
26
+ export interface ConfigKeyError {
27
+ key: string;
28
+ /** The env vars that set this key: `SHIPFOX_PUBLIC_*` (self-host), `VITE_*` (Vercel/dev). */
29
+ envVars: string[];
30
+ description: string | undefined;
31
+ message: string;
32
+ }
33
+
34
+ export type ConfigResult<TConfig> =
35
+ | {ok: true; config: TConfig}
36
+ | {ok: false; errors: ConfigKeyError[]};
37
+
38
+ /**
39
+ * Maps a camelCase config key to the SCREAMING_SNAKE suffix shared by its env
40
+ * vars and its runtime-global key: `apiUrl` -> `API_URL`,
41
+ * `datadogClientToken` -> `DATADOG_CLIENT_TOKEN`. Deriving every name from one
42
+ * key is what keeps adding a config key to a single Zod-fragment edit.
43
+ */
44
+ export function envNameFor(key: string): string {
45
+ return key.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toUpperCase();
46
+ }
47
+
48
+ /** The `SHIPFOX_PUBLIC_*` then `VITE_*` env var names that feed a config key. */
49
+ export function envVarsFor(key: string): string[] {
50
+ const suffix = envNameFor(key);
51
+ return [`SHIPFOX_PUBLIC_${suffix}`, `VITE_${suffix}`];
52
+ }
53
+
54
+ /**
55
+ * Resolves and validates the config from both sources in a single pass.
56
+ *
57
+ * For each schema key, the runtime value wins over the build value; a value
58
+ * that is absent from both is left to the schema (its default applies, or it is
59
+ * reported as missing). Validation is aggregated, never fail-fast, so a
60
+ * misconfigured deployment learns about every problem at once.
61
+ */
62
+ export function loadConfig<TShape extends ConfigShape>(
63
+ shape: TShape,
64
+ sources: ConfigSources,
65
+ ): ConfigResult<z.infer<z.ZodObject<TShape>>> {
66
+ const input: Record<string, unknown> = {};
67
+ for (const key of Object.keys(shape)) {
68
+ const suffix = envNameFor(key);
69
+ const value = sources.runtime?.[suffix] ?? sources.build?.[`VITE_${suffix}`];
70
+ if (value !== undefined) input[key] = value;
71
+ }
72
+
73
+ const result = z.object(shape).safeParse(input);
74
+ if (result.success) return {ok: true, config: result.data};
75
+
76
+ return {ok: false, errors: toKeyErrors(result.error, shape)};
77
+ }
78
+
79
+ function toKeyErrors(error: z.ZodError, shape: ConfigShape): ConfigKeyError[] {
80
+ const byKey = new Map<string, ConfigKeyError>();
81
+ for (const issue of error.issues) {
82
+ const key = String(issue.path[0] ?? '');
83
+ if (byKey.has(key)) continue;
84
+ const field = shape[key] as {description?: string} | undefined;
85
+ byKey.set(key, {
86
+ key,
87
+ envVars: envVarsFor(key),
88
+ description: field?.description,
89
+ message: issue.message,
90
+ });
91
+ }
92
+ return [...byKey.values()];
93
+ }
@@ -0,0 +1,38 @@
1
+ declare global {
2
+ interface Window {
3
+ // The runtime config object written before the app bundle loads. The
4
+ // self-host Docker entrypoint (or a Vercel edge function) populates it from
5
+ // environment variables; keys are SCREAMING_SNAKE (see envNameFor).
6
+ __SHIPFOX_CONFIG__?: Record<string, unknown> | undefined;
7
+ }
8
+ }
9
+
10
+ /** Reads `window.__SHIPFOX_CONFIG__`, or undefined when not in a browser. */
11
+ export function getWindowRuntimeConfig(): Record<string, unknown> | undefined {
12
+ return typeof window === 'undefined' ? undefined : window.__SHIPFOX_CONFIG__;
13
+ }
14
+
15
+ let loaded: unknown;
16
+
17
+ /**
18
+ * Stores the validated config as a frozen, app-wide singleton at boot. The
19
+ * config is immutable for the lifetime of the page, so non-React code (such as
20
+ * the API client wiring) and `useConfig` can both read it without a provider.
21
+ */
22
+ export function setLoadedConfig(config: unknown): void {
23
+ loaded = Object.freeze(config);
24
+ }
25
+
26
+ export function getLoadedConfig<TConfig>(): TConfig {
27
+ if (loaded === undefined) {
28
+ throw new Error(
29
+ 'Runtime config has not been loaded. Call loadConfig + setLoadedConfig at app boot before reading it.',
30
+ );
31
+ }
32
+ return loaded as TConfig;
33
+ }
34
+
35
+ /** React accessor for the validated config. Config is immutable post-boot. */
36
+ export function useConfig<TConfig>(): TConfig {
37
+ return getLoadedConfig<TConfig>();
38
+ }
package/test/setup.ts ADDED
@@ -0,0 +1,3 @@
1
+ import {installClientDomTestEnv} from '@shipfox/client-test-setup';
2
+
3
+ installClientDomTestEnv();
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "@shipfox/ts-config/react",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "outDir": "dist",
6
+ "customConditions": ["workspace-source"]
7
+ },
8
+ "include": ["src"],
9
+ "exclude": ["**/*.test.tsx", "**/*.test.ts"]
10
+ }
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/.pnpm/@types+react@19.2.17/node_modules/@types/react/global.d.ts","../../../node_modules/.pnpm/csstype@3.2.3/node_modules/csstype/index.d.ts","../../../node_modules/.pnpm/@types+react@19.2.17/node_modules/@types/react/index.d.ts","../../../node_modules/.pnpm/@types+react@19.2.17/node_modules/@types/react/jsx-runtime.d.ts","../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts","../../../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/types.d.ts","../../../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.d.ts","../../../node_modules/.pnpm/@remixicon+react@4.9.0_react@19.2.7/node_modules/@remixicon/react/index.d.ts","../../shared/react/ui/dist/components/icon/custom/svg-icon-props.d.ts","../../shared/react/ui/dist/components/icon/custom/badge.d.ts","../../shared/react/ui/dist/components/icon/custom/check-circle-solid.d.ts","../../shared/react/ui/dist/components/icon/custom/circle-dotted-line.d.ts","../../shared/react/ui/dist/components/icon/custom/component-fill.d.ts","../../shared/react/ui/dist/components/icon/custom/component-line.d.ts","../../shared/react/ui/dist/components/icon/custom/ellipse-mini-solid.d.ts","../../shared/react/ui/dist/components/icon/custom/gitea-logo.d.ts","../../shared/react/ui/dist/components/icon/custom/info-tooltip-fill.d.ts","../../shared/react/ui/dist/components/icon/custom/linear-logo.d.ts","../../shared/react/ui/dist/components/icon/custom/resize.d.ts","../../shared/react/ui/dist/components/icon/custom/sentry-logo.d.ts","../../shared/react/ui/dist/components/icon/custom/shipfox-logo.d.ts","../../shared/react/ui/dist/components/icon/custom/slack-logo.d.ts","../../shared/react/ui/dist/components/icon/custom/spinner.d.ts","../../shared/react/ui/dist/components/icon/custom/stripe-logo.d.ts","../../shared/react/ui/dist/components/icon/custom/thunder.d.ts","../../shared/react/ui/dist/components/icon/custom/x-circle-solid.d.ts","../../shared/react/ui/dist/components/icon/custom/index.d.ts","../../shared/react/ui/dist/components/icon/icon.d.ts","../../shared/react/ui/dist/components/icon/index.d.ts","../../shared/react/ui/dist/components/button/button.d.ts","../../shared/react/ui/dist/components/button/button-link.d.ts","../../shared/react/ui/dist/components/button/icon-button.d.ts","../../shared/react/ui/dist/components/button/index.d.ts","../../shared/react/ui/dist/components/typography/code.d.ts","../../shared/react/ui/dist/components/typography/header.d.ts","../../shared/react/ui/dist/components/typography/text.d.ts","../../shared/react/ui/dist/components/typography/index.d.ts","../../shared/react/ui/dist/components/card/card.d.ts","../../shared/react/ui/dist/components/card/index.d.ts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/json-schema.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/standard-schema.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/registries.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/to-json-schema.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/util.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/versions.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/schemas.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/checks.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/errors.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/core.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/parse.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/regexes.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ar.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/az.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/be.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/bg.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ca.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/cs.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/da.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/de.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/el.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/en.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/eo.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/es.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/fa.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/fi.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/fr.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/fr-ca.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/he.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/hr.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/hu.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/hy.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/id.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/is.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/it.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ja.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ka.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/kh.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/km.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ko.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/lt.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/mk.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ms.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/nl.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/no.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ota.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ps.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/pl.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/pt.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ro.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ru.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/sl.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/sv.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ta.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/th.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/tr.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ua.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/uk.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/ur.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/uz.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/vi.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/zh-cn.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/zh-tw.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/yo.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/locales/index.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/doc.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/api.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/json-schema-processors.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/json-schema-generator.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/index.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/errors.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/parse.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/checks.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/compat.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/from-json-schema.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/iso.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/coerce.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.d.cts","../../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.d.cts","./src/load-config.ts","./src/config-error-screen.tsx","./src/runtime-config.ts","./src/index.ts"],"fileIdsList":[[63,88,92,96,98,179],[63,179,180,181],[63,178],[63],[62,65,66,88],[89,90,91],[62,96],[97],[62,68],[69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85],[62,67],[62,67,86],[87],[62,65,66],[93,94,95],[62],[60,61],[64,65],[64],[177],[168],[168,171],[103,163,166,168,169,170,171,172,173,174,175,176],[99,101,171],[168,169],[100,168,170],[101,103,105,106,107,108],[103,105,107,108],[103,105,107],[100,103,105,106,108],[99,101,102,103,104,105,106,107,108,109,110,163,164,165,166,167],[99,101,102,105],[101,102,105],[105,108],[99,100,102,103,104,106,107,108],[99,100,101,105,168],[105,106,107,108],[107],[111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc782ff85b2cb10075ecffc158af7bfb27ff97bf8491c917efea0c3d622d5ac4","impliedFormat":1},{"version":"b838d4c72740eb0afd284bf7575b74c624b105eff2e8c7b4aeead57e7ac320ff","impliedFormat":1},{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","impliedFormat":99},{"version":"2fbe402f0ee5aa8ab55367f88030f79d46211c0a0f342becaa9f648bf8534e9d","impliedFormat":1},{"version":"b94258ef37e67474ac5522e9c519489a55dcb3d4a8f645e335fc68ea2215fe88","impliedFormat":1},{"version":"e2fb4905b98dc8aaf64ecf2e1eaff4b306e9f7312a639cc92836575dd09bfe04","impliedFormat":1},"631fd719d012b301b239173bb97b9acae555313b6fa3152299cc9fd1226ad35a","2b8750dfe72137742f3be168ed52f4fc868316b791c59155d3ec84ef3a99e913","072c49181f44f1ef5a4c2b8436a7052651282573a41dfcf115412b9e44bf5f4a","689c0d681d9e79b5ab53630259384076fba525615d0288b05886c9f264c4cf55","9871074f765114494d094532f276934f90de0365046d052f694c972a97e31804","d09d826eedde6178265fee6161b430173599b463fbe6881dfe6d892077d438de","11c7055bf4ed618aea48098e49ffabbbb74179a090df76653d5a9bfe28b204b8","0ac86609b34b6b2232446956f444bc0466393766ab5a2fd095829a2c133fa82b","d61e84814ef18a47edd7a14e73f9ae14b7db3d43aa4fe78023e0037e8a8ddca8","3d72db5defa5774dcee63f5313ab08e1d274e0bb39250f98b2f20cc0f3762597","9f800f519f6a64791818673a49433ae1feb2624c53656fa6de390da92ba4c27b","52661ab17c4597782fbb704681581e77864e23f0f71cc123d06e28e3a3bfaf7b","6d0e96f1610a518201e9b1ae1de8a9a35d8b74b4a83e10f00e14538a54cf0c58","2873491cf7f7924ea1a3f459766252969cffee344b2288f09aec3f05ba424647","9e102dc6dcc1316a84c51c29db1c8edd22e9ddd348cb7e60d0f932fff064eb36","4b9bab2658af85bbb62430265e5ef8d6b6457b34515219d9428934ee8372e2bd","3224c4e0a476fb12055116b3d993d40a9e785072a1191e3983a963d2f2104d67","3c28b421ecf22fa57bd3f444971fd5c26d40697b0966065f7609415edb659e22","148b3ef1f6bb1aa3f969a2386540bf5f44abe0b924869ff61a8a679657f48372","f9022291b7ef994482583537bd1b4af59ddbc40fc6bc49f838242d1d5d215a7f","92570495891dbc9616067a25f57b641ad8b7bd44a2054d847b447bf05e749c8a","537915f47152a8898cf346ffecc732fc1bf708bca4e6f54d58754c0b03c7c110","e888815b05e7e3635feb31536466a5a5b0681a37a76c4f4fb67473b467102369","d6dd3f6c4ebbb4f7f9f74f1051b95cb7ee5847810857489e43825d16e86e391c","28979af97b9c86eed15afe2610d0fe412388611180202ad6c997feeaec206694","6dd6f2c92e702dac6e2073f3c0757ceaf2be6022afbf7cb2ed492420a4236638","4278ce3b162cfbd57e6438157aec5290224a424085d39cb6f19750e6b70c513d","32a0063559238fbf06290cf5cdd8a39d2ea8cd08920f53a2dd413f868681948c","5704911a45b621c8aae8e73bd1d6cfbfbbbac17a87515e4bc4a8f18f81c368bc","08e84b10f8f0aaecf13832e77194aed405790acf02351c0703c2394b9cbed242","80c2293059f8e2a3d4c0ae81fd1dd5f5a4a033486bfb161b1751e3fec2a41785",{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"40ba6c32eb732a09e4446ade5cb6ad0c147f186f9c9dc6878b90b4418ad9f6ea","impliedFormat":1},{"version":"fdd814741843f85c98281522c58f5a646590ba9019fad2efaa95987655e0611b","impliedFormat":1},{"version":"c78aff4fb58b28b8f642d5095fc7eeb79f00e652a67caa19693af1adabb833c9","impliedFormat":1},{"version":"f80a08ced8818dc99359c0acd5b3f12762e1ce53758007759b0d4e503cbf4a5e","impliedFormat":1},{"version":"37935fa7564bcc6e0bc845b766a24391098d26f7c8245d6e8ab37bc016816e94","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"0f8a263f4c8595c8a07de52e3f3927640c44386c1aa2984de9eae50d75e613b2","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"346fffde7c32da87c2196eb7494422449dc2ca82d3b4e6bf55be1d1a33ffc2b0","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8b5875e4958528042103fdd775e106a7f76bafc29709f0690df9a7d2241d52a7","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"aef26cf95593c8ace1c62c4724f9afac77bdfa756fb8a00613cd152117cb2f43","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"268fd6d9f2e807a39a6c5aa654b00f949feb63d3faa7dd0f9bba7dde9172159c","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},{"version":"81b4c5f62e3ecf60b810b871800b462376f8a1b4db42520980c86b951c5bd177","signature":"aa29d1be960c190a0f355941244957e46b5872e93e0226b790eb92ac899715ad"},{"version":"c5ed7595dfe34a4677f53e7cdbdcd2b361917f38f146da7ff6c6e838edb4ce4e","signature":"ca401dbc6a990d546c8fbba121a687b616c0dd3da631e7838ed957da58870f00"},{"version":"2d2faae952971142cee89d0e49c72ae80168bdc630f5fcafacb776bb99d9492a","signature":"a6f2b8465b49438da3e7b83037053295853f58dd4980846c02db5684c06aa7b2","affectsGlobalScope":true},"c9a6ccf79876161eb978726db37eb4779f888b034765f50775512f451aa81d5c"],"root":[[179,182]],"options":{"composite":true,"declaration":true,"declarationMap":true,"emitDeclarationOnly":true,"exactOptionalPropertyTypes":true,"jsx":4,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUncheckedIndexedAccess":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"strict":true,"target":9,"verbatimModuleSyntax":true},"referencedMap":[[180,1],[182,2],[179,3],[181,4],[90,5],[89,5],[91,5],[92,6],[97,7],[98,8],[69,9],[70,9],[71,9],[72,9],[73,9],[74,9],[75,9],[86,10],[76,9],[77,9],[78,9],[79,9],[80,11],[81,9],[82,9],[83,11],[68,11],[84,9],[85,9],[87,12],[88,13],[93,14],[94,14],[96,15],[95,14],[67,16],[62,17],[63,16],[66,18],[65,19],[178,20],[172,21],[176,22],[173,22],[169,21],[177,23],[174,24],[175,22],[170,25],[171,26],[165,27],[106,28],[108,29],[107,30],[168,31],[167,32],[166,33],[109,28],[101,34],[105,35],[102,36],[103,37],[111,38],[112,38],[113,38],[114,38],[115,38],[116,38],[117,38],[118,38],[119,38],[120,38],[121,38],[122,38],[123,38],[124,38],[126,38],[125,38],[127,38],[128,38],[129,38],[130,38],[131,38],[163,39],[132,38],[133,38],[134,38],[135,38],[136,38],[137,38],[138,38],[139,38],[140,38],[141,38],[142,38],[143,38],[144,38],[146,38],[145,38],[147,38],[148,38],[149,38],[150,38],[151,38],[152,38],[153,38],[154,38],[155,38],[156,38],[157,38],[158,38],[159,38],[162,38],[160,38],[161,38]],"semanticDiagnosticsPerFile":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],"latestChangedDtsFile":"./dist/index.d.ts","checkPending":true,"version":"6.0.3"}
package/tsconfig.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "references": [{ "path": "tsconfig.build.json" }, { "path": "tsconfig.test.json" }]
3
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.build.json",
3
+ "compilerOptions": {
4
+ "rootDir": "."
5
+ },
6
+ "include": ["src", "test", "vitest.config.ts", "node_modules/@shipfox/vitest/globals.d.ts"],
7
+ "exclude": []
8
+ }
@@ -0,0 +1,31 @@
1
+ import {defineConfig, type UserConfigExport} from '@shipfox/vitest';
2
+
3
+ export default defineConfig(
4
+ {
5
+ test: {
6
+ projects: [
7
+ {
8
+ extends: true,
9
+ test: {
10
+ name: 'node',
11
+ environment: 'node',
12
+ include: ['src/**/*.test.ts'],
13
+ },
14
+ },
15
+ {
16
+ extends: true,
17
+ test: {
18
+ name: 'dom',
19
+ environment: 'jsdom',
20
+ // Files are isolation-safe (test/setup.ts resets DOM + api client), so reuse the
21
+ // module graph across files in a worker instead of re-importing it per file.
22
+ isolate: false,
23
+ include: ['src/**/*.test.tsx'],
24
+ setupFiles: ['test/setup.ts'],
25
+ },
26
+ },
27
+ ],
28
+ },
29
+ },
30
+ import.meta.url,
31
+ ) as UserConfigExport;