noodleseed-cli 0.1.11 → 0.1.12
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/agents.d.ts +3 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +231 -0
- package/dist/agents.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1102 -107
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/control-plane.d.ts +15 -1
- package/dist/control-plane.d.ts.map +1 -1
- package/dist/control-plane.js +90 -15
- package/dist/control-plane.js.map +1 -1
- package/dist/deploy.d.ts +3 -5
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +20 -7
- package/dist/deploy.js.map +1 -1
- package/dist/dev.d.ts +11 -5
- package/dist/dev.d.ts.map +1 -1
- package/dist/dev.js +7 -17
- package/dist/dev.js.map +1 -1
- package/dist/diagnostics.d.ts +9 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +10 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/doctor.d.ts +7 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +396 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/openapi-import.d.ts +12 -0
- package/dist/openapi-import.d.ts.map +1 -0
- package/dist/openapi-import.js +95 -0
- package/dist/openapi-import.js.map +1 -0
- package/dist/project.d.ts +45 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +252 -0
- package/dist/project.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.d.ts +2 -2
- package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.js +2 -2
- package/node_modules/@noodle-borg/service/dist/service.d.ts +6 -25
- package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service.js +219 -175
- package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts +2 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres.js +19 -78
- package/node_modules/@noodle-borg/service/dist/store/postgres.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store.d.ts +24 -12
- package/node_modules/@noodle-borg/service/dist/store.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store.js +18 -18
- package/node_modules/@noodle-borg/service/dist/store.js.map +1 -1
- package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts +2 -21
- package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts.map +1 -1
- package/node_modules/@noodle-borg/transport-http/dist/handler.js +14 -25
- package/node_modules/@noodle-borg/transport-http/dist/handler.js.map +1 -1
- package/node_modules/@noodle-borg/transport-http/dist/index.d.ts +1 -2
- package/node_modules/@noodle-borg/transport-http/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/transport-http/dist/index.js +0 -1
- package/node_modules/@noodle-borg/transport-http/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/transport-http/dist/logging.d.ts +1 -1
- package/node_modules/@noodle-borg/transport-http/dist/logging.js +1 -1
- package/package.json +1 -1
package/dist/project.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
3
|
+
import { DEFAULT_SERVICE_URL } from './deploy.js';
|
|
4
|
+
export function projectConfigPath(cwd = process.cwd()) {
|
|
5
|
+
return join(cwd, '.noodle', 'project.json');
|
|
6
|
+
}
|
|
7
|
+
export function projectDeploymentPath(cwd = process.cwd()) {
|
|
8
|
+
return join(cwd, '.noodle', 'deployment.json');
|
|
9
|
+
}
|
|
10
|
+
export function readProjectLink(cwd = process.cwd()) {
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(readFileSync(projectConfigPath(cwd), 'utf8'));
|
|
13
|
+
if (typeof parsed.entrypoint !== 'string' ||
|
|
14
|
+
typeof parsed.org !== 'string' ||
|
|
15
|
+
typeof parsed.app !== 'string' ||
|
|
16
|
+
typeof parsed.env !== 'string' ||
|
|
17
|
+
typeof parsed.serviceUrl !== 'string' ||
|
|
18
|
+
!isAccessMode(parsed.accessMode)) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
entrypoint: parsed.entrypoint,
|
|
23
|
+
org: parsed.org,
|
|
24
|
+
app: parsed.app,
|
|
25
|
+
env: parsed.env,
|
|
26
|
+
serviceUrl: parsed.serviceUrl,
|
|
27
|
+
accessMode: parsed.accessMode,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function writeProjectLink(options) {
|
|
35
|
+
const cwd = options.cwd ?? process.cwd();
|
|
36
|
+
const link = {
|
|
37
|
+
entrypoint: options.entrypoint ?? 'server.ts',
|
|
38
|
+
org: slug(options.org),
|
|
39
|
+
app: slug(options.app),
|
|
40
|
+
env: slug(options.env ?? 'prod'),
|
|
41
|
+
serviceUrl: options.serviceUrl ?? DEFAULT_SERVICE_URL,
|
|
42
|
+
accessMode: options.accessMode ?? 'owner-only',
|
|
43
|
+
};
|
|
44
|
+
const dir = join(cwd, '.noodle');
|
|
45
|
+
mkdirSync(dir, { recursive: true });
|
|
46
|
+
writeFileSync(projectConfigPath(cwd), `${JSON.stringify(link, null, 2)}\n`, { mode: 0o600 });
|
|
47
|
+
return link;
|
|
48
|
+
}
|
|
49
|
+
export function readProjectDeployment(cwd = process.cwd()) {
|
|
50
|
+
try {
|
|
51
|
+
const parsed = JSON.parse(readFileSync(projectDeploymentPath(cwd), 'utf8'));
|
|
52
|
+
if (typeof parsed.deploymentId !== 'string' ||
|
|
53
|
+
typeof parsed.url !== 'string' ||
|
|
54
|
+
typeof parsed.org !== 'string' ||
|
|
55
|
+
typeof parsed.app !== 'string' ||
|
|
56
|
+
typeof parsed.env !== 'string' ||
|
|
57
|
+
typeof parsed.serviceUrl !== 'string' ||
|
|
58
|
+
typeof parsed.createdAt !== 'string' ||
|
|
59
|
+
!isAccessMode(parsed.accessMode)) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
deploymentId: parsed.deploymentId,
|
|
64
|
+
url: parsed.url,
|
|
65
|
+
org: parsed.org,
|
|
66
|
+
app: parsed.app,
|
|
67
|
+
env: parsed.env,
|
|
68
|
+
accessMode: parsed.accessMode,
|
|
69
|
+
serviceUrl: parsed.serviceUrl,
|
|
70
|
+
createdAt: parsed.createdAt,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function writeProjectDeployment(deployment, cwd = process.cwd()) {
|
|
78
|
+
const dir = join(cwd, '.noodle');
|
|
79
|
+
mkdirSync(dir, { recursive: true });
|
|
80
|
+
const path = projectDeploymentPath(cwd);
|
|
81
|
+
writeFileSync(path, `${JSON.stringify(deployment, null, 2)}\n`, { mode: 0o600 });
|
|
82
|
+
chmodSync(path, 0o600);
|
|
83
|
+
return deployment;
|
|
84
|
+
}
|
|
85
|
+
export function initProject(options = {}) {
|
|
86
|
+
const dir = resolve(options.dir ?? '.');
|
|
87
|
+
const template = options.template ?? 'hello';
|
|
88
|
+
const name = slug(options.name ?? basename(dir) ?? 'noodle-app');
|
|
89
|
+
if (!isTemplate(template))
|
|
90
|
+
throw new Error('init: --template must be hello or http-api');
|
|
91
|
+
if (existsSync(dir)) {
|
|
92
|
+
const entries = readdirSync(dir).filter((entry) => entry !== '.DS_Store');
|
|
93
|
+
if (entries.length > 0 && options.force !== true) {
|
|
94
|
+
throw new Error('init: target directory is not empty; pass --force to add Noodle files anyway');
|
|
95
|
+
}
|
|
96
|
+
if (!statSync(dir).isDirectory())
|
|
97
|
+
throw new Error('init: target path is not a directory');
|
|
98
|
+
}
|
|
99
|
+
mkdirSync(join(dir, 'test'), { recursive: true });
|
|
100
|
+
const files = template === 'hello' ? helloFiles(name) : httpApiFiles(name);
|
|
101
|
+
for (const [path, content] of Object.entries(files)) {
|
|
102
|
+
const full = join(dir, path);
|
|
103
|
+
mkdirSync(dirname(full), { recursive: true });
|
|
104
|
+
writeFileSync(full, content);
|
|
105
|
+
}
|
|
106
|
+
return dir;
|
|
107
|
+
}
|
|
108
|
+
export function resolveLinkedEntrypoint(cwd = process.cwd()) {
|
|
109
|
+
const link = readProjectLink(cwd);
|
|
110
|
+
if (link === undefined)
|
|
111
|
+
return undefined;
|
|
112
|
+
const path = resolve(cwd, link.entrypoint);
|
|
113
|
+
return existsSync(path) ? path : undefined;
|
|
114
|
+
}
|
|
115
|
+
export function relativeEntrypoint(path, cwd = process.cwd()) {
|
|
116
|
+
const rel = relative(cwd, resolve(cwd, path));
|
|
117
|
+
return rel === '' ? basename(path) : rel;
|
|
118
|
+
}
|
|
119
|
+
function helloFiles(name) {
|
|
120
|
+
const serverName = manifestName(name);
|
|
121
|
+
return commonFiles(name, `import { server, z } from 'noodleseed-cli';
|
|
122
|
+
|
|
123
|
+
export default server('${serverName}', { title: '${title(name)}', version: '1.0.0' }).tool('greet', {
|
|
124
|
+
description: 'Greet a person by name.',
|
|
125
|
+
input: z.object({
|
|
126
|
+
name: z.string().default('world'),
|
|
127
|
+
}),
|
|
128
|
+
output: z.object({
|
|
129
|
+
message: z.string(),
|
|
130
|
+
}),
|
|
131
|
+
fulfil({ input }) {
|
|
132
|
+
return { message: \`Hello, \${input.name}!\` };
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
`);
|
|
136
|
+
}
|
|
137
|
+
function httpApiFiles(name) {
|
|
138
|
+
const serverName = manifestName(name);
|
|
139
|
+
return commonFiles(name, `import { connector, server, z } from 'noodleseed-cli';
|
|
140
|
+
|
|
141
|
+
const jsonplaceholder = connector('jsonplaceholder')
|
|
142
|
+
.version('1.0.0')
|
|
143
|
+
.http({
|
|
144
|
+
baseUrl: 'https://jsonplaceholder.typicode.com',
|
|
145
|
+
allowedOrigins: ['https://jsonplaceholder.typicode.com'],
|
|
146
|
+
operations: {
|
|
147
|
+
get_post: {
|
|
148
|
+
type: 'read',
|
|
149
|
+
method: 'GET',
|
|
150
|
+
path: '/posts/\${args.post_id}',
|
|
151
|
+
input: { post_id: { type: 'string', required: true } },
|
|
152
|
+
response: {
|
|
153
|
+
title: '\${response.json.title}',
|
|
154
|
+
body: '\${response.json.body}',
|
|
155
|
+
},
|
|
156
|
+
output: {
|
|
157
|
+
title: { type: 'string' },
|
|
158
|
+
body: { type: 'string' },
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
export default server('${serverName}', { title: '${title(name)}', version: '1.0.0' })
|
|
165
|
+
.use({ posts: jsonplaceholder })
|
|
166
|
+
.tool('get_post', {
|
|
167
|
+
description: 'Fetch a post from JSONPlaceholder.',
|
|
168
|
+
input: z.object({
|
|
169
|
+
post_id: z.string().default('1'),
|
|
170
|
+
}),
|
|
171
|
+
output: z.object({
|
|
172
|
+
title: z.string(),
|
|
173
|
+
body: z.string(),
|
|
174
|
+
}),
|
|
175
|
+
fulfil({ input, connectors }) {
|
|
176
|
+
const post = connectors.posts.getPost({ post_id: input.post_id });
|
|
177
|
+
return { title: post.title, body: post.body };
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
`);
|
|
181
|
+
}
|
|
182
|
+
function commonFiles(name, serverTs) {
|
|
183
|
+
return {
|
|
184
|
+
'server.ts': serverTs,
|
|
185
|
+
'package.json': `${JSON.stringify({
|
|
186
|
+
name,
|
|
187
|
+
version: '0.1.0',
|
|
188
|
+
private: true,
|
|
189
|
+
type: 'module',
|
|
190
|
+
scripts: {
|
|
191
|
+
validate: 'noodle validate',
|
|
192
|
+
dev: 'noodle dev',
|
|
193
|
+
deploy: 'noodle deploy',
|
|
194
|
+
},
|
|
195
|
+
devDependencies: {
|
|
196
|
+
'noodleseed-cli': 'latest',
|
|
197
|
+
},
|
|
198
|
+
}, null, 2)}\n`,
|
|
199
|
+
'test/server.test.ts': `import { describe, expect, it } from 'vitest';
|
|
200
|
+
import app from '../server.js';
|
|
201
|
+
|
|
202
|
+
describe('${name}', () => {
|
|
203
|
+
it('exports a Noodle server definition', () => {
|
|
204
|
+
expect(typeof app.toManifest).toBe('function');
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
`,
|
|
208
|
+
'.gitignore': ['node_modules', 'dist', '.env.noodle', '.env.*', '.noodle/', ''].join('\n'),
|
|
209
|
+
'README.md': `# ${title(name)}
|
|
210
|
+
|
|
211
|
+
## Run locally
|
|
212
|
+
|
|
213
|
+
\`\`\`sh
|
|
214
|
+
noodle link --org <org> --app ${name}
|
|
215
|
+
noodle validate
|
|
216
|
+
noodle dev
|
|
217
|
+
\`\`\`
|
|
218
|
+
|
|
219
|
+
## Deploy
|
|
220
|
+
|
|
221
|
+
\`\`\`sh
|
|
222
|
+
noodle deploy
|
|
223
|
+
\`\`\`
|
|
224
|
+
|
|
225
|
+
Put local managed secrets and variables in \`.env.noodle\` with \`noodle secrets set\` and
|
|
226
|
+
\`noodle vars set\`. The file is ignored by git and must not contain values you intend to share.
|
|
227
|
+
`,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function isTemplate(value) {
|
|
231
|
+
return value === 'hello' || value === 'http-api';
|
|
232
|
+
}
|
|
233
|
+
function isAccessMode(value) {
|
|
234
|
+
return value === 'owner-only' || value === 'org-members';
|
|
235
|
+
}
|
|
236
|
+
function slug(value) {
|
|
237
|
+
return (value
|
|
238
|
+
.toLowerCase()
|
|
239
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
240
|
+
.replace(/^-+|-+$/g, '') || 'app');
|
|
241
|
+
}
|
|
242
|
+
function title(value) {
|
|
243
|
+
return value
|
|
244
|
+
.split('-')
|
|
245
|
+
.filter(Boolean)
|
|
246
|
+
.map((part) => `${part[0]?.toUpperCase() ?? ''}${part.slice(1)}`)
|
|
247
|
+
.join(' ');
|
|
248
|
+
}
|
|
249
|
+
function manifestName(value) {
|
|
250
|
+
return value.replace(/-/g, '_');
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,8 +74,8 @@ export interface WrappingMasterKey {
|
|
|
74
74
|
export declare function staticMasterKeyProvider(base64Key: string, keyId?: string): StaticMasterKey;
|
|
75
75
|
/**
|
|
76
76
|
* Reversible envelope encryption for secret values at rest (Slice 26, ADR 0028; KEK custody ADR 0037).
|
|
77
|
-
*
|
|
78
|
-
*
|
|
77
|
+
* Connector secrets must be reproduced verbatim to send downstream, so they are **encrypted, not hashed**.
|
|
78
|
+
* AES-256-GCM via
|
|
79
79
|
* `node:crypto`, a fresh random IV per seal, and the GCM tag authenticates the ciphertext.
|
|
80
80
|
*
|
|
81
81
|
* `seal`/`open` are **async** because a wrapping (KMS) provider round-trips to the custodian; a static
|
|
@@ -23,8 +23,8 @@ export function staticMasterKeyProvider(base64Key, keyId = 'static') {
|
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
25
|
* Reversible envelope encryption for secret values at rest (Slice 26, ADR 0028; KEK custody ADR 0037).
|
|
26
|
-
*
|
|
27
|
-
*
|
|
26
|
+
* Connector secrets must be reproduced verbatim to send downstream, so they are **encrypted, not hashed**.
|
|
27
|
+
* AES-256-GCM via
|
|
28
28
|
* `node:crypto`, a fresh random IV per seal, and the GCM tag authenticates the ciphertext.
|
|
29
29
|
*
|
|
30
30
|
* `seal`/`open` are **async** because a wrapping (KMS) provider round-trips to the custodian; a static
|
|
@@ -5,7 +5,7 @@ import { type AccessMode, type Logger, type OwnerTokenVerifier, type ServedTarge
|
|
|
5
5
|
import { type ControlPlaneIdentity, type DeployAuthGate, type GoogleIdTokenVerifier } from './auth/deploy-gate.js';
|
|
6
6
|
import type { GoogleAuthenticator } from './oauth/google.js';
|
|
7
7
|
import type { CloudSqlConfig } from './store/cloudsql-pool.js';
|
|
8
|
-
import { type ArtifactStore, type ConfigStore, type ControlPlaneStore, type DeploymentSummary, type TenantRef } from './store.js';
|
|
8
|
+
import { type ArtifactStore, type ConfigStore, type ControlPlaneStore, type DeploymentStatus, type DeploymentSummary, type DeployRecord, type TenantRef } from './store.js';
|
|
9
9
|
/** A deploy error from compiling either the connector catalog or the manifest. */
|
|
10
10
|
export interface DeployError {
|
|
11
11
|
readonly code: string;
|
|
@@ -15,16 +15,7 @@ export interface DeployError {
|
|
|
15
15
|
export type DeployResult = {
|
|
16
16
|
readonly ok: true;
|
|
17
17
|
readonly deploymentId: string;
|
|
18
|
-
readonly accessMode
|
|
19
|
-
/** The once-shown caller key, present only for `caller-key` deployments (identity modes mint none). */
|
|
20
|
-
readonly callerKey?: string;
|
|
21
|
-
/**
|
|
22
|
-
* True when this deploy **reused** the prior active deployment's caller key instead of minting a new
|
|
23
|
-
* one (so `callerKey` is absent — the hash-only key was kept). Set only via the in-process
|
|
24
|
-
* `reuseCallerKey` path used by `noodle dev`; the HTTP deploy route never reuses, so production
|
|
25
|
-
* keeps rotating the caller key on every redeploy.
|
|
26
|
-
*/
|
|
27
|
-
readonly callerKeyReused?: boolean;
|
|
18
|
+
readonly accessMode?: AccessMode;
|
|
28
19
|
} | {
|
|
29
20
|
readonly ok: false;
|
|
30
21
|
readonly errors: readonly DeployError[];
|
|
@@ -61,17 +52,10 @@ export declare class ServerRegistry {
|
|
|
61
52
|
* constructs this directly is responsible for the same pairing.
|
|
62
53
|
*/
|
|
63
54
|
constructor(store?: ArtifactStore, _secretBox?: SecretBox, configStore?: ConfigStore);
|
|
64
|
-
deploy(tenant: TenantRef, manifest: string, connectors?: string, actor?: ControlPlaneIdentity, accessMode?: AccessMode
|
|
65
|
-
/**
|
|
66
|
-
* When true and a prior active deployment exists for this tenant, reuse its caller-key **hash** instead
|
|
67
|
-
* of minting a new key (the plaintext is unrecoverable, so none is returned). Used by `noodle dev`
|
|
68
|
-
* to keep the local key stable across hot-reloads; the HTTP deploy route never sets it, so production
|
|
69
|
-
* redeploys keep rotating the key.
|
|
70
|
-
*/
|
|
71
|
-
reuseCallerKey?: boolean): Promise<DeployResult>;
|
|
55
|
+
deploy(tenant: TenantRef, manifest: string, connectors?: string, actor?: ControlPlaneIdentity, accessMode?: AccessMode): Promise<DeployResult>;
|
|
72
56
|
/**
|
|
73
57
|
* Rebuild every persisted server into memory on startup. Each record is replayed through the same
|
|
74
|
-
* compile path as a fresh deploy, reusing its stored id and
|
|
58
|
+
* compile path as a fresh deploy, reusing its stored id and access metadata. A record that no longer
|
|
75
59
|
* compiles (e.g. source/catalog drift) is skipped and reported — the remaining servers still recover.
|
|
76
60
|
*/
|
|
77
61
|
recover(): Promise<RecoverResult>;
|
|
@@ -91,11 +75,8 @@ export declare class ServerRegistry {
|
|
|
91
75
|
app?: string;
|
|
92
76
|
env?: string;
|
|
93
77
|
}): Promise<readonly DeploymentSummary[]>;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
deployment: DeploymentSummary;
|
|
97
|
-
} | undefined>;
|
|
98
|
-
verifyActiveCallerKey(tenant: TenantRef, token: string | null): Promise<boolean>;
|
|
78
|
+
getStatus(ref: TenantRef, baseUrl: string): Promise<DeploymentStatus | undefined>;
|
|
79
|
+
updateAccess(ref: TenantRef, accessMode: AccessMode): Promise<DeployRecord | undefined>;
|
|
99
80
|
get configStore(): ConfigStore;
|
|
100
81
|
get size(): number;
|
|
101
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjG,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAML,SAAS,EAEV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,UAAU,EAMf,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|