@crossworks/app-build 0.230.43
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/LICENSE.md +135 -0
- package/package.json +32 -0
- package/scripts/build-runtime.ts +40 -0
- package/src/build-runtime.ts +174 -0
- package/src/build.test.ts +181 -0
- package/src/index.ts +278 -0
- package/src/kit.test.ts +28 -0
- package/src/kit.ts +273 -0
- package/tsconfig.json +14 -0
- package/tsconfig.tsbuildinfo +1 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# License
|
|
2
|
+
|
|
3
|
+
Mantle is **dual-licensed** by Cross Works Engineering (Pty) Ltd:
|
|
4
|
+
|
|
5
|
+
1. **Public license — Functional Source License 1.1 (MIT Future), reproduced in
|
|
6
|
+
full below.** Free to use, self-host, modify, and run for any purpose that is
|
|
7
|
+
not a Competing Use (see the _Permitted Purpose_ clause). Two years after each
|
|
8
|
+
version is first published, that version automatically converts to the MIT
|
|
9
|
+
license.
|
|
10
|
+
2. **Commercial license — see [`LICENSE-COMMERCIAL.md`](./LICENSE-COMMERCIAL.md).**
|
|
11
|
+
A paid agreement that lifts the FSL's _Competing Use_ restriction for partners
|
|
12
|
+
who want to embed Mantle in a commercial product or offer it as a service
|
|
13
|
+
during the two-year window. Contact **licensing@crossworks.engineering**.
|
|
14
|
+
|
|
15
|
+
For a plain-language explanation of how the two licenses fit together and what the
|
|
16
|
+
key terms mean, see [`LICENSING.md`](./LICENSING.md). Third-party open-source
|
|
17
|
+
components bundled with Mantle are attributed in
|
|
18
|
+
[`THIRD-PARTY-NOTICES.md`](./THIRD-PARTY-NOTICES.md).
|
|
19
|
+
|
|
20
|
+
The "Change Date" for each release is **two years after that release is first made
|
|
21
|
+
available** under this license; on the Change Date that release becomes available
|
|
22
|
+
under the MIT license (the _Grant of Future License_ below).
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Functional Source License, Version 1.1, MIT Future License
|
|
27
|
+
|
|
28
|
+
## Abbreviation
|
|
29
|
+
|
|
30
|
+
FSL-1.1-MIT
|
|
31
|
+
|
|
32
|
+
## Notice
|
|
33
|
+
|
|
34
|
+
Copyright 2026 Cross Works Engineering (Pty) Ltd
|
|
35
|
+
|
|
36
|
+
## Terms and Conditions
|
|
37
|
+
|
|
38
|
+
### Licensor ("We")
|
|
39
|
+
|
|
40
|
+
The party offering the Software under these Terms and Conditions.
|
|
41
|
+
|
|
42
|
+
### The Software
|
|
43
|
+
|
|
44
|
+
The "Software" is each version of the software that we make available under
|
|
45
|
+
these Terms and Conditions, as indicated by our inclusion of these Terms and
|
|
46
|
+
Conditions with the Software.
|
|
47
|
+
|
|
48
|
+
### License Grant
|
|
49
|
+
|
|
50
|
+
Subject to your compliance with this License Grant and the Patents,
|
|
51
|
+
Redistribution and Trademark clauses below, we hereby grant you the right to
|
|
52
|
+
use, copy, modify, create derivative works, publicly perform, publicly display
|
|
53
|
+
and redistribute the Software for any Permitted Purpose identified below.
|
|
54
|
+
|
|
55
|
+
### Permitted Purpose
|
|
56
|
+
|
|
57
|
+
A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
|
|
58
|
+
means making the Software available to others in a commercial product or
|
|
59
|
+
service that:
|
|
60
|
+
|
|
61
|
+
1. substitutes for the Software;
|
|
62
|
+
|
|
63
|
+
2. substitutes for any other product or service we offer using the Software
|
|
64
|
+
that exists as of the date we make the Software available; or
|
|
65
|
+
|
|
66
|
+
3. offers the same or substantially similar functionality as the Software.
|
|
67
|
+
|
|
68
|
+
Permitted Purposes specifically include using the Software:
|
|
69
|
+
|
|
70
|
+
1. for your internal use and access;
|
|
71
|
+
|
|
72
|
+
2. for non-commercial education;
|
|
73
|
+
|
|
74
|
+
3. for non-commercial research; and
|
|
75
|
+
|
|
76
|
+
4. in connection with professional services that you provide to a licensee
|
|
77
|
+
using the Software in accordance with these Terms and Conditions.
|
|
78
|
+
|
|
79
|
+
### Patents
|
|
80
|
+
|
|
81
|
+
To the extent your use for a Permitted Purpose would necessarily infringe our
|
|
82
|
+
patents, the license grant above includes a license under our patents. If you
|
|
83
|
+
make a claim against any party that the Software infringes or contributes to
|
|
84
|
+
the infringement of any patent, then your patent license to the Software ends
|
|
85
|
+
immediately.
|
|
86
|
+
|
|
87
|
+
### Redistribution
|
|
88
|
+
|
|
89
|
+
The Terms and Conditions apply to all copies, modifications and derivatives of
|
|
90
|
+
the Software.
|
|
91
|
+
|
|
92
|
+
If you redistribute any copies, modifications or derivatives of the Software,
|
|
93
|
+
you must include a copy of or a link to these Terms and Conditions and not
|
|
94
|
+
remove any copyright notices provided in or with the Software.
|
|
95
|
+
|
|
96
|
+
### Disclaimer
|
|
97
|
+
|
|
98
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
|
|
99
|
+
IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
|
|
100
|
+
PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
|
|
101
|
+
|
|
102
|
+
IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
|
|
103
|
+
SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
|
|
104
|
+
EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
|
|
105
|
+
|
|
106
|
+
### Trademarks
|
|
107
|
+
|
|
108
|
+
Except for displaying the License Details and identifying us as the origin of
|
|
109
|
+
the Software, you have no right under these Terms and Conditions to use our
|
|
110
|
+
trademarks, trade names, service marks or product names.
|
|
111
|
+
|
|
112
|
+
## Grant of Future License
|
|
113
|
+
|
|
114
|
+
We hereby irrevocably grant you an additional license to use the Software under
|
|
115
|
+
the MIT license that is effective on the second anniversary of the date we make
|
|
116
|
+
the Software available. On or after that date, you may use the Software under
|
|
117
|
+
the MIT license, in which case the following will apply:
|
|
118
|
+
|
|
119
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
120
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
121
|
+
the Software without restriction, including without limitation the rights to
|
|
122
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
123
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
|
124
|
+
so, subject to the following conditions:
|
|
125
|
+
|
|
126
|
+
The above copyright notice and this permission notice shall be included in all
|
|
127
|
+
copies or substantial portions of the Software.
|
|
128
|
+
|
|
129
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
130
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
131
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
132
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
133
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
134
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
135
|
+
SOFTWARE.
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@crossworks/app-build",
|
|
3
|
+
"version": "0.230.43",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./src/index.ts",
|
|
6
|
+
"types": "./src/index.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./src/index.ts"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"esbuild": "^0.28.1",
|
|
12
|
+
"lucide-react": "^1.25.0",
|
|
13
|
+
"react": "^19.2.7",
|
|
14
|
+
"react-dom": "^19.2.7",
|
|
15
|
+
"@mantle/share-ui": "npm:@crossworks/share-ui@0.230.43"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/node": "^22.20.1",
|
|
19
|
+
"@types/react": "^19.2.17",
|
|
20
|
+
"@types/react-dom": "^19.0.0",
|
|
21
|
+
"typescript": "^5.7.2"
|
|
22
|
+
},
|
|
23
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "https://github.com/crossworks-engineering/mantle"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"build:runtime": "node scripts/build-runtime.ts"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emits the shared mini-app runtime into server/web/public/app-runtime/.
|
|
3
|
+
* Run with: `node packages/app-build/scripts/build-runtime.ts` (Node strips the
|
|
4
|
+
* TS types). Wired as `pnpm -C packages/app-build build:runtime` and invoked
|
|
5
|
+
* from server/web's prebuild so the runtime always exists before apps render.
|
|
6
|
+
*/
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import { buildRuntime } from '../src/build-runtime.ts';
|
|
10
|
+
|
|
11
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const repoRoot = path.resolve(here, '../../..');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Which app is asking. Each Next app serves its own copy — the ACAO:* runtime
|
|
16
|
+
* has to exist on every origin that renders sandboxes — so the caller names
|
|
17
|
+
* itself and this resolves the path from the repo root.
|
|
18
|
+
*
|
|
19
|
+
* An ARGUMENT rather than an environment variable, deliberately. The callers
|
|
20
|
+
* used to set `APP_RUNTIME_OUT="$PWD/…"` inline, which is POSIX shell syntax;
|
|
21
|
+
* pnpm runs package scripts through cmd.exe on Windows, where that is not a
|
|
22
|
+
* variable assignment but an unknown command. The desktop build failed on
|
|
23
|
+
* windows-latest for four consecutive releases with
|
|
24
|
+
* `'APP_RUNTIME_OUT' is not recognized`. An argv entry has no shell semantics
|
|
25
|
+
* to get wrong.
|
|
26
|
+
*
|
|
27
|
+
* `APP_RUNTIME_OUT` still works for a direct absolute-path invocation; the bare
|
|
28
|
+
* default remains the server app.
|
|
29
|
+
*/
|
|
30
|
+
const appArg = process.argv[2]?.trim();
|
|
31
|
+
const outDir = appArg
|
|
32
|
+
? path.resolve(repoRoot, appArg, 'public/app-runtime')
|
|
33
|
+
: process.env.APP_RUNTIME_OUT
|
|
34
|
+
? path.resolve(process.env.APP_RUNTIME_OUT)
|
|
35
|
+
: path.resolve(repoRoot, 'server/web/public/app-runtime');
|
|
36
|
+
|
|
37
|
+
const manifest = await buildRuntime(outDir);
|
|
38
|
+
const n = Object.keys(manifest.imports).length;
|
|
39
|
+
console.log(`app-runtime: ${n} modules → ${outDir}`);
|
|
40
|
+
for (const [spec, url] of Object.entries(manifest.imports)) console.log(` ${spec} → ${url}`);
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the SHARED app runtime — the React/UI-kit/host-bridge modules that
|
|
3
|
+
* every mini app imports but that used to be re-bundled into each app's output.
|
|
4
|
+
*
|
|
5
|
+
* Instead of each app shipping its own ~40 KB React + kit, we build those once
|
|
6
|
+
* into a small set of content-hashed ESM files served from a stable, cacheable,
|
|
7
|
+
* CORS-enabled URL (`/app-runtime/*`). Apps then mark these specifiers external
|
|
8
|
+
* (see index.ts) and the sandbox iframe wires them up with an import map, so the
|
|
9
|
+
* browser fetches + parses ONE React across every app and every reload.
|
|
10
|
+
*
|
|
11
|
+
* `splitting: true` puts React (+ scheduler) in a shared chunk that every entry
|
|
12
|
+
* imports — guaranteeing a SINGLE React instance even though `react`,
|
|
13
|
+
* `react-dom/client`, the kit components, and the host bridge are separate
|
|
14
|
+
* entry points.
|
|
15
|
+
*
|
|
16
|
+
* Output: `<outDir>/<name>-<hash>.js` files + `manifest.json`, a map from the
|
|
17
|
+
* specifier as written in app source (`react`, `@/components/ui/button`, `@host`,
|
|
18
|
+
* …) to its hashed URL. The sandbox reads the manifest to build the import map.
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from 'node:fs';
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
import { createRequire } from 'node:module';
|
|
23
|
+
import { fileURLToPath } from 'node:url';
|
|
24
|
+
import esbuild from 'esbuild';
|
|
25
|
+
import { KIT } from './kit.ts';
|
|
26
|
+
|
|
27
|
+
const REAL_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
28
|
+
const ENTRY_NS = 'rt-entry';
|
|
29
|
+
const require = createRequire(import.meta.url);
|
|
30
|
+
|
|
31
|
+
/** Re-export EVERY public name a CJS package exposes as a static ESM named
|
|
32
|
+
* export. `export * from '<cjs>'` does NOT do this across the bundle boundary —
|
|
33
|
+
* the re-exports aren't statically visible to a SEPARATE build that imports the
|
|
34
|
+
* entry at runtime via the import map, so `import { createRoot }`/`{ useState }`
|
|
35
|
+
* come back undefined. We instead bind each name off the CJS default object,
|
|
36
|
+
* which esbuild's interop guarantees is the real module.exports. The name list
|
|
37
|
+
* comes from the actually-installed package, so it can't drift from the API. */
|
|
38
|
+
function reexportCjs(specifier: string, opts: { default?: boolean } = {}): string {
|
|
39
|
+
const mod = require(specifier) as Record<string, unknown>;
|
|
40
|
+
const names = Object.keys(mod).filter((k) => /^[A-Za-z_$][\w$]*$/.test(k));
|
|
41
|
+
const lines = [`import base from ${JSON.stringify(specifier)};`];
|
|
42
|
+
if (opts.default) lines.push('export default base;');
|
|
43
|
+
for (const n of names) lines.push(`export const ${n} = base[${JSON.stringify(n)}];`);
|
|
44
|
+
return lines.join('\n') + '\n';
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Each shared module, by entry name → its source. The react* entries re-export
|
|
48
|
+
* the real packages; esbuild splitting collapses the actual React into one
|
|
49
|
+
* shared chunk. The kit + host sources are the SAME strings apps used to bundle
|
|
50
|
+
* (kit.ts), so there is no second source of truth. */
|
|
51
|
+
const ENTRY_SRC: Record<string, string> = {
|
|
52
|
+
react: reexportCjs('react', { default: true }),
|
|
53
|
+
'react-dom': reexportCjs('react-dom', { default: true }),
|
|
54
|
+
'react-dom-client': reexportCjs('react-dom/client'),
|
|
55
|
+
'jsx-runtime': reexportCjs('react/jsx-runtime'),
|
|
56
|
+
utils: KIT['@/lib/utils']!,
|
|
57
|
+
button: KIT['@/components/ui/button']!,
|
|
58
|
+
card: KIT['@/components/ui/card']!,
|
|
59
|
+
input: KIT['@/components/ui/input']!,
|
|
60
|
+
label: KIT['@/components/ui/label']!,
|
|
61
|
+
badge: KIT['@/components/ui/badge']!,
|
|
62
|
+
separator: KIT['@/components/ui/separator']!,
|
|
63
|
+
host: KIT['@host']!,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/** Specifier as written in app source → entry name. This is the contract the
|
|
67
|
+
* bundler (external list) and the sandbox (import map) both derive from. */
|
|
68
|
+
export const RUNTIME_SPECIFIERS: Record<string, string> = {
|
|
69
|
+
react: 'react',
|
|
70
|
+
'react-dom': 'react-dom',
|
|
71
|
+
'react-dom/client': 'react-dom-client',
|
|
72
|
+
'react/jsx-runtime': 'jsx-runtime',
|
|
73
|
+
'@/lib/utils': 'utils',
|
|
74
|
+
'@/components/ui/button': 'button',
|
|
75
|
+
'@/components/ui/card': 'card',
|
|
76
|
+
'@/components/ui/input': 'input',
|
|
77
|
+
'@/components/ui/label': 'label',
|
|
78
|
+
'@/components/ui/badge': 'badge',
|
|
79
|
+
'@/components/ui/separator': 'separator',
|
|
80
|
+
'@host': 'host',
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/** esbuild plugin: serve the virtual entry sources + bind the kit's own
|
|
84
|
+
* `@/lib/utils` import to the same `utils` module (so `cn` isn't duplicated).
|
|
85
|
+
* Everything else (react, react-dom, scheduler) resolves from node_modules and
|
|
86
|
+
* is bundled — splitting dedupes React into a shared chunk. */
|
|
87
|
+
function runtimePlugin(): esbuild.Plugin {
|
|
88
|
+
return {
|
|
89
|
+
name: 'mantle-runtime',
|
|
90
|
+
setup(build) {
|
|
91
|
+
build.onResolve({ filter: /^entry:/ }, (args) => ({
|
|
92
|
+
path: args.path.slice('entry:'.length),
|
|
93
|
+
namespace: ENTRY_NS,
|
|
94
|
+
}));
|
|
95
|
+
build.onResolve({ filter: /^@\/lib\/utils$/ }, () => ({
|
|
96
|
+
path: 'utils',
|
|
97
|
+
namespace: ENTRY_NS,
|
|
98
|
+
}));
|
|
99
|
+
build.onLoad({ filter: /.*/, namespace: ENTRY_NS }, (args) => ({
|
|
100
|
+
contents: ENTRY_SRC[args.path] ?? '',
|
|
101
|
+
loader: 'tsx',
|
|
102
|
+
resolveDir: REAL_DIR,
|
|
103
|
+
}));
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export type RuntimeManifest = {
|
|
109
|
+
/** specifier (as imported in app code) → hashed URL under `/app-runtime/`. */
|
|
110
|
+
imports: Record<string, string>;
|
|
111
|
+
builtAt: string;
|
|
112
|
+
esbuildVersion: string;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Build the shared runtime into `outDir` and return the manifest. The caller is
|
|
117
|
+
* responsible for where `outDir` lives (apps/web/public/app-runtime) and for the
|
|
118
|
+
* public URL prefix (`/app-runtime/`).
|
|
119
|
+
*/
|
|
120
|
+
export async function buildRuntime(
|
|
121
|
+
outDir: string,
|
|
122
|
+
urlPrefix = '/app-runtime/',
|
|
123
|
+
): Promise<RuntimeManifest> {
|
|
124
|
+
fs.rmSync(outDir, { recursive: true, force: true });
|
|
125
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
126
|
+
|
|
127
|
+
const result = await esbuild.build({
|
|
128
|
+
entryPoints: Object.keys(ENTRY_SRC).map((name) => ({ in: `entry:${name}`, out: name })),
|
|
129
|
+
bundle: true,
|
|
130
|
+
splitting: true,
|
|
131
|
+
format: 'esm',
|
|
132
|
+
platform: 'browser',
|
|
133
|
+
target: 'es2020',
|
|
134
|
+
jsx: 'automatic',
|
|
135
|
+
minify: true,
|
|
136
|
+
legalComments: 'none',
|
|
137
|
+
define: { 'process.env.NODE_ENV': '"production"' },
|
|
138
|
+
outdir: outDir,
|
|
139
|
+
entryNames: '[name]-[hash]',
|
|
140
|
+
chunkNames: 'chunk-[hash]',
|
|
141
|
+
write: true,
|
|
142
|
+
logLevel: 'silent',
|
|
143
|
+
plugins: [runtimePlugin()],
|
|
144
|
+
});
|
|
145
|
+
void result;
|
|
146
|
+
|
|
147
|
+
// Map each requested entry name → its hashed output file. esbuild names entry
|
|
148
|
+
// outputs `<out>-<hash>.js`; the hash is alnum (no dashes), so the file for an
|
|
149
|
+
// entry is the one whose basename is `<name>-<hash>.js` with no further dash —
|
|
150
|
+
// which keeps `react` from matching `react-dom-client-<hash>.js`.
|
|
151
|
+
const files = fs.readdirSync(outDir).filter((f) => f.endsWith('.js'));
|
|
152
|
+
const nameToFile: Record<string, string> = {};
|
|
153
|
+
for (const name of Object.keys(ENTRY_SRC)) {
|
|
154
|
+
const prefix = `${name}-`;
|
|
155
|
+
nameToFile[name] = files.find(
|
|
156
|
+
(f) => f.startsWith(prefix) && !f.slice(prefix.length, -'.js'.length).includes('-'),
|
|
157
|
+
)!;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const imports: Record<string, string> = {};
|
|
161
|
+
for (const [specifier, name] of Object.entries(RUNTIME_SPECIFIERS)) {
|
|
162
|
+
const file = nameToFile[name];
|
|
163
|
+
if (!file) throw new Error(`runtime build produced no output for entry '${name}'`);
|
|
164
|
+
imports[specifier] = urlPrefix + file;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const manifest: RuntimeManifest = {
|
|
168
|
+
imports,
|
|
169
|
+
builtAt: new Date().toISOString(),
|
|
170
|
+
esbuildVersion: esbuild.version,
|
|
171
|
+
};
|
|
172
|
+
fs.writeFileSync(path.join(outDir, 'manifest.json'), JSON.stringify(manifest, null, 2) + '\n');
|
|
173
|
+
return manifest;
|
|
174
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { buildApp, type AppSource } from './index';
|
|
3
|
+
|
|
4
|
+
/** A minimal valid app: one entry file exporting a default component. */
|
|
5
|
+
function app(files: Record<string, string>, entry = 'App.tsx'): AppSource {
|
|
6
|
+
return { entry, files };
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const TRIVIAL = 'export default function App() {\n return <div>hi</div>;\n}\n';
|
|
10
|
+
|
|
11
|
+
describe('buildApp — happy path', () => {
|
|
12
|
+
it('bundles a trivial app into self-mounting ESM', async () => {
|
|
13
|
+
const res = await buildApp(app({ 'App.tsx': TRIVIAL }));
|
|
14
|
+
expect(res.ok).toBe(true);
|
|
15
|
+
expect(typeof res.code).toBe('string');
|
|
16
|
+
expect(res.code!.length).toBeGreaterThan(0);
|
|
17
|
+
expect(res.errors).toEqual([]);
|
|
18
|
+
expect(res.esbuildVersion).toMatch(/^\d+\.\d+/);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('externalizes React + @host (resolved via the shared runtime import map)', async () => {
|
|
22
|
+
const res = await buildApp(app({ 'App.tsx': TRIVIAL }));
|
|
23
|
+
expect(res.ok).toBe(true);
|
|
24
|
+
// React (here the automatic-JSX runtime) and the host bridge are NOT
|
|
25
|
+
// bundled — they remain bare imports the iframe's import map resolves to the
|
|
26
|
+
// one shared runtime. The app ships only its own code, so it stays tiny.
|
|
27
|
+
expect(res.code).toMatch(/["']react\/jsx-runtime["']/);
|
|
28
|
+
expect(res.code).toMatch(/["']@host["']/);
|
|
29
|
+
expect(res.code!.length).toBeLessThan(5000);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('allows the curated runtime: react, lucide-react, the kit, and @host', async () => {
|
|
33
|
+
const src = app({
|
|
34
|
+
'App.tsx':
|
|
35
|
+
"import { useState } from 'react';\n" +
|
|
36
|
+
"import { Home } from 'lucide-react';\n" +
|
|
37
|
+
"import { Button } from '@/components/ui/button';\n" +
|
|
38
|
+
"import { cn } from '@/lib/utils';\n" +
|
|
39
|
+
"import { host } from '@host';\n" +
|
|
40
|
+
'export default function App() {\n' +
|
|
41
|
+
' const [n] = useState(0);\n' +
|
|
42
|
+
' void host; void cn; void Home;\n' +
|
|
43
|
+
' return <Button>{n}</Button>;\n' +
|
|
44
|
+
'}\n',
|
|
45
|
+
});
|
|
46
|
+
const res = await buildApp(src);
|
|
47
|
+
expect(res.ok).toBe(true);
|
|
48
|
+
expect(res.errors).toEqual([]);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('resolves relative imports, including index files', async () => {
|
|
52
|
+
const src = app({
|
|
53
|
+
'App.tsx':
|
|
54
|
+
"import { greet } from './lib/util';\nexport default function App() { return <div>{greet()}</div>; }\n",
|
|
55
|
+
'lib/util.ts': "export { greet } from './greet';\n",
|
|
56
|
+
'lib/greet/index.ts': "export function greet() { return 'hi'; }\n",
|
|
57
|
+
});
|
|
58
|
+
const res = await buildApp(src);
|
|
59
|
+
expect(res.ok).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('buildApp — the import allowlist (security boundary)', () => {
|
|
64
|
+
it('rejects an arbitrary npm package with a clear message', async () => {
|
|
65
|
+
const src = app({
|
|
66
|
+
'App.tsx':
|
|
67
|
+
"import _ from 'lodash';\nexport default function App() { return <div>{String(_)}</div>; }\n",
|
|
68
|
+
});
|
|
69
|
+
const res = await buildApp(src);
|
|
70
|
+
expect(res.ok).toBe(false);
|
|
71
|
+
expect(res.errors.some((e) => /not allowed in a mini app|lodash/i.test(e.text))).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('rejects node builtins (no server reach from a mini app)', async () => {
|
|
75
|
+
const src = app({
|
|
76
|
+
'App.tsx':
|
|
77
|
+
"import fs from 'node:fs';\nexport default function App() { return <div>{String(fs)}</div>; }\n",
|
|
78
|
+
});
|
|
79
|
+
const res = await buildApp(src);
|
|
80
|
+
expect(res.ok).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('rejects an unknown @/ alias import', async () => {
|
|
84
|
+
const src = app({
|
|
85
|
+
'App.tsx':
|
|
86
|
+
"import x from '@/components/ui/table';\nexport default function App() { return <div>{String(x)}</div>; }\n",
|
|
87
|
+
});
|
|
88
|
+
const res = await buildApp(src);
|
|
89
|
+
expect(res.ok).toBe(false);
|
|
90
|
+
expect(res.errors.some((e) => /Unknown import/i.test(e.text))).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe('buildApp — error reporting', () => {
|
|
95
|
+
it('fails when the entry file is missing from the tree', async () => {
|
|
96
|
+
const res = await buildApp(app({ 'Other.tsx': TRIVIAL }, 'App.tsx'));
|
|
97
|
+
expect(res.ok).toBe(false);
|
|
98
|
+
expect(res.errors[0]?.text).toMatch(/not found/i);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('reports a file/line location for an unresolvable relative import', async () => {
|
|
102
|
+
const src = app({
|
|
103
|
+
'App.tsx':
|
|
104
|
+
"import { x } from './missing';\nexport default function App() { return <div>{x}</div>; }\n",
|
|
105
|
+
});
|
|
106
|
+
const res = await buildApp(src);
|
|
107
|
+
expect(res.ok).toBe(false);
|
|
108
|
+
expect(res.errors.some((e) => /Cannot resolve/i.test(e.text))).toBe(true);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('reports a location for a syntax error', async () => {
|
|
112
|
+
const src = app({
|
|
113
|
+
'App.tsx': 'export default function App() { return <div>oops</div> // missing brace\n',
|
|
114
|
+
});
|
|
115
|
+
const res = await buildApp(src);
|
|
116
|
+
expect(res.ok).toBe(false);
|
|
117
|
+
expect(res.errors.length).toBeGreaterThan(0);
|
|
118
|
+
expect(res.errors.some((e) => e.location !== null)).toBe(true);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
describe('lintToolRefs — undeclared host.tools.call', () => {
|
|
123
|
+
it('warns (does not error) for a host.tools.call slug that is not declared', async () => {
|
|
124
|
+
const src = app({
|
|
125
|
+
'App.tsx':
|
|
126
|
+
"import { host } from '@host';\n" +
|
|
127
|
+
'export default function App() {\n' +
|
|
128
|
+
" const go = () => host.tools.call('openweather_geocode', { q: 'x' });\n" +
|
|
129
|
+
' return <button onClick={go}>go</button>;\n' +
|
|
130
|
+
'}\n',
|
|
131
|
+
});
|
|
132
|
+
const res = await buildApp(src, { declaredToolSlugs: [] });
|
|
133
|
+
expect(res.ok).toBe(true); // warning-only: the build still succeeds
|
|
134
|
+
expect(res.warnings.some((w) => /openweather_geocode/.test(w.text))).toBe(true);
|
|
135
|
+
const w = res.warnings.find((w) => /openweather_geocode/.test(w.text));
|
|
136
|
+
expect(w?.location?.file).toBe('App.tsx');
|
|
137
|
+
expect(w?.location?.line).toBe(3);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('does not warn when the slug is declared', async () => {
|
|
141
|
+
const src = app({
|
|
142
|
+
'App.tsx':
|
|
143
|
+
"import { host } from '@host';\n" +
|
|
144
|
+
'export default function App() {\n' +
|
|
145
|
+
" void (() => host.tools.call('weather_now', {}));\n" +
|
|
146
|
+
' return <div>ok</div>;\n' +
|
|
147
|
+
'}\n',
|
|
148
|
+
});
|
|
149
|
+
const res = await buildApp(src, { declaredToolSlugs: ['weather_now'] });
|
|
150
|
+
expect(res.ok).toBe(true);
|
|
151
|
+
expect(res.warnings.some((w) => /weather_now/.test(w.text))).toBe(false);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('skips the lint entirely when declaredToolSlugs is omitted (back-compat)', async () => {
|
|
155
|
+
const src = app({
|
|
156
|
+
'App.tsx':
|
|
157
|
+
"import { host } from '@host';\n" +
|
|
158
|
+
'export default function App() {\n' +
|
|
159
|
+
" void (() => host.tools.call('anything', {}));\n" +
|
|
160
|
+
' return <div>ok</div>;\n' +
|
|
161
|
+
'}\n',
|
|
162
|
+
});
|
|
163
|
+
const res = await buildApp(src);
|
|
164
|
+
expect(res.warnings.some((w) => /isn't in the app's declared tools/.test(w.text))).toBe(false);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('ignores dynamic (non-literal) slugs — no false positives', async () => {
|
|
168
|
+
const src = app({
|
|
169
|
+
'App.tsx':
|
|
170
|
+
"import { host } from '@host';\n" +
|
|
171
|
+
'export default function App() {\n' +
|
|
172
|
+
" const slug = 'x';\n" +
|
|
173
|
+
' void (() => host.tools.call(slug, {}));\n' +
|
|
174
|
+
' return <div>ok</div>;\n' +
|
|
175
|
+
'}\n',
|
|
176
|
+
});
|
|
177
|
+
const res = await buildApp(src, { declaredToolSlugs: [] });
|
|
178
|
+
expect(res.ok).toBe(true);
|
|
179
|
+
expect(res.warnings.length).toBe(0);
|
|
180
|
+
});
|
|
181
|
+
});
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The mini-app bundler. Takes an app's virtual source tree and produces a single
|
|
3
|
+
* self-mounting ESM bundle for the sandbox iframe. React, the curated UI kit and
|
|
4
|
+
* the host bridge are NOT bundled in — they're marked external and resolved at
|
|
5
|
+
* runtime by an import map (see build-runtime.ts + app-sandbox.tsx), so one
|
|
6
|
+
* shared React/kit is fetched + parsed ONCE across every app and reload instead
|
|
7
|
+
* of re-bundled (~40 KB+) into each app. The app's output is just its own code
|
|
8
|
+
* (+ any allowed npm like lucide-react, which tree-shakes small per app).
|
|
9
|
+
*
|
|
10
|
+
* Build inputs are agent-authored TSX; build errors are returned (not thrown)
|
|
11
|
+
* with file/line locations so Appsmith can read them and self-correct.
|
|
12
|
+
*/
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import esbuild, { type BuildOptions, type Message, type Plugin } from 'esbuild';
|
|
16
|
+
import { KIT } from './kit';
|
|
17
|
+
|
|
18
|
+
/** Specifiers provided by the shared runtime via the iframe import map — marked
|
|
19
|
+
* external so they stay as bare imports in the app bundle. The react family is
|
|
20
|
+
* externalized GLOBALLY (below) so even a bundled dep's React (e.g. lucide's)
|
|
21
|
+
* resolves to the one shared instance; the `@`-prefixed kit/host specifiers are
|
|
22
|
+
* externalized per-import by the plugin (with an allowlist check). Keep this in
|
|
23
|
+
* sync with build-runtime.ts RUNTIME_SPECIFIERS. */
|
|
24
|
+
const REACT_EXTERNALS = ['react', 'react/jsx-runtime', 'react-dom', 'react-dom/client'];
|
|
25
|
+
|
|
26
|
+
// A REAL directory inside this package, used as the esbuild resolveDir for the
|
|
27
|
+
// virtual entry + kit + app modules so bare imports (react, react-dom/client,
|
|
28
|
+
// react/jsx-runtime, lucide-react) resolve from this package's node_modules.
|
|
29
|
+
// The app/kit *sources* are still served from memory by the plugin; only bare
|
|
30
|
+
// package imports fall through to on-disk node_modules resolution.
|
|
31
|
+
const REAL_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
32
|
+
|
|
33
|
+
export type AppSource = { entry: string; files: Record<string, string> };
|
|
34
|
+
|
|
35
|
+
export type BuildMessage = {
|
|
36
|
+
text: string;
|
|
37
|
+
location: { file: string; line: number; column: number } | null;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export type BuildResult = {
|
|
41
|
+
ok: boolean;
|
|
42
|
+
/** Bundled ESM (present iff ok). */
|
|
43
|
+
code?: string;
|
|
44
|
+
errors: BuildMessage[];
|
|
45
|
+
warnings: BuildMessage[];
|
|
46
|
+
esbuildVersion: string;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const ESBUILD_VERSION = esbuild.version;
|
|
50
|
+
|
|
51
|
+
const APP_NS = 'app';
|
|
52
|
+
const STDIN = '<stdin>';
|
|
53
|
+
|
|
54
|
+
/** Bare npm packages a mini app may import. Everything else is rejected. */
|
|
55
|
+
const BARE_ALLOW = /^(react($|\/)|react-dom($|\/)|lucide-react($|\/))/;
|
|
56
|
+
|
|
57
|
+
function loaderFor(p: string): 'tsx' | 'ts' | 'js' | 'jsx' | 'json' | 'css' {
|
|
58
|
+
if (p.endsWith('.ts')) return 'ts';
|
|
59
|
+
if (p.endsWith('.js')) return 'js';
|
|
60
|
+
if (p.endsWith('.jsx')) return 'jsx';
|
|
61
|
+
if (p.endsWith('.json')) return 'json';
|
|
62
|
+
if (p.endsWith('.css')) return 'css';
|
|
63
|
+
return 'tsx';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Normalize a key as it appears in `files` (posix, no leading ./). */
|
|
67
|
+
function normKey(k: string): string {
|
|
68
|
+
return path.posix.normalize(k.replace(/^\.\//, '')).replace(/^\/+/, '');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Resolve a relative import against the source tree, trying common extensions
|
|
72
|
+
* and index files — mirrors how a bundler resolves `./x`. */
|
|
73
|
+
function resolveInTree(
|
|
74
|
+
files: Record<string, string>,
|
|
75
|
+
fromKey: string,
|
|
76
|
+
importPath: string,
|
|
77
|
+
): string | null {
|
|
78
|
+
const fromDir = fromKey === '<stdin>' ? '' : path.posix.dirname(fromKey);
|
|
79
|
+
const base = normKey(path.posix.join(fromDir, importPath));
|
|
80
|
+
const candidates = [
|
|
81
|
+
base,
|
|
82
|
+
`${base}.tsx`,
|
|
83
|
+
`${base}.ts`,
|
|
84
|
+
`${base}.jsx`,
|
|
85
|
+
`${base}.js`,
|
|
86
|
+
`${base}.json`,
|
|
87
|
+
`${base}/index.tsx`,
|
|
88
|
+
`${base}/index.ts`,
|
|
89
|
+
];
|
|
90
|
+
for (const c of candidates) if (c in files) return c;
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function virtualPlugin(source: AppSource): Plugin {
|
|
95
|
+
const files = source.files;
|
|
96
|
+
return {
|
|
97
|
+
name: 'mantle-app-virtual',
|
|
98
|
+
setup(build) {
|
|
99
|
+
// Kit + alias imports (@host, @/components/ui/*, @/lib/utils): marked
|
|
100
|
+
// external (allowlisted) so they resolve from the shared runtime import
|
|
101
|
+
// map at load time instead of being bundled into every app.
|
|
102
|
+
build.onResolve({ filter: /^@/ }, (args) => {
|
|
103
|
+
if (args.path in KIT) return { path: args.path, external: true };
|
|
104
|
+
return {
|
|
105
|
+
errors: [
|
|
106
|
+
{
|
|
107
|
+
text: `Unknown import '${args.path}'. Allowed: react, ${Object.keys(KIT).join(', ')}, lucide-react, and relative files.`,
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Relative imports — resolve against the virtual source tree. The stdin
|
|
114
|
+
// entry's `import App from './<entry>'` also lands here (its importer is
|
|
115
|
+
// the resolved stdin path, e.g. '/.../app-build/src/<stdin>').
|
|
116
|
+
build.onResolve({ filter: /^\.\.?\// }, (args) => {
|
|
117
|
+
const isStdin = args.importer === STDIN || args.importer.endsWith(`/${STDIN}`);
|
|
118
|
+
if (args.namespace !== APP_NS && !isStdin) return null;
|
|
119
|
+
const fromKey = args.namespace === APP_NS ? args.importer : STDIN;
|
|
120
|
+
const key = resolveInTree(files, fromKey, args.path);
|
|
121
|
+
if (!key) {
|
|
122
|
+
return { errors: [{ text: `Cannot resolve '${args.path}' from '${fromKey}'` }] };
|
|
123
|
+
}
|
|
124
|
+
return { path: key, namespace: APP_NS };
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// Bare package imports (not relative, not @-prefixed). Only the curated
|
|
128
|
+
// runtime packages are allowed; everything else (node:*, arbitrary npm)
|
|
129
|
+
// is rejected with a clear message so Appsmith self-corrects. The iframe
|
|
130
|
+
// sandbox + CSP is the real boundary, but failing the build is cleaner
|
|
131
|
+
// feedback than a silently dead import.
|
|
132
|
+
build.onResolve({ filter: /^[^.@]/ }, (args) => {
|
|
133
|
+
// Only gate imports written in USER/KIT source — let transitive
|
|
134
|
+
// node_modules imports (react-dom → scheduler, etc.) resolve freely.
|
|
135
|
+
const fromUserCode =
|
|
136
|
+
args.namespace === APP_NS ||
|
|
137
|
+
args.importer === STDIN ||
|
|
138
|
+
args.importer.endsWith(`/${STDIN}`);
|
|
139
|
+
if (!fromUserCode) return null;
|
|
140
|
+
if (BARE_ALLOW.test(args.path)) return null; // fall through to node_modules
|
|
141
|
+
return {
|
|
142
|
+
errors: [
|
|
143
|
+
{
|
|
144
|
+
text: `Import '${args.path}' is not allowed in a mini app. Allowed packages: react, react-dom, lucide-react. Use @/components/ui/*, @host, or relative files for everything else.`,
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
build.onLoad({ filter: /.*/, namespace: APP_NS }, (args) => {
|
|
151
|
+
const contents = files[args.path];
|
|
152
|
+
if (contents === undefined) {
|
|
153
|
+
return { errors: [{ text: `Missing file '${args.path}'` }] };
|
|
154
|
+
}
|
|
155
|
+
return { contents, loader: loaderFor(args.path), resolveDir: REAL_DIR };
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function toMsg(m: Message): BuildMessage {
|
|
162
|
+
return {
|
|
163
|
+
text: m.text,
|
|
164
|
+
location: m.location
|
|
165
|
+
? { file: m.location.file, line: m.location.line, column: m.location.column }
|
|
166
|
+
: null,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Matches a `host.tools.call('slug', …)` site with a *literal* slug. Dynamic
|
|
171
|
+
// slugs (a variable) are intentionally not matched — we can't statically know
|
|
172
|
+
// them, and flagging them would be a false positive.
|
|
173
|
+
const TOOL_CALL_RE = /host\s*\.\s*tools\s*\.\s*call\s*\(\s*(['"`])([^'"`]+)\1/g;
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Static lint: find every `host.tools.call('<slug>')` whose slug isn't in the
|
|
177
|
+
* app's declared `toolSlugs`. The host broker refuses undeclared slugs at
|
|
178
|
+
* runtime (a 403 the user only sees when the call fires), so surfacing the
|
|
179
|
+
* mismatch at build time turns a silent runtime failure into feedback the
|
|
180
|
+
* agent (and the Build panel) sees immediately. Returns BuildMessages so the
|
|
181
|
+
* caller can fold them into the build's warnings/errors. Literal slugs only.
|
|
182
|
+
*/
|
|
183
|
+
export function lintToolRefs(source: AppSource, declaredSlugs: string[]): BuildMessage[] {
|
|
184
|
+
const declared = new Set(declaredSlugs);
|
|
185
|
+
const out: BuildMessage[] = [];
|
|
186
|
+
for (const [file, text] of Object.entries(source.files)) {
|
|
187
|
+
TOOL_CALL_RE.lastIndex = 0;
|
|
188
|
+
let m: RegExpExecArray | null;
|
|
189
|
+
while ((m = TOOL_CALL_RE.exec(text)) !== null) {
|
|
190
|
+
const slug = m[2];
|
|
191
|
+
if (!slug || declared.has(slug)) continue;
|
|
192
|
+
const pre = text.slice(0, m.index);
|
|
193
|
+
const line = pre.length - pre.replace(/\n/g, '').length + 1; // 1-based
|
|
194
|
+
const column = m.index - (pre.lastIndexOf('\n') + 1); // 0-based within line
|
|
195
|
+
out.push({
|
|
196
|
+
text:
|
|
197
|
+
`This app calls tool '${slug}' via host.tools.call, but '${slug}' isn't in the app's declared tools — ` +
|
|
198
|
+
`the host will refuse it at runtime. Declare it with app_tools_set (build the tool via the toolsmith first if it doesn't exist), or remove the call.`,
|
|
199
|
+
location: { file, line, column },
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return out;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Bundle an app's source tree into one self-mounting ESM module. When
|
|
207
|
+
* `declaredToolSlugs` is supplied, undeclared `host.tools.call` slugs are
|
|
208
|
+
* appended to the build's warnings (see lintToolRefs). */
|
|
209
|
+
export async function buildApp(
|
|
210
|
+
source: AppSource,
|
|
211
|
+
opts: { declaredToolSlugs?: string[] } = {},
|
|
212
|
+
): Promise<BuildResult> {
|
|
213
|
+
const toolWarnings = opts.declaredToolSlugs ? lintToolRefs(source, opts.declaredToolSlugs) : [];
|
|
214
|
+
const withToolWarnings = (r: BuildResult): BuildResult =>
|
|
215
|
+
toolWarnings.length ? { ...r, warnings: [...r.warnings, ...toolWarnings] } : r;
|
|
216
|
+
return withToolWarnings(await buildAppInner(source));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
async function buildAppInner(source: AppSource): Promise<BuildResult> {
|
|
220
|
+
const entry = normKey(source.entry || 'App.tsx');
|
|
221
|
+
if (!(entry in source.files)) {
|
|
222
|
+
return {
|
|
223
|
+
ok: false,
|
|
224
|
+
errors: [{ text: `Entry file '${entry}' not found in source`, location: null }],
|
|
225
|
+
warnings: [],
|
|
226
|
+
esbuildVersion: ESBUILD_VERSION,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const stdin = `import App from ${JSON.stringify('./' + entry)};\nimport { __mount } from '@host';\n__mount(App);\n`;
|
|
231
|
+
|
|
232
|
+
const options: BuildOptions = {
|
|
233
|
+
stdin: { contents: stdin, resolveDir: REAL_DIR, sourcefile: STDIN, loader: 'tsx' },
|
|
234
|
+
bundle: true,
|
|
235
|
+
format: 'esm',
|
|
236
|
+
platform: 'browser',
|
|
237
|
+
target: 'es2020',
|
|
238
|
+
jsx: 'automatic',
|
|
239
|
+
// React (incl. any bundled dep's React, e.g. lucide-react) resolves to the
|
|
240
|
+
// one shared runtime instance via the iframe import map — never re-bundled.
|
|
241
|
+
external: REACT_EXTERNALS,
|
|
242
|
+
write: false,
|
|
243
|
+
minify: true,
|
|
244
|
+
legalComments: 'none',
|
|
245
|
+
logLevel: 'silent',
|
|
246
|
+
define: { 'process.env.NODE_ENV': '"production"' },
|
|
247
|
+
plugins: [virtualPlugin(source)],
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
try {
|
|
251
|
+
const res = await esbuild.build(options);
|
|
252
|
+
const code = res.outputFiles?.[0]?.text;
|
|
253
|
+
return {
|
|
254
|
+
ok: !!code,
|
|
255
|
+
...(code ? { code } : {}),
|
|
256
|
+
errors: res.errors.map(toMsg),
|
|
257
|
+
warnings: res.warnings.map(toMsg),
|
|
258
|
+
esbuildVersion: ESBUILD_VERSION,
|
|
259
|
+
};
|
|
260
|
+
} catch (err) {
|
|
261
|
+
// esbuild throws a BuildFailure carrying structured errors/warnings.
|
|
262
|
+
const bf = err as { errors?: Message[]; warnings?: Message[] };
|
|
263
|
+
if (bf && Array.isArray(bf.errors)) {
|
|
264
|
+
return {
|
|
265
|
+
ok: false,
|
|
266
|
+
errors: bf.errors.map(toMsg),
|
|
267
|
+
warnings: (bf.warnings ?? []).map(toMsg),
|
|
268
|
+
esbuildVersion: ESBUILD_VERSION,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
ok: false,
|
|
273
|
+
errors: [{ text: err instanceof Error ? err.message : String(err), location: null }],
|
|
274
|
+
warnings: [],
|
|
275
|
+
esbuildVersion: ESBUILD_VERSION,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
package/src/kit.test.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { KIT } from './kit';
|
|
3
|
+
|
|
4
|
+
// The @host kit module is a string mirror of packages/web-ui/src/app-bridge/protocol.ts (formerly apps/web/lib/app-bridge)
|
|
5
|
+
// (the sandbox can't import host code, so the shapes are duplicated by design).
|
|
6
|
+
// These are drift tripwires: if a bridge kind is renamed or dropped on either
|
|
7
|
+
// side, the app-facing API silently stops matching what the host answers.
|
|
8
|
+
describe('@host kit ↔ bridge protocol mirror', () => {
|
|
9
|
+
const HOST = KIT['@host']!;
|
|
10
|
+
|
|
11
|
+
it('exposes the core bridge kinds', () => {
|
|
12
|
+
for (const kind of ['tool.call', 'db.query', 'db.exec']) {
|
|
13
|
+
expect(HOST).toContain(`kind: '${kind}'`);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('exposes the team-hub namespace with the enumerated hub kinds', () => {
|
|
18
|
+
expect(HOST).toContain("kind: 'hub.get'");
|
|
19
|
+
// All nav intents post the SAME event kind with the target shapes the
|
|
20
|
+
// shell's isHubNavTarget guard accepts (chat / briefing / app).
|
|
21
|
+
expect(HOST).toContain("kind: 'hub.nav', target: 'chat'");
|
|
22
|
+
expect(HOST).toContain("kind: 'hub.nav', target: { briefing: String(token) }");
|
|
23
|
+
expect(HOST).toContain("kind: 'hub.nav', target: { app: String(token) }");
|
|
24
|
+
for (const api of ['hub:', 'get:', 'openChat:', 'openBriefing:', 'openApp:']) {
|
|
25
|
+
expect(HOST).toContain(api);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
});
|
package/src/kit.ts
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bundled-in module kit every mini app builds against. esbuild resolves the
|
|
3
|
+
* app's `@/components/ui/*`, `@/lib/utils`, and `@host` imports to these sources
|
|
4
|
+
* (served from memory by kitPlugin), so generated apps look native (same theme
|
|
5
|
+
* tokens) and talk to the host over the bridge — with NO dependency on the
|
|
6
|
+
* apps/web source tree or its node_modules at build time. React is bundled into
|
|
7
|
+
* each app (each iframe is its own isolated document).
|
|
8
|
+
*
|
|
9
|
+
* These are SOURCE STRINGS (TSX/TS), not live modules. They are compiled ONCE
|
|
10
|
+
* into the shared `/app-runtime` (see build-runtime.ts) and resolved at load time
|
|
11
|
+
* via the iframe import map — apps mark `react`/`@host`/`@/components/ui/*`
|
|
12
|
+
* external rather than re-bundling them. Keep them dependency-light (only `react`
|
|
13
|
+
* + `react-dom/client` in @host) and theme-token-only (never hardcode colours),
|
|
14
|
+
* matching apps/web/CLAUDE.md.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** `cn` — minimal class joiner (no clsx/tailwind-merge dep). Generated apps
|
|
18
|
+
* write clean class lists, so a plain truthy-join is enough. */
|
|
19
|
+
const UTILS = `
|
|
20
|
+
export function cn(...inputs) {
|
|
21
|
+
return inputs.flat(Infinity).filter(Boolean).join(' ');
|
|
22
|
+
}
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
const BUTTON = `
|
|
26
|
+
import * as React from 'react';
|
|
27
|
+
import { cn } from '@/lib/utils';
|
|
28
|
+
const VARIANTS = {
|
|
29
|
+
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
|
|
30
|
+
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
|
|
31
|
+
outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
|
|
32
|
+
ghost: 'hover:bg-accent hover:text-accent-foreground',
|
|
33
|
+
destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
|
|
34
|
+
link: 'text-primary underline-offset-4 hover:underline',
|
|
35
|
+
};
|
|
36
|
+
const SIZES = {
|
|
37
|
+
default: 'h-10 px-4 py-2',
|
|
38
|
+
sm: 'h-9 rounded-md px-3',
|
|
39
|
+
lg: 'h-11 rounded-md px-8',
|
|
40
|
+
icon: 'h-10 w-10',
|
|
41
|
+
};
|
|
42
|
+
export const Button = React.forwardRef(function Button(
|
|
43
|
+
{ className, variant = 'default', size = 'default', ...props },
|
|
44
|
+
ref,
|
|
45
|
+
) {
|
|
46
|
+
return (
|
|
47
|
+
<button
|
|
48
|
+
ref={ref}
|
|
49
|
+
className={cn(
|
|
50
|
+
'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',
|
|
51
|
+
VARIANTS[variant] || VARIANTS.default,
|
|
52
|
+
SIZES[size] || SIZES.default,
|
|
53
|
+
className,
|
|
54
|
+
)}
|
|
55
|
+
{...props}
|
|
56
|
+
/>
|
|
57
|
+
);
|
|
58
|
+
});
|
|
59
|
+
Button.displayName = 'Button';
|
|
60
|
+
`;
|
|
61
|
+
|
|
62
|
+
const CARD = `
|
|
63
|
+
import * as React from 'react';
|
|
64
|
+
import { cn } from '@/lib/utils';
|
|
65
|
+
export const Card = React.forwardRef(({ className, ...p }, ref) => (
|
|
66
|
+
<div ref={ref} className={cn('rounded-xl border border-border bg-card text-card-foreground shadow-sm', className)} {...p} />
|
|
67
|
+
));
|
|
68
|
+
Card.displayName = 'Card';
|
|
69
|
+
export const CardHeader = React.forwardRef(({ className, ...p }, ref) => (
|
|
70
|
+
<div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...p} />
|
|
71
|
+
));
|
|
72
|
+
CardHeader.displayName = 'CardHeader';
|
|
73
|
+
export const CardTitle = React.forwardRef(({ className, ...p }, ref) => (
|
|
74
|
+
<div ref={ref} className={cn('font-semibold leading-none tracking-tight', className)} {...p} />
|
|
75
|
+
));
|
|
76
|
+
CardTitle.displayName = 'CardTitle';
|
|
77
|
+
export const CardDescription = React.forwardRef(({ className, ...p }, ref) => (
|
|
78
|
+
<div ref={ref} className={cn('text-sm text-muted-foreground', className)} {...p} />
|
|
79
|
+
));
|
|
80
|
+
CardDescription.displayName = 'CardDescription';
|
|
81
|
+
export const CardContent = React.forwardRef(({ className, ...p }, ref) => (
|
|
82
|
+
<div ref={ref} className={cn('p-6 pt-0', className)} {...p} />
|
|
83
|
+
));
|
|
84
|
+
CardContent.displayName = 'CardContent';
|
|
85
|
+
export const CardFooter = React.forwardRef(({ className, ...p }, ref) => (
|
|
86
|
+
<div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...p} />
|
|
87
|
+
));
|
|
88
|
+
CardFooter.displayName = 'CardFooter';
|
|
89
|
+
`;
|
|
90
|
+
|
|
91
|
+
const INPUT = `
|
|
92
|
+
import * as React from 'react';
|
|
93
|
+
import { cn } from '@/lib/utils';
|
|
94
|
+
export const Input = React.forwardRef(({ className, type = 'text', ...p }, ref) => (
|
|
95
|
+
<input
|
|
96
|
+
ref={ref}
|
|
97
|
+
type={type}
|
|
98
|
+
className={cn(
|
|
99
|
+
'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
|
|
100
|
+
className,
|
|
101
|
+
)}
|
|
102
|
+
{...p}
|
|
103
|
+
/>
|
|
104
|
+
));
|
|
105
|
+
Input.displayName = 'Input';
|
|
106
|
+
`;
|
|
107
|
+
|
|
108
|
+
const LABEL = `
|
|
109
|
+
import * as React from 'react';
|
|
110
|
+
import { cn } from '@/lib/utils';
|
|
111
|
+
export const Label = React.forwardRef(({ className, ...p }, ref) => (
|
|
112
|
+
<label ref={ref} className={cn('text-sm font-medium leading-none', className)} {...p} />
|
|
113
|
+
));
|
|
114
|
+
Label.displayName = 'Label';
|
|
115
|
+
`;
|
|
116
|
+
|
|
117
|
+
const BADGE = `
|
|
118
|
+
import * as React from 'react';
|
|
119
|
+
import { cn } from '@/lib/utils';
|
|
120
|
+
const V = {
|
|
121
|
+
default: 'border-transparent bg-primary text-primary-foreground',
|
|
122
|
+
secondary: 'border-transparent bg-secondary text-secondary-foreground',
|
|
123
|
+
destructive: 'border-transparent bg-destructive text-destructive-foreground',
|
|
124
|
+
outline: 'text-foreground',
|
|
125
|
+
};
|
|
126
|
+
export function Badge({ className, variant = 'default', ...p }) {
|
|
127
|
+
return <div className={cn('inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold', V[variant] || V.default, className)} {...p} />;
|
|
128
|
+
}
|
|
129
|
+
`;
|
|
130
|
+
|
|
131
|
+
const SEPARATOR = `
|
|
132
|
+
import * as React from 'react';
|
|
133
|
+
import { cn } from '@/lib/utils';
|
|
134
|
+
export function Separator({ className, orientation = 'horizontal', ...p }) {
|
|
135
|
+
return (
|
|
136
|
+
<div
|
|
137
|
+
role="separator"
|
|
138
|
+
className={cn('shrink-0 bg-border', orientation === 'horizontal' ? 'h-px w-full' : 'h-full w-px', className)}
|
|
139
|
+
{...p}
|
|
140
|
+
/>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
`;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* The host bridge — the app's ONLY door to data + storage. Posts typed requests
|
|
147
|
+
* to the parent and awaits a correlated response. The app holds no secrets; the
|
|
148
|
+
* host resolves them server-side. `__mount` (used by the generated entry) wires
|
|
149
|
+
* the React root, an error boundary, the ready signal, and auto-resize.
|
|
150
|
+
*
|
|
151
|
+
* Mirrors apps/web/lib/app-bridge/protocol.ts — keep the message shapes in sync.
|
|
152
|
+
*/
|
|
153
|
+
const HOST = `
|
|
154
|
+
import * as React from 'react';
|
|
155
|
+
import { createRoot } from 'react-dom/client';
|
|
156
|
+
|
|
157
|
+
const pending = new Map();
|
|
158
|
+
let seq = 0;
|
|
159
|
+
const rid = () => 'r' + (++seq) + '_' + Math.random().toString(36).slice(2);
|
|
160
|
+
|
|
161
|
+
function post(partial) {
|
|
162
|
+
return new Promise((resolve, reject) => {
|
|
163
|
+
const id = rid();
|
|
164
|
+
pending.set(id, { resolve, reject });
|
|
165
|
+
window.parent.postMessage({ v: 1, id, ...partial }, '*');
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const annotateListeners = new Set();
|
|
170
|
+
|
|
171
|
+
window.addEventListener('message', (e) => {
|
|
172
|
+
if (e.source !== window.parent) return;
|
|
173
|
+
const m = e.data;
|
|
174
|
+
if (!m || m.v !== 1) return;
|
|
175
|
+
if (m.kind === 'annotate') {
|
|
176
|
+
for (const fn of annotateListeners) { try { fn(m.regions || []); } catch {} }
|
|
177
|
+
paintAnnotations(m.regions || []);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (typeof m.id === 'string' && pending.has(m.id)) {
|
|
181
|
+
const p = pending.get(m.id);
|
|
182
|
+
pending.delete(m.id);
|
|
183
|
+
if (m.ok) p.resolve(m.output);
|
|
184
|
+
else p.reject(new Error(m.error || 'bridge error'));
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
function paintAnnotations(regions) {
|
|
189
|
+
document.querySelectorAll('[data-app-annotated]').forEach((el) => {
|
|
190
|
+
el.removeAttribute('data-app-annotated');
|
|
191
|
+
el.style.outline = '';
|
|
192
|
+
el.style.outlineOffset = '';
|
|
193
|
+
});
|
|
194
|
+
for (const r of regions) {
|
|
195
|
+
const el = document.querySelector('[data-app-region="' + r.id + '"]');
|
|
196
|
+
if (!el) continue;
|
|
197
|
+
el.setAttribute('data-app-annotated', '1');
|
|
198
|
+
el.style.outline = '2px solid var(--ring)';
|
|
199
|
+
el.style.outlineOffset = '2px';
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export const host = {
|
|
204
|
+
tools: {
|
|
205
|
+
call: (slug, input) => post({ kind: 'tool.call', slug, input: input ?? {} }),
|
|
206
|
+
},
|
|
207
|
+
db: {
|
|
208
|
+
query: (sql, params) => post({ kind: 'db.query', sql, params: params ?? [] }),
|
|
209
|
+
exec: (sql, params) => post({ kind: 'db.exec', sql, params: params ?? [] }),
|
|
210
|
+
},
|
|
211
|
+
ui: {
|
|
212
|
+
resize: (h) => window.parent.postMessage({ v: 1, kind: 'resize', height: h }, '*'),
|
|
213
|
+
notifyError: (msg) => window.parent.postMessage({ v: 1, kind: 'error', message: String(msg) }, '*'),
|
|
214
|
+
onAnnotate: (fn) => { annotateListeners.add(fn); return () => annotateListeners.delete(fn); },
|
|
215
|
+
},
|
|
216
|
+
// Team-hub surface only. get() rejects everywhere else (owner editor,
|
|
217
|
+
// ordinary shares) — hub apps catch that and render a local preview. The
|
|
218
|
+
// nav calls are intent-up: the /team SHELL owns chat + the briefing reader,
|
|
219
|
+
// the app can only ask to open them.
|
|
220
|
+
hub: {
|
|
221
|
+
get: () => post({ kind: 'hub.get' }),
|
|
222
|
+
openChat: () => window.parent.postMessage({ v: 1, kind: 'hub.nav', target: 'chat' }, '*'),
|
|
223
|
+
openBriefing: (token) =>
|
|
224
|
+
window.parent.postMessage({ v: 1, kind: 'hub.nav', target: { briefing: String(token) } }, '*'),
|
|
225
|
+
openApp: (token) =>
|
|
226
|
+
window.parent.postMessage({ v: 1, kind: 'hub.nav', target: { app: String(token) } }, '*'),
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
class ErrorBoundary extends React.Component {
|
|
231
|
+
constructor(p) { super(p); this.state = { err: null }; }
|
|
232
|
+
static getDerivedStateFromError(err) { return { err }; }
|
|
233
|
+
componentDidCatch(err) {
|
|
234
|
+
window.parent.postMessage({ v: 1, kind: 'error', message: String(err && err.message || err), stack: err && err.stack }, '*');
|
|
235
|
+
}
|
|
236
|
+
render() {
|
|
237
|
+
if (this.state.err) {
|
|
238
|
+
return React.createElement(
|
|
239
|
+
'div',
|
|
240
|
+
{ className: 'p-4 text-sm text-destructive' },
|
|
241
|
+
'App crashed: ' + String(this.state.err.message || this.state.err),
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
return this.props.children;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export function __mount(App) {
|
|
249
|
+
const el = document.getElementById('root');
|
|
250
|
+
if (!el) return;
|
|
251
|
+
const root = createRoot(el);
|
|
252
|
+
root.render(React.createElement(ErrorBoundary, null, React.createElement(App)));
|
|
253
|
+
const send = () => host.ui.resize(Math.ceil(document.documentElement.scrollHeight));
|
|
254
|
+
window.parent.postMessage({ v: 1, kind: 'ready' }, '*');
|
|
255
|
+
requestAnimationFrame(send);
|
|
256
|
+
try { new ResizeObserver(send).observe(document.body); } catch {}
|
|
257
|
+
}
|
|
258
|
+
`;
|
|
259
|
+
|
|
260
|
+
/** path (as imported in app source) → source string. */
|
|
261
|
+
export const KIT: Record<string, string> = {
|
|
262
|
+
'@/lib/utils': UTILS,
|
|
263
|
+
'@/components/ui/button': BUTTON,
|
|
264
|
+
'@/components/ui/card': CARD,
|
|
265
|
+
'@/components/ui/input': INPUT,
|
|
266
|
+
'@/components/ui/label': LABEL,
|
|
267
|
+
'@/components/ui/badge': BADGE,
|
|
268
|
+
'@/components/ui/separator': SEPARATOR,
|
|
269
|
+
'@host': HOST,
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
/** The shadcn-style component import paths an app may use (for the skill doc). */
|
|
273
|
+
export const KIT_UI_IMPORTS = Object.keys(KIT).filter((k) => k.startsWith('@/components/ui/'));
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"rootDir": "src",
|
|
5
|
+
"outDir": "dist",
|
|
6
|
+
"types": ["node"],
|
|
7
|
+
// build-runtime.ts is executed directly by Node (the build:runtime script),
|
|
8
|
+
// which requires explicit `.ts` import specifiers. This package is only ever
|
|
9
|
+
// typechecked (--noEmit) or transpiled by Next, never emitted by tsc — so
|
|
10
|
+
// allowing the extension keeps the Node-run and tsc paths in agreement.
|
|
11
|
+
"allowImportingTsExtensions": true
|
|
12
|
+
},
|
|
13
|
+
"include": ["src/**/*.ts"]
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/esbuild@0.28.1/node_modules/esbuild/lib/main.d.ts","./src/kit.ts","./src/build-runtime.ts","../../node_modules/.pnpm/@vitest+pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/display.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/types.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/helpers.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/timers.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/index.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/diff.d.ts","../../node_modules/.pnpm/@vitest+runner@4.1.10/node_modules/@vitest/runner/dist/tasks.d-deyaimiu.d.ts","../../node_modules/.pnpm/@vitest+runner@4.1.10/node_modules/@vitest/runner/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/traces.d.d2t_r8rx.d.ts","../../node_modules/.pnpm/vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0/node_modules/vite/types/hmrpayload.d.ts","../../node_modules/.pnpm/vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0/node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","../../node_modules/.pnpm/vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0/node_modules/vite/types/customevent.d.ts","../../node_modules/.pnpm/vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0/node_modules/vite/types/hot.d.ts","../../node_modules/.pnpm/vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0/node_modules/vite/dist/node/module-runner.d.ts","../../node_modules/.pnpm/@vitest+snapshot@4.1.10/node_modules/@vitest/snapshot/dist/environment.d-dojxxzv9.d.ts","../../node_modules/.pnpm/@vitest+snapshot@4.1.10/node_modules/@vitest/snapshot/dist/rawsnapshot.d-d_x3-62x.d.ts","../../node_modules/.pnpm/@vitest+snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/config.d.a1h_y6jt.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/environment.d.crsxczp1.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/rpc.d.b_8spu0w.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/worker.d.zphpo4yb.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/browser.d.bcoexmfg.d.ts","../../node_modules/.pnpm/@vitest+spy@4.1.10/node_modules/@vitest/spy/optional-types.d.ts","../../node_modules/.pnpm/@vitest+spy@4.1.10/node_modules/@vitest/spy/dist/index.d.ts","../../node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.d.ts","../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../node_modules/.pnpm/@types+deep-eql@4.0.2/node_modules/@types/deep-eql/index.d.ts","../../node_modules/.pnpm/assertion-error@2.0.1/node_modules/assertion-error/index.d.ts","../../node_modules/.pnpm/@types+chai@5.2.3/node_modules/@types/chai/index.d.ts","../../node_modules/.pnpm/@vitest+expect@4.1.10/node_modules/@vitest/expect/dist/index.d.ts","../../node_modules/.pnpm/@vitest+runner@4.1.10/node_modules/@vitest/runner/dist/utils.d.ts","../../node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/benchmark.d.daahlpsq.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/global.d.dvssrdq5.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/optional-runtime-types.d.ts","../../node_modules/.pnpm/@vitest+mocker@4.1.10_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/@vitest/mocker/dist/types.d-bji5eawu.d.ts","../../node_modules/.pnpm/@vitest+mocker@4.1.10_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/@vitest/mocker/dist/index.d-b41z0auw.d.ts","../../node_modules/.pnpm/@vitest+mocker@4.1.10_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/@vitest/mocker/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/suite.d.udjtyagw.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/chunks/evaluatedmodules.d.bxj5omdx.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/runners.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.d.ts","../../node_modules/.pnpm/vitest@4.1.10_@types+node@25.9.5_vite@8.1.5_@types+node@25.9.5_esbuild@0.28.1_jiti@2.7.0_tsx@4.23.1_yaml@2.9.0_/node_modules/vitest/dist/index.d.ts","./src/index.ts","./src/build.test.ts","./src/kit.test.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/index.d.ts"],"fileIdsList":[[120,170,187,188],[91,92,120,170,187,188],[120,167,168,170,187,188],[120,169,170,187,188],[170,187,188],[120,170,175,187,188,205],[120,170,171,176,181,187,188,190,202,213],[120,170,171,172,181,187,188,190],[115,116,117,120,170,187,188],[120,170,173,187,188,214],[120,170,174,175,182,187,188,191],[120,170,175,187,188,202,210],[120,170,176,178,181,187,188,190],[120,169,170,177,187,188],[120,170,178,179,187,188],[120,170,180,181,187,188],[120,169,170,181,187,188],[120,170,181,182,183,187,188,202,213],[120,170,181,182,183,187,188,197,202,205],[120,162,170,178,181,184,187,188,190,202,213],[120,170,181,182,184,185,187,188,190,202,210,213],[120,170,184,186,187,188,202,210,213],[118,119,120,121,122,123,124,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219],[120,170,181,187,188],[120,170,187,188,189,213],[120,170,178,181,187,188,190,202],[120,170,187,188,191],[120,170,187,188,192],[120,169,170,187,188,193],[120,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219],[120,170,187,188,195],[120,170,187,188,196],[120,170,181,187,188,197,198],[120,170,187,188,197,199,214,216],[120,170,182,187,188],[120,170,181,187,188,202,203,205],[120,170,187,188,204,205],[120,170,187,188,202,203],[120,170,187,188,205],[120,170,187,188,206],[120,167,170,187,188,202,207,213],[120,170,181,187,188,208,209],[120,170,187,188,208,209],[120,170,175,187,188,190,202,210],[120,170,187,188,211],[120,170,187,188,190,212],[120,170,184,187,188,196,213],[120,170,175,187,188,214],[120,170,187,188,202,215],[120,170,187,188,189,216],[120,170,187,188,217],[120,162,170,187,188],[120,162,170,181,183,187,188,193,202,205,213,215,216,218],[120,170,187,188,202,219],[64,70,88,89,90,93,120,170,187,188],[100,120,170,187,188],[100,101,120,170,187,188],[68,70,71,120,170,187,188],[68,70,120,170,187,188],[68,120,170,187,188],[63,68,79,80,120,170,187,188],[63,68,79,120,170,187,188],[87,120,170,187,188],[63,69,120,170,187,188],[63,120,170,187,188],[65,120,170,187,188],[63,64,65,66,67,120,170,187,188],[106,107,120,170,187,188],[106,107,108,109,120,170,187,188],[106,108,120,170,187,188],[106,120,170,187,188],[120,134,138,170,187,188,213],[120,134,170,187,188,202,213],[120,129,170,187,188],[120,131,134,170,187,188,210,213],[120,170,187,188,190,210],[120,170,187,188,220],[120,129,170,187,188,220],[120,131,134,170,187,188,190,213],[120,126,127,130,133,170,181,187,188,202,213],[120,134,141,170,187,188],[120,126,132,170,187,188],[120,134,155,156,170,187,188],[120,130,134,170,187,188,205,213,220],[120,155,170,187,188,220],[120,128,129,170,187,188,220],[120,134,170,187,188],[120,128,129,130,131,132,133,134,135,136,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,156,157,158,159,160,161,170,187,188],[120,134,149,170,187,188],[120,134,141,142,170,187,188],[120,132,134,142,143,170,187,188],[120,133,170,187,188],[120,126,129,134,170,187,188],[120,134,138,142,143,170,187,188],[120,138,170,187,188],[120,132,134,137,170,187,188,213],[120,126,131,134,141,170,187,188],[120,170,187,188,202],[120,129,134,155,170,187,188,218,220],[74,120,170,187,188],[74,75,76,77,120,170,187,188],[76,120,170,187,188],[72,95,96,98,120,170,187,188],[72,73,85,98,120,170,187,188],[63,70,72,73,81,98,120,170,187,188],[78,120,170,187,188],[63,72,73,81,94,97,98,120,170,187,188],[72,73,78,81,98,120,170,187,188],[72,95,96,97,98,120,170,187,188],[72,78,82,83,84,98,120,170,187,188],[63,68,70,72,73,78,81,82,83,84,85,86,88,94,95,96,97,98,99,102,103,104,105,110,120,170,187,188],[63,70,72,73,81,82,95,96,97,98,103,120,170,187,188],[60,61,120,170,182,187,188,189,192,213],[111,112,120,170,187,188],[60,61,120,170,187,188,192,213],[61,111,120,170,187,188]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},"c9f0a7fe85b69f0e093cf84d6d33651e2d6ae6bf88360fe77cffe92eb85a34db","ed3032d1b112879480ab6dd48bada9abdc50a3975f408473109b534000d0e9b9",{"version":"3a582c6e8906f5b094ccf0de6cc6f4f8a54b05a34f52517aba5c9c7f704f6b28","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"72ce5b734c05da85c85a6f6dc05823b051d6aa41acaedeeb1d17c72f3b4efa72","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"49ab4f1d153a252779958fc87b700743d32b5ffa42addd70ae23ad3f429daa5c","impliedFormat":99},{"version":"53cf4076f42b29b8d411259d168d51b3a0274c42c8814e5b44dfa8803a35d4fc","impliedFormat":99},{"version":"a39461ee1f27cf3e6cfd63d21045713d26d521da55ea4d8efccb705f689e6dbb","impliedFormat":99},{"version":"61bb64660ee150f3ab618340e15cca0a81664801bede7c966ca0eca3a952fe63","impliedFormat":99},{"version":"3b89216a7e38a454985ad17bb2ff85792837dc812f2a89fa5f60ad0a2e216fa7","impliedFormat":99},{"version":"c911b3bd083dade8fdb7775261aa25feae695d562a3b11209650b47be90043fc","impliedFormat":99},{"version":"de4a612aa8f1704af486f701e21993c786ba7d8cfed55fffa6684026aea2346e","impliedFormat":99},{"version":"4e003c868b0d8f8ad200b96cbc653e18e513fa23e1c19c4fe3cc25d4394efc47","impliedFormat":99},{"version":"d4ec151557b64ff001e06b5878e66eb98640961647b1581fe2a0a1af05f408fb","impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"ec0c42bb0f465e4993f2bc68a6ce9df9a2dcbc7b83e21748f82f1b69561938e3","impliedFormat":99},{"version":"f50ff37a9cbbe74475f426474d9827083c7c2c138a954d28f1690df338f69291","impliedFormat":99},{"version":"61fd6c17235d530c40f543dd7c40afab091d91c1ef890baeed30db6d82b04b28","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"091767bc841f937654ed597d49e023ed59850355e746ae1a6f20ab31076ee1fb","impliedFormat":99},{"version":"19c6d6135af59693698d384050b45a8a049493500add442f58e4bd7c8a255ab6","impliedFormat":99},{"version":"6a0dba12d55314638a8c51108b20fe2f68f1364a619d098918bda91c22dec154","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"4ead13a482c539b77394b2a97e3b877b809eac596390371cea490286f53b996a","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"5c935b7fc4ddc1410ea1cd7cd4e35ed106a6e4920dd27a9480a40fd224359dc3","affectsGlobalScope":true,"impliedFormat":99},{"version":"2b39c6cf59088713babbfc3e20ee85f1375d40e66953156fa658346b8346f24f","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"4ffba3c5848b4fe62ee59b754fd5f256ad9656a0db6d37b9a2a8cb40dfc7ac21","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"59e5e964b84fdb2378e9455e4e59405030e4ed2b4c6f891ce395f17796af3cbb","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"90ba95a763101bb61b8a799731a2ed60b5016b8135c1a2d5186862d4b534d4a1","impliedFormat":99},"a2266811503610a796365704939dd14ba5ed541b4bec9257b4a0560018bbd8f1","1457cf7c6c4cdfe3e3474838c2d1dc00d91c89bae2506421cc49908b2efdb344",{"version":"b3aee7252283cf61209103ca0dfbb6cf3b1dc563e7c4e461131de82840fea35f","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1}],"root":[61,62,[112,114]],"options":{"allowImportingTsExtensions":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":false,"module":99,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9,"verbatimModuleSyntax":false},"referencedMap":[[90,1],[93,2],[91,1],[167,3],[168,3],[169,4],[120,5],[170,6],[171,7],[172,8],[115,1],[118,9],[116,1],[117,1],[173,10],[174,11],[175,12],[176,13],[177,14],[178,15],[179,15],[180,16],[181,17],[182,18],[183,19],[121,1],[119,1],[184,20],[185,21],[186,22],[220,23],[187,24],[188,1],[189,25],[190,26],[191,27],[192,28],[193,29],[194,30],[195,31],[196,32],[197,33],[198,33],[199,34],[200,1],[201,35],[202,36],[204,37],[203,38],[205,39],[206,40],[207,41],[208,42],[209,43],[210,44],[211,45],[212,46],[213,47],[214,48],[215,49],[216,50],[217,51],[122,1],[123,1],[124,1],[163,52],[164,1],[165,1],[166,39],[218,53],[219,54],[94,55],[101,56],[102,57],[100,1],[63,1],[72,58],[71,59],[95,58],[79,60],[81,61],[80,62],[88,63],[87,1],[70,64],[64,65],[66,66],[68,67],[67,1],[69,65],[65,1],[92,1],[125,1],[60,1],[108,68],[110,69],[109,70],[107,71],[106,1],[96,1],[89,1],[58,1],[59,1],[10,1],[11,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[23,1],[4,1],[24,1],[28,1],[25,1],[26,1],[27,1],[29,1],[30,1],[31,1],[5,1],[32,1],[33,1],[34,1],[35,1],[6,1],[39,1],[36,1],[37,1],[38,1],[40,1],[7,1],[41,1],[46,1],[47,1],[42,1],[43,1],[44,1],[45,1],[8,1],[51,1],[48,1],[49,1],[50,1],[52,1],[9,1],[53,1],[54,1],[55,1],[57,1],[56,1],[1,1],[141,72],[151,73],[140,72],[161,74],[132,75],[131,76],[160,77],[154,78],[159,79],[134,80],[148,81],[133,82],[157,83],[129,84],[128,77],[158,85],[130,86],[135,87],[136,1],[139,87],[126,1],[162,88],[152,89],[143,90],[144,91],[146,92],[142,93],[145,94],[155,77],[137,95],[138,96],[147,97],[127,98],[150,89],[149,87],[153,1],[156,99],[75,100],[78,101],[76,100],[74,1],[77,102],[97,103],[86,104],[82,105],[83,60],[104,106],[98,107],[84,108],[103,109],[73,1],[85,110],[111,111],[105,112],[99,1],[62,113],[113,114],[112,115],[114,116],[61,1]],"affectedFilesPendingEmit":[[62,51],[113,51],[112,51],[114,51],[61,51]],"version":"5.9.3"}
|