create-invokable 0.2.0 → 0.3.1
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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +20 -4
- package/dist/cli.js.map +1 -1
- package/dist/template.d.ts.map +1 -1
- package/dist/template.js +211 -10
- package/dist/template.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4C,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAkBD,wBAAsB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4C,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAkBD,wBAAsB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkIxE"}
|
package/dist/cli.js
CHANGED
|
@@ -95,18 +95,34 @@ export async function createMain(options) {
|
|
|
95
95
|
stderr(`\nCreated ${target}\n\n`);
|
|
96
96
|
for (const file of files)
|
|
97
97
|
stderr(` ${file.path}\n`);
|
|
98
|
-
|
|
98
|
+
// Spelled out because `${name} login` is the first thing people try, and
|
|
99
|
+
// it is not a command until the package is linked. Getting
|
|
100
|
+
// "command not found" straight after a successful scaffold reads as the
|
|
101
|
+
// tool being broken.
|
|
102
|
+
const lines = [
|
|
99
103
|
'',
|
|
100
104
|
'Next:',
|
|
101
105
|
` cd ${name}`,
|
|
102
106
|
' npm install',
|
|
103
107
|
' npm run build',
|
|
108
|
+
'',
|
|
109
|
+
`Run it with the full path — \`${name}\` is not on your PATH yet:`,
|
|
104
110
|
` node bin/${name}.mjs --help`,
|
|
111
|
+
` node bin/${name}.mjs doctor --json`,
|
|
105
112
|
'',
|
|
106
|
-
|
|
107
|
-
|
|
113
|
+
`To type \`${name}\` instead, link it once:`,
|
|
114
|
+
' npm link',
|
|
115
|
+
` ${name} --help`,
|
|
108
116
|
'',
|
|
109
|
-
]
|
|
117
|
+
];
|
|
118
|
+
if (auth === 'self-host') {
|
|
119
|
+
lines.push('This project is self-hosted, so it ships its own server.', 'Start it in another terminal before you sign in:', ' npm run server', ` node bin/${name}.mjs login`, '');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
lines.push('Sign in (opens a browser):', ` node bin/${name}.mjs login`, '');
|
|
123
|
+
}
|
|
124
|
+
lines.push('Then check the contract holds:', ` npx invokable-test node bin/${name}.mjs`, '');
|
|
125
|
+
stderr(lines.join('\n'));
|
|
110
126
|
return 0;
|
|
111
127
|
}
|
|
112
128
|
finally {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/template.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA4XD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,EAAE,CA2G3D"}
|
package/dist/template.js
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
/**
|
|
3
|
+
* The `@invokable/*` range a scaffolded project depends on.
|
|
4
|
+
*
|
|
5
|
+
* Read from this package's own version rather than written down. Every package
|
|
6
|
+
* in the monorepo shares one version, and a caret range on 0.x does not cross a
|
|
7
|
+
* minor bump — so a hardcoded `^0.2.0` left here would make
|
|
8
|
+
* `create-invokable@0.3.0` scaffold projects pinned to an SDK it was never
|
|
9
|
+
* tested against.
|
|
10
|
+
*/
|
|
11
|
+
function sdkRange() {
|
|
12
|
+
const manifest = new URL('../package.json', import.meta.url);
|
|
13
|
+
const { version } = JSON.parse(readFileSync(manifest, 'utf8'));
|
|
14
|
+
return `^${version}`;
|
|
15
|
+
}
|
|
1
16
|
/** `deploy-thing` -> `DeployThing`, for a generated type name. */
|
|
2
17
|
function pascal(value) {
|
|
3
18
|
return value
|
|
@@ -91,7 +106,9 @@ export default defineTool({
|
|
|
91
106
|
baseUrl: process.env.${envPrefix}_API ?? '${baseUrl}',
|
|
92
107
|
authUrl: process.env.${envPrefix}_AUTH ?? '${authUrl}',
|
|
93
108
|
},
|
|
94
|
-
|
|
109
|
+
// Overridable so a second environment — a local server, CI — gets its own
|
|
110
|
+
// token instead of overwriting the one you are already signed in with.
|
|
111
|
+
configDir: process.env.${envPrefix}_CONFIG_DIR ?? '~/.${spec.name}',
|
|
95
112
|
${spec.spends ? '\n // Refuse `--yes` on spending commands unless `--max-spend` is also given.\n requireSpendLimit: true,\n' : ''}
|
|
96
113
|
commands: {
|
|
97
114
|
// Installs agent instructions into this project. login/logout/whoami/doctor
|
|
@@ -102,6 +119,133 @@ ${spec.spends ? gated : plain}
|
|
|
102
119
|
});
|
|
103
120
|
`;
|
|
104
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* A runnable server for `--auth self-host`.
|
|
124
|
+
*
|
|
125
|
+
* Telling someone to "start a server that mounts @invokable/server" and handing
|
|
126
|
+
* them nothing is where the self-host path used to break: the CLI half was
|
|
127
|
+
* scaffolded and the other half was a sentence. This is the other half.
|
|
128
|
+
*/
|
|
129
|
+
function serverSource(spec) {
|
|
130
|
+
return `#!/usr/bin/env node
|
|
131
|
+
/**
|
|
132
|
+
* Development auth + checkpoint server for ${spec.name}.
|
|
133
|
+
*
|
|
134
|
+
* npm run server # this file, on :8787
|
|
135
|
+
* npm run build && node bin/${spec.name}.mjs login
|
|
136
|
+
*
|
|
137
|
+
* Three things are served: auth and checkpoints come from @invokable/server,
|
|
138
|
+
* and the ${spec.command} endpoints are yours to replace with the real thing.
|
|
139
|
+
*/
|
|
140
|
+
import { createServer } from 'node:http';
|
|
141
|
+
import {
|
|
142
|
+
CheckpointVerifier,
|
|
143
|
+
checkpointRoutes,
|
|
144
|
+
invokableAuth,
|
|
145
|
+
memoryCheckpointStore,
|
|
146
|
+
memoryStore,
|
|
147
|
+
verifyCheckpoint,
|
|
148
|
+
} from '@invokable/server';
|
|
149
|
+
import { nodeListener } from '@invokable/server/node';
|
|
150
|
+
|
|
151
|
+
const PORT = Number(process.env.PORT ?? 8787);
|
|
152
|
+
|
|
153
|
+
// Signs approval fingerprints. In production this comes from your secret
|
|
154
|
+
// manager and never leaves your infrastructure.
|
|
155
|
+
const CHECKPOINT_SECRET = process.env.CHECKPOINT_SECRET ?? 'dev-only-change-me-0123456789abcdef';
|
|
156
|
+
|
|
157
|
+
const verifier = new CheckpointVerifier({
|
|
158
|
+
secret: CHECKPOINT_SECRET,
|
|
159
|
+
// Development only — everything is lost on restart, and on serverless there
|
|
160
|
+
// is no shared memory at all. Swap for postgresCheckpointStore() before
|
|
161
|
+
// anyone depends on this. See the @invokable/server README.
|
|
162
|
+
store: memoryCheckpointStore(),
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
const auth = invokableAuth({
|
|
166
|
+
store: memoryStore(),
|
|
167
|
+
tokenPrefix: '${spec.name.replace(/-/g, '').slice(0, 4)}',
|
|
168
|
+
tokenTtl: null,
|
|
169
|
+
|
|
170
|
+
// THE HOOK YOU MUST REPLACE.
|
|
171
|
+
//
|
|
172
|
+
// Runs on the approval page, in the browser. It answers "who is signed in
|
|
173
|
+
// right now?" from your own session — a cookie, a JWT, whatever you already
|
|
174
|
+
// have. Returning null means signed out, and nothing can be approved.
|
|
175
|
+
requireSession: (_request) => ({
|
|
176
|
+
subject: 'dev@example.com',
|
|
177
|
+
displayName: 'Local Developer',
|
|
178
|
+
}),
|
|
179
|
+
|
|
180
|
+
// Optional: your own branded approval page. If you replace the default, KEEP
|
|
181
|
+
// the part naming the tool, version and machine, and the warning to approve
|
|
182
|
+
// only a login you just started — that display is the only defence against
|
|
183
|
+
// someone sending a user a code and asking them to approve it.
|
|
184
|
+
// approvePage: ({ device, user }) => renderMyPage(device, user),
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const checkpoints = checkpointRoutes({ verifier });
|
|
188
|
+
${spec.spends
|
|
189
|
+
? `
|
|
190
|
+
// Guards only the endpoint that spends. Guarding the planning call too would
|
|
191
|
+
// mean the CLI could never fetch a plan to show the user, and the gate could
|
|
192
|
+
// never open.
|
|
193
|
+
const requireApproval = verifyCheckpoint({
|
|
194
|
+
verifier,
|
|
195
|
+
requiresApproval: (request) => new URL(request.url).pathname === '/v1/${spec.command}',
|
|
196
|
+
// Must return the same \`subject\` the CLI passes to checkpoint(). It binds an
|
|
197
|
+
// approval to one target, so an approval for A cannot act on B.
|
|
198
|
+
subjectFor: () => 'svc-1',
|
|
199
|
+
});
|
|
200
|
+
`
|
|
201
|
+
: ''}
|
|
202
|
+
const state = { runs: [], balance: 100 };
|
|
203
|
+
const json = (body, status = 200) =>
|
|
204
|
+
new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } });
|
|
205
|
+
|
|
206
|
+
createServer(
|
|
207
|
+
nodeListener(async (request) => {
|
|
208
|
+
const { pathname } = new URL(request.url);
|
|
209
|
+
${spec.spends
|
|
210
|
+
? `
|
|
211
|
+
// Planning changes nothing, so it is not gated. It produces the summary the
|
|
212
|
+
// user is about to be asked to approve.
|
|
213
|
+
if (pathname === '/v1/${spec.command}/plan' && request.method === 'POST') {
|
|
214
|
+
const { env } = await request.json().catch(() => ({}));
|
|
215
|
+
return json({ id: 'svc-1', env, credits: 12, balance: state.balance, summary: { env } });
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (pathname === '/v1/${spec.command}' && request.method === 'POST') {
|
|
219
|
+
// Returns a 409 the CLI turns into exit 12 when the approval is missing,
|
|
220
|
+
// stale, expired or already used. Returns null when it is good.
|
|
221
|
+
const rejected = await requireApproval(request);
|
|
222
|
+
if (rejected) return rejected;
|
|
223
|
+
|
|
224
|
+
const id = \`run_\${state.runs.length + 1}\`;
|
|
225
|
+
state.runs.push(id);
|
|
226
|
+
state.balance -= 12;
|
|
227
|
+
return json({ ok: true, id, balanceAfter: state.balance });
|
|
228
|
+
}
|
|
229
|
+
`
|
|
230
|
+
: `
|
|
231
|
+
if (pathname.startsWith('/v1/${spec.command}/')) {
|
|
232
|
+
return json({ ok: true, name: decodeURIComponent(pathname.split('/').pop() ?? '') });
|
|
233
|
+
}
|
|
234
|
+
`}
|
|
235
|
+
// Each returns null for paths it does not own, so they compose with yours.
|
|
236
|
+
return (await auth(request)) ?? (await checkpoints(request));
|
|
237
|
+
}),
|
|
238
|
+
).listen(PORT, () => {
|
|
239
|
+
console.error(\`${spec.name} dev server on http://127.0.0.1:\${PORT}\`);
|
|
240
|
+
console.error('');
|
|
241
|
+
console.error(' auth POST /device/start GET /device POST /device/token');
|
|
242
|
+
console.error(' checkpoints POST /checkpoints POST /checkpoints/verify');
|
|
243
|
+
console.error(' yours ${spec.spends ? `POST /v1/${spec.command}/plan POST /v1/${spec.command}` : `GET /v1/${spec.command}/:name`}');
|
|
244
|
+
console.error('');
|
|
245
|
+
console.error(' Next: npm run build && node bin/${spec.name}.mjs login');
|
|
246
|
+
});
|
|
247
|
+
`;
|
|
248
|
+
}
|
|
105
249
|
function readme(spec) {
|
|
106
250
|
const envPrefix = spec.name.toUpperCase().replace(/-/g, '_');
|
|
107
251
|
return `# ${spec.name}
|
|
@@ -116,6 +260,14 @@ npm run build
|
|
|
116
260
|
node bin/${spec.name}.mjs --help
|
|
117
261
|
\`\`\`
|
|
118
262
|
|
|
263
|
+
\`${spec.name}\` is not on your PATH until you link it, so run it by path while
|
|
264
|
+
developing. To type the bare name instead:
|
|
265
|
+
|
|
266
|
+
\`\`\`bash
|
|
267
|
+
npm link # once
|
|
268
|
+
${spec.name} --help
|
|
269
|
+
\`\`\`
|
|
270
|
+
|
|
119
271
|
## Try it
|
|
120
272
|
|
|
121
273
|
\`\`\`bash
|
|
@@ -127,14 +279,48 @@ node bin/${spec.name}.mjs doctor --json
|
|
|
127
279
|
\`\`\`
|
|
128
280
|
${spec.auth === 'self-host'
|
|
129
281
|
? `
|
|
130
|
-
### Run the
|
|
282
|
+
### Run the server
|
|
131
283
|
|
|
132
|
-
This project is
|
|
133
|
-
|
|
284
|
+
This project is self-hosted, so it ships its own server — \`server.mjs\` in this
|
|
285
|
+
directory. It serves three things:
|
|
286
|
+
|
|
287
|
+
| | |
|
|
288
|
+
|---|---|
|
|
289
|
+
| Auth | the device-code endpoints \`login\` talks to (from \`@invokable/server\`) |
|
|
290
|
+
| Checkpoints | issuing and verifying approval fingerprints (from \`@invokable/server\`) |
|
|
291
|
+
| \`/v1/${spec.command}\` | **yours** — replace with the real thing |
|
|
134
292
|
|
|
135
293
|
\`\`\`bash
|
|
136
|
-
|
|
294
|
+
npm run server # terminal 1, on :8787
|
|
295
|
+
npm run build
|
|
296
|
+
node bin/${spec.name}.mjs login # terminal 2
|
|
137
297
|
\`\`\`
|
|
298
|
+
|
|
299
|
+
\`login\` prints a code and a URL. Open the URL, approve, and the CLI finishes on
|
|
300
|
+
its own.
|
|
301
|
+
|
|
302
|
+
### Before this is production
|
|
303
|
+
|
|
304
|
+
\`server.mjs\` is wired for a laptop. Three things must change, and each is
|
|
305
|
+
marked in the file:
|
|
306
|
+
|
|
307
|
+
- **\`requireSession\`** returns a fixed user. Replace it with your own session
|
|
308
|
+
lookup — a cookie, a JWT, whatever you already have. Returning \`null\` means
|
|
309
|
+
signed out, and nothing can be approved.
|
|
310
|
+
- **\`memoryStore()\` and \`memoryCheckpointStore()\`** lose everything on
|
|
311
|
+
restart, and on serverless there is no shared memory at all. Swap for
|
|
312
|
+
\`postgresAuthStore()\` and \`postgresCheckpointStore()\`; see the
|
|
313
|
+
[\`@invokable/server\` README](https://www.npmjs.com/package/@invokable/server).
|
|
314
|
+
- **\`CHECKPOINT_SECRET\`** is a literal. Move it to your secret manager.
|
|
315
|
+
|
|
316
|
+
Two things the SDK deliberately leaves to you: CSRF protection on
|
|
317
|
+
\`/device/approve\` if you serve a cookie-authenticated form, and rate limiting
|
|
318
|
+
on \`/device/start\`.
|
|
319
|
+
|
|
320
|
+
Mounting in an app you already have? The handlers are
|
|
321
|
+
\`(Request) => Promise<Response | null>\` and return \`null\` for paths they do not
|
|
322
|
+
own, so they compose with your routes. \`@invokable/server/node\` adapts them to
|
|
323
|
+
Express.
|
|
138
324
|
`
|
|
139
325
|
: `
|
|
140
326
|
### Sign in
|
|
@@ -142,8 +328,15 @@ node bin/${spec.name}.mjs login
|
|
|
142
328
|
Auth points at \`${HOSTED_AUTH_URL}\`. Override for local development:
|
|
143
329
|
|
|
144
330
|
\`\`\`bash
|
|
145
|
-
${envPrefix}_AUTH=http://127.0.0.1:8787
|
|
331
|
+
${envPrefix}_AUTH=http://127.0.0.1:8787 \\
|
|
332
|
+
${envPrefix}_API=http://127.0.0.1:8787 \\
|
|
333
|
+
${envPrefix}_CONFIG_DIR=~/.${spec.name}-local \\
|
|
334
|
+
node bin/${spec.name}.mjs login
|
|
146
335
|
\`\`\`
|
|
336
|
+
|
|
337
|
+
Set \`${envPrefix}_CONFIG_DIR\` whenever you point at a second environment.
|
|
338
|
+
Without it the local token is written over the one for
|
|
339
|
+
\`${HOSTED_AUTH_URL}\` — same file, and you are signed out of the real thing.
|
|
147
340
|
`}
|
|
148
341
|
## The contract
|
|
149
342
|
|
|
@@ -191,6 +384,7 @@ whenever you add a command; \`init --check\` fails CI when they are stale.
|
|
|
191
384
|
}
|
|
192
385
|
export function scaffold(spec) {
|
|
193
386
|
const version = spec.version ?? '0.1.0';
|
|
387
|
+
const sdk = sdkRange();
|
|
194
388
|
const pkg = {
|
|
195
389
|
name: spec.name,
|
|
196
390
|
version,
|
|
@@ -203,19 +397,22 @@ export function scaffold(spec) {
|
|
|
203
397
|
build: 'tsc -p tsconfig.json',
|
|
204
398
|
dev: 'tsc -p tsconfig.json --watch',
|
|
205
399
|
test: 'invokable-test node bin/' + spec.name + '.mjs',
|
|
400
|
+
...(spec.auth === 'self-host' ? { server: 'node server.mjs' } : {}),
|
|
206
401
|
prepublishOnly: 'npm run build',
|
|
207
402
|
},
|
|
208
403
|
dependencies: {
|
|
209
|
-
'@invokable/core':
|
|
210
|
-
'@invokable/skills':
|
|
404
|
+
'@invokable/core': sdk,
|
|
405
|
+
'@invokable/skills': sdk,
|
|
406
|
+
// Only self-host projects ship a server; hosted tools talk to one.
|
|
407
|
+
...(spec.auth === 'self-host' ? { '@invokable/server': sdk } : {}),
|
|
211
408
|
},
|
|
212
409
|
devDependencies: {
|
|
213
|
-
'@invokable/conformance':
|
|
410
|
+
'@invokable/conformance': sdk,
|
|
214
411
|
'@types/node': '^22.0.0',
|
|
215
412
|
typescript: '^5.9.0',
|
|
216
413
|
},
|
|
217
414
|
};
|
|
218
|
-
|
|
415
|
+
const files = [
|
|
219
416
|
{ path: 'package.json', content: JSON.stringify(pkg, null, 2) + '\n' },
|
|
220
417
|
{
|
|
221
418
|
path: 'tsconfig.json',
|
|
@@ -279,5 +476,9 @@ jobs:
|
|
|
279
476
|
`,
|
|
280
477
|
},
|
|
281
478
|
];
|
|
479
|
+
if (spec.auth === 'self-host') {
|
|
480
|
+
files.push({ path: 'server.mjs', content: serverSource(spec), executable: true });
|
|
481
|
+
}
|
|
482
|
+
return files;
|
|
282
483
|
}
|
|
283
484
|
//# sourceMappingURL=template.js.map
|
package/dist/template.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK;SACT,KAAK,CAAC,eAAe,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACrD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAoBD,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAErD,SAAS,OAAO,CAAC,IAAkB;IACjC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAC3B,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,IAAI,CAAC,IAAI,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE;QAC/E,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,UAAU,CAAC,IAAkB;IACpC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE7D,8EAA8E;IAC9E,8EAA8E;IAC9E,wCAAwC;IACxC,MAAM,QAAQ,GAAG;uBACI,IAAI,CAAC,OAAO;YACvB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;;;;;;CAM/B,CAAC;IAEA,MAAM,KAAK,GAAG;MACV,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;;;;;;;;;;;;;;yCAcO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;iBAC5C,IAAI,CAAC,OAAO;;;;;;mBAMV,IAAI,CAAC,OAAO;oBACX,IAAI,CAAC,OAAO;;;4BAGJ,IAAI,CAAC,OAAO;;;sBAGlB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO;;;kCAGb,IAAI,CAAC,OAAO;;QAEtC,CAAC;IAEP,MAAM,KAAK,GAAG;MACV,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;;;;;;;;;;;kCAWA,IAAI,CAAC,OAAO;;QAEtC,CAAC;IAEP,OAAO,+BAA+B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;;;;EAIvE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;;WAElB,IAAI,CAAC,IAAI;;;;;2BAKO,SAAS,YAAY,OAAO;2BAC5B,SAAS,aAAa,OAAO
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"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"}
|