create-maestro-app 0.0.2
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 +193 -0
- package/README.md +62 -0
- package/dist/args.d.ts +28 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +102 -0
- package/dist/args.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +76 -0
- package/dist/bin.js.map +1 -0
- package/dist/capabilities.d.ts +55 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +75 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/commands.d.ts +17 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +19 -0
- package/dist/commands.js.map +1 -0
- package/dist/credentials.d.ts +34 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +72 -0
- package/dist/credentials.js.map +1 -0
- package/dist/flow.d.ts +37 -0
- package/dist/flow.d.ts.map +1 -0
- package/dist/flow.js +177 -0
- package/dist/flow.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/io.d.ts +29 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +79 -0
- package/dist/io.js.map +1 -0
- package/dist/platform-client.d.ts +64 -0
- package/dist/platform-client.d.ts.map +1 -0
- package/dist/platform-client.js +76 -0
- package/dist/platform-client.js.map +1 -0
- package/dist/project.d.ts +26 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +40 -0
- package/dist/project.js.map +1 -0
- package/dist/scaffold.d.ts +36 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +67 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/session.d.ts +24 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +73 -0
- package/dist/session.js.map +1 -0
- package/package.json +34 -0
- package/templates/app/README.md +44 -0
- package/templates/app/_env.example +5 -0
- package/templates/app/_gitignore +15 -0
- package/templates/app/index.html +12 -0
- package/templates/app/maestro.config.ts +13 -0
- package/templates/app/package.json +25 -0
- package/templates/app/src/App.vue +19 -0
- package/templates/app/src/main.ts +6 -0
- package/templates/app/src/vite-env.d.ts +11 -0
- package/templates/app/tsconfig.json +17 -0
- package/templates/app/vite.config.ts +17 -0
package/dist/commands.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
export class SpawnRunner {
|
|
3
|
+
run(command, args, cwd) {
|
|
4
|
+
return new Promise((resolve) => {
|
|
5
|
+
const child = spawn(command, args, { cwd, stdio: 'inherit' });
|
|
6
|
+
child.on('error', () => resolve(false));
|
|
7
|
+
child.on('close', (code) => resolve(code === 0));
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
has(command) {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
const probe = process.platform === 'win32' ? 'where' : 'which';
|
|
13
|
+
const child = spawn(probe, [command], { stdio: 'ignore' });
|
|
14
|
+
child.on('error', () => resolve(false));
|
|
15
|
+
child.on('close', (code) => resolve(code === 0));
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAe3C,MAAM,OAAO,WAAW;IACtB,GAAG,CAAC,OAAe,EAAE,IAAc,EAAE,GAAW;QAC9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC9D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local CLI session store (spec 18 US-18.2). Holds one entry per hosted platform
|
|
3
|
+
* `baseUrl`, keeping only the **refresh token** on disk (the access token stays
|
|
4
|
+
* in memory). The file is written `0600`. The `kind` discriminator lets a future
|
|
5
|
+
* operator PAT / device-code token (spec 18 §Out of scope) reuse this shape
|
|
6
|
+
* without a UX change.
|
|
7
|
+
*/
|
|
8
|
+
export interface StoredSession {
|
|
9
|
+
kind: 'operator_refresh';
|
|
10
|
+
refreshToken: string;
|
|
11
|
+
operator?: {
|
|
12
|
+
id: string;
|
|
13
|
+
email: string;
|
|
14
|
+
name: string;
|
|
15
|
+
};
|
|
16
|
+
updatedAt: string;
|
|
17
|
+
}
|
|
18
|
+
/** Normalize a baseUrl so `https://x/` and `https://x` key the same session. */
|
|
19
|
+
export declare function normalizeBaseUrl(baseUrl: string): string;
|
|
20
|
+
export declare function defaultCredentialPath(): string;
|
|
21
|
+
/**
|
|
22
|
+
* The credential store. Pass an explicit `filePath` in tests; production uses
|
|
23
|
+
* `defaultCredentialPath()`.
|
|
24
|
+
*/
|
|
25
|
+
export declare class CredentialStore {
|
|
26
|
+
private readonly filePath;
|
|
27
|
+
constructor(filePath?: string);
|
|
28
|
+
private readAll;
|
|
29
|
+
private writeAll;
|
|
30
|
+
get(baseUrl: string): Promise<StoredSession | undefined>;
|
|
31
|
+
set(baseUrl: string, session: Omit<StoredSession, 'updatedAt'>): Promise<void>;
|
|
32
|
+
clear(baseUrl: string): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,kBAAkB,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;GAGG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,MAAgC;YAEzD,OAAO;YAoBP,QAAQ;IAQhB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAKxD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9E,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAS5C"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { chmod, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
const EMPTY = { version: 1, sessions: {} };
|
|
5
|
+
/** Normalize a baseUrl so `https://x/` and `https://x` key the same session. */
|
|
6
|
+
export function normalizeBaseUrl(baseUrl) {
|
|
7
|
+
return baseUrl.trim().replace(/\/+$/, '');
|
|
8
|
+
}
|
|
9
|
+
export function defaultCredentialPath() {
|
|
10
|
+
return join(homedir(), '.maestro', 'credentials.json');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The credential store. Pass an explicit `filePath` in tests; production uses
|
|
14
|
+
* `defaultCredentialPath()`.
|
|
15
|
+
*/
|
|
16
|
+
export class CredentialStore {
|
|
17
|
+
filePath;
|
|
18
|
+
constructor(filePath = defaultCredentialPath()) {
|
|
19
|
+
this.filePath = filePath;
|
|
20
|
+
}
|
|
21
|
+
async readAll() {
|
|
22
|
+
let raw;
|
|
23
|
+
try {
|
|
24
|
+
raw = await readFile(this.filePath, 'utf8');
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
if (err.code === 'ENOENT')
|
|
28
|
+
return { ...EMPTY, sessions: {} };
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const parsed = JSON.parse(raw);
|
|
33
|
+
if (parsed.version !== 1 || typeof parsed.sessions !== 'object' || parsed.sessions === null) {
|
|
34
|
+
return { ...EMPTY, sessions: {} };
|
|
35
|
+
}
|
|
36
|
+
return { version: 1, sessions: parsed.sessions };
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// A corrupt file must not brick the CLI — treat it as empty.
|
|
40
|
+
return { ...EMPTY, sessions: {} };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async writeAll(data) {
|
|
44
|
+
await mkdir(dirname(this.filePath), { recursive: true, mode: 0o700 });
|
|
45
|
+
// Create with 0600 up-front (mode on writeFile applies only on create), then
|
|
46
|
+
// chmod to enforce it even if the file already existed with looser perms.
|
|
47
|
+
await writeFile(this.filePath, JSON.stringify(data, null, 2) + '\n', { mode: 0o600 });
|
|
48
|
+
await chmod(this.filePath, 0o600);
|
|
49
|
+
}
|
|
50
|
+
async get(baseUrl) {
|
|
51
|
+
const all = await this.readAll();
|
|
52
|
+
return all.sessions[normalizeBaseUrl(baseUrl)];
|
|
53
|
+
}
|
|
54
|
+
async set(baseUrl, session) {
|
|
55
|
+
const all = await this.readAll();
|
|
56
|
+
all.sessions[normalizeBaseUrl(baseUrl)] = {
|
|
57
|
+
...session,
|
|
58
|
+
updatedAt: new Date().toISOString(),
|
|
59
|
+
};
|
|
60
|
+
await this.writeAll(all);
|
|
61
|
+
}
|
|
62
|
+
async clear(baseUrl) {
|
|
63
|
+
const all = await this.readAll();
|
|
64
|
+
delete all.sessions[normalizeBaseUrl(baseUrl)];
|
|
65
|
+
if (Object.keys(all.sessions).length === 0) {
|
|
66
|
+
await rm(this.filePath, { force: true });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
await this.writeAll(all);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/flow.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { CliArgs } from './args.js';
|
|
2
|
+
import type { CommandRunner } from './commands.js';
|
|
3
|
+
import type { Io } from './io.js';
|
|
4
|
+
import type { CreatedApp, PlatformClient } from './platform-client.js';
|
|
5
|
+
import type { SessionManager } from './session.js';
|
|
6
|
+
/** Default hosted Core (overridable with `--api-url`). */
|
|
7
|
+
export declare const DEFAULT_API_URL = "https://api.maestro.app";
|
|
8
|
+
/** Where to manage the created App. */
|
|
9
|
+
export declare const ADMIN_CONSOLE_URL = "https://admin.maestro.app";
|
|
10
|
+
export interface CreateDeps {
|
|
11
|
+
io: Io;
|
|
12
|
+
platform: PlatformClient;
|
|
13
|
+
session: SessionManager;
|
|
14
|
+
/** Absolute path to `packages/create-app/templates`. */
|
|
15
|
+
templatesRoot: string;
|
|
16
|
+
/** Base directory a relative target dir resolves against. */
|
|
17
|
+
cwd: string;
|
|
18
|
+
/** Runs `pnpm install` / `git init`; omit to skip both (e.g. in tests). */
|
|
19
|
+
runner?: CommandRunner;
|
|
20
|
+
}
|
|
21
|
+
export interface CreateResult {
|
|
22
|
+
targetDir: string;
|
|
23
|
+
app: Pick<CreatedApp, 'key' | 'name'> | {
|
|
24
|
+
key: string;
|
|
25
|
+
name: string;
|
|
26
|
+
};
|
|
27
|
+
/** Blueprints applied to the App, in order (base first). */
|
|
28
|
+
blueprints: string[];
|
|
29
|
+
files: string[];
|
|
30
|
+
dryRun: boolean;
|
|
31
|
+
packageManager: string;
|
|
32
|
+
installed: boolean;
|
|
33
|
+
gitInitialized: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** The end-to-end scaffold flow (spec 18 US-18.1–18.5). */
|
|
36
|
+
export declare function runCreate(args: CliArgs, deps: CreateDeps): Promise<CreateResult>;
|
|
37
|
+
//# sourceMappingURL=flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../src/flow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,0DAA0D;AAC1D,eAAO,MAAM,eAAe,4BAA4B,CAAC;AACzD,uCAAuC;AACvC,eAAO,MAAM,iBAAiB,8BAA8B,CAAC;AAI7D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AA0ED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,4DAA4D;IAC5D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB;AAmED,2DAA2D;AAC3D,wBAAsB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAyDtF"}
|
package/dist/flow.js
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { readdir } from 'node:fs/promises';
|
|
2
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
import { capabilitiesFromCatalog, resolveSelection, SAAS_BASE_KEY, } from './capabilities.js';
|
|
4
|
+
import { PlatformRequestError } from './platform-client.js';
|
|
5
|
+
import { buildProjectVars, deriveAppKey, isValidAppKey, renderDotEnv } from './project.js';
|
|
6
|
+
import { scaffoldProject } from './scaffold.js';
|
|
7
|
+
/** Default hosted Core (overridable with `--api-url`). */
|
|
8
|
+
export const DEFAULT_API_URL = 'https://api.maestro.app';
|
|
9
|
+
/** Where to manage the created App. */
|
|
10
|
+
export const ADMIN_CONSOLE_URL = 'https://admin.maestro.app';
|
|
11
|
+
/** The single integrated client template the CLI scaffolds. */
|
|
12
|
+
const TEMPLATE_DIR = 'app';
|
|
13
|
+
async function dirIsEmpty(dir) {
|
|
14
|
+
try {
|
|
15
|
+
const entries = await readdir(dir);
|
|
16
|
+
return entries.length === 0;
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
if (err.code === 'ENOENT')
|
|
20
|
+
return true;
|
|
21
|
+
throw err;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Ensure a usable operator access token, prompting login if needed (US-18.2). */
|
|
25
|
+
async function ensureAccessToken(deps, args) {
|
|
26
|
+
const existing = await deps.session.getAccessToken();
|
|
27
|
+
if (existing)
|
|
28
|
+
return existing;
|
|
29
|
+
if (args.yes) {
|
|
30
|
+
throw new Error('No cached Maestro session. Run `maestro login` first (a login prompt is skipped in --yes mode).');
|
|
31
|
+
}
|
|
32
|
+
deps.io.log('Sign in to the hosted Maestro platform to create your App.');
|
|
33
|
+
const email = await deps.io.text('Operator email');
|
|
34
|
+
const password = await deps.io.password('Password');
|
|
35
|
+
const session = await deps.session.signIn(email, password);
|
|
36
|
+
deps.io.log(`Signed in as ${session.operator.email}.`);
|
|
37
|
+
return session.accessToken;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Pick the capabilities and resolve their blueprint dependencies (US-18.3/18.6).
|
|
41
|
+
* Multiple capabilities compose into ONE integrated app; account-requiring
|
|
42
|
+
* products pull in the saas base automatically (spec 18 §Capabilities).
|
|
43
|
+
*/
|
|
44
|
+
async function pickSelection(deps, args, accessToken) {
|
|
45
|
+
const catalog = await deps.platform.listTemplates(accessToken);
|
|
46
|
+
const capabilities = capabilitiesFromCatalog(catalog);
|
|
47
|
+
let selected;
|
|
48
|
+
if (args.capabilities && args.capabilities.length > 0) {
|
|
49
|
+
selected = args.capabilities;
|
|
50
|
+
}
|
|
51
|
+
else if (args.yes) {
|
|
52
|
+
selected = catalog.some((t) => t.key === SAAS_BASE_KEY)
|
|
53
|
+
? [SAAS_BASE_KEY]
|
|
54
|
+
: catalog[0]
|
|
55
|
+
? [catalog[0].key]
|
|
56
|
+
: [];
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
selected = await deps.io.multiselect('Which capabilities? (products requiring accounts pull in the SaaS base)', capabilities.map((c) => ({ value: c.templateKey, label: c.label })));
|
|
60
|
+
}
|
|
61
|
+
const selection = resolveSelection(selected, catalog);
|
|
62
|
+
if (selection.autoAddedSaas) {
|
|
63
|
+
deps.io.log('Added the SaaS account base (required by a selected product).');
|
|
64
|
+
}
|
|
65
|
+
return { selection, catalog };
|
|
66
|
+
}
|
|
67
|
+
/** Confirm the integrated client template exists on disk. */
|
|
68
|
+
async function assertTemplate(templatesRoot) {
|
|
69
|
+
const dir = join(templatesRoot, TEMPLATE_DIR);
|
|
70
|
+
if (await dirIsEmpty(dir)) {
|
|
71
|
+
throw new Error(`The client template is missing from this CLI build (${dir}).`);
|
|
72
|
+
}
|
|
73
|
+
return dir;
|
|
74
|
+
}
|
|
75
|
+
/** Best-effort `pnpm install` (US-18.1) — a failure warns, never aborts. */
|
|
76
|
+
async function installDeps(deps, args, targetDir, pm) {
|
|
77
|
+
if (!args.install || !deps.runner)
|
|
78
|
+
return false;
|
|
79
|
+
deps.io.log(`Installing dependencies with ${pm}…`);
|
|
80
|
+
const ok = await deps.runner.run(pm, ['install'], targetDir);
|
|
81
|
+
if (!ok)
|
|
82
|
+
deps.io.error(`\`${pm} install\` failed — run it yourself in ${targetDir}.`);
|
|
83
|
+
return ok;
|
|
84
|
+
}
|
|
85
|
+
/** Best-effort `git init` + initial commit (US-18.1). */
|
|
86
|
+
async function initGit(deps, args, targetDir) {
|
|
87
|
+
if (!args.git || !deps.runner)
|
|
88
|
+
return false;
|
|
89
|
+
if (!(await deps.runner.has('git')))
|
|
90
|
+
return false;
|
|
91
|
+
const init = await deps.runner.run('git', ['init', '-q'], targetDir);
|
|
92
|
+
if (!init)
|
|
93
|
+
return false;
|
|
94
|
+
await deps.runner.run('git', ['add', '-A'], targetDir);
|
|
95
|
+
await deps.runner.run('git', ['commit', '-q', '-m', 'Initial commit from create-maestro-app'], targetDir);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
/** Create the App with the base blueprint, then apply the rest onto it. */
|
|
99
|
+
async function provisionApp(deps, accessToken, appKey, appName, selection, seed) {
|
|
100
|
+
const [base, ...rest] = selection.ordered;
|
|
101
|
+
try {
|
|
102
|
+
await deps.platform.createApp(accessToken, {
|
|
103
|
+
key: appKey,
|
|
104
|
+
name: appName,
|
|
105
|
+
templateKey: base,
|
|
106
|
+
seed,
|
|
107
|
+
});
|
|
108
|
+
deps.io.log(`Created App "${appKey}" (${base ?? 'empty'}).`);
|
|
109
|
+
for (const templateKey of rest) {
|
|
110
|
+
await deps.platform.applyTemplate(accessToken, appKey, {
|
|
111
|
+
templateKey,
|
|
112
|
+
seed,
|
|
113
|
+
onConflict: 'skip',
|
|
114
|
+
});
|
|
115
|
+
deps.io.log(`Applied "${templateKey}".`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
if (err instanceof PlatformRequestError) {
|
|
120
|
+
throw new Error(`Could not provision App "${appKey}": ${err.error.code} — ${err.error.message}`);
|
|
121
|
+
}
|
|
122
|
+
throw err;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** The end-to-end scaffold flow (spec 18 US-18.1–18.5). */
|
|
126
|
+
export async function runCreate(args, deps) {
|
|
127
|
+
// 1. Target directory.
|
|
128
|
+
const dirInput = args.dir ?? (args.yes ? undefined : await deps.io.text('Project directory', 'my-maestro-app'));
|
|
129
|
+
if (!dirInput)
|
|
130
|
+
throw new Error('A project directory is required.');
|
|
131
|
+
const targetDir = isAbsolute(dirInput) ? dirInput : resolve(deps.cwd, dirInput);
|
|
132
|
+
if (!args.force && !(await dirIsEmpty(targetDir))) {
|
|
133
|
+
throw new Error(`Target directory is not empty: ${targetDir} (use --force to override).`);
|
|
134
|
+
}
|
|
135
|
+
// 2. Auth against the hosted platform.
|
|
136
|
+
const accessToken = await ensureAccessToken(deps, args);
|
|
137
|
+
// 3. Capabilities → dependency-resolved blueprint list.
|
|
138
|
+
const { selection } = await pickSelection(deps, args, accessToken);
|
|
139
|
+
const templateDir = await assertTemplate(deps.templatesRoot);
|
|
140
|
+
// 4. App identity.
|
|
141
|
+
const projectName = dirInput.split('/').pop() ?? dirInput;
|
|
142
|
+
const appKey = args.appKey ?? deriveAppKey(projectName);
|
|
143
|
+
if (!isValidAppKey(appKey)) {
|
|
144
|
+
throw new Error(`Invalid app key "${appKey}" (snake_case, starts with a letter, 2–63 chars).`);
|
|
145
|
+
}
|
|
146
|
+
const appName = args.appName ?? projectName;
|
|
147
|
+
const apiUrl = (args.apiUrl ?? DEFAULT_API_URL).replace(/\/+$/, '');
|
|
148
|
+
const seed = args.seed ?? true;
|
|
149
|
+
// 5. Provision the App (create + apply extra blueprints) — skipped in dry-run.
|
|
150
|
+
if (!args.dryRun) {
|
|
151
|
+
await provisionApp(deps, accessToken, appKey, appName, selection, seed);
|
|
152
|
+
}
|
|
153
|
+
// 6. Scaffold the single integrated client project (driven by `/runtime`).
|
|
154
|
+
const vars = buildProjectVars({ projectName, appKey, appName, apiUrl });
|
|
155
|
+
const result = await scaffoldProject({
|
|
156
|
+
templateDir,
|
|
157
|
+
targetDir,
|
|
158
|
+
vars,
|
|
159
|
+
extraFiles: { '.env': renderDotEnv(vars) },
|
|
160
|
+
dryRun: args.dryRun,
|
|
161
|
+
});
|
|
162
|
+
// 7. Install deps + init git (skipped in dry-run and when no runner is wired).
|
|
163
|
+
const pm = args.pm ?? 'pnpm';
|
|
164
|
+
const installed = args.dryRun ? false : await installDeps(deps, args, targetDir, pm);
|
|
165
|
+
const gitInitialized = args.dryRun ? false : await initGit(deps, args, targetDir);
|
|
166
|
+
return {
|
|
167
|
+
targetDir,
|
|
168
|
+
app: { key: appKey, name: appName },
|
|
169
|
+
blueprints: selection.ordered,
|
|
170
|
+
files: result.files.map((f) => f.path),
|
|
171
|
+
dryRun: args.dryRun,
|
|
172
|
+
packageManager: pm,
|
|
173
|
+
installed,
|
|
174
|
+
gitInitialized,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=flow.js.map
|
package/dist/flow.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../src/flow.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { parseArgs, type CliArgs } from './args.js';
|
|
2
|
+
export { capabilitiesFromCatalog, capabilityKind, resolveSelection, SAAS_BASE_KEY, SITE_KEY, type Capability, type CapabilityKind, type CatalogTemplate, type ResolvedSelection, } from './capabilities.js';
|
|
3
|
+
export { CredentialStore, defaultCredentialPath, normalizeBaseUrl } from './credentials.js';
|
|
4
|
+
export { PlatformClient, PlatformRequestError, type CreatedApp, type OperatorSession, } from './platform-client.js';
|
|
5
|
+
export { SessionManager } from './session.js';
|
|
6
|
+
export { buildProjectVars, deriveAppKey, isValidAppKey, renderDotEnv, type ProjectVars, } from './project.js';
|
|
7
|
+
export { scaffoldProject, substitute, type ScaffoldResult } from './scaffold.js';
|
|
8
|
+
export { ADMIN_CONSOLE_URL, DEFAULT_API_URL, runCreate, type CreateDeps, type CreateResult, } from './flow.js';
|
|
9
|
+
export { ReadlineIo, type Io } from './io.js';
|
|
10
|
+
export { SpawnRunner, type CommandRunner } from './commands.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,eAAe,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { parseArgs } from './args.js';
|
|
2
|
+
export { capabilitiesFromCatalog, capabilityKind, resolveSelection, SAAS_BASE_KEY, SITE_KEY, } from './capabilities.js';
|
|
3
|
+
export { CredentialStore, defaultCredentialPath, normalizeBaseUrl } from './credentials.js';
|
|
4
|
+
export { PlatformClient, PlatformRequestError, } from './platform-client.js';
|
|
5
|
+
export { SessionManager } from './session.js';
|
|
6
|
+
export { buildProjectVars, deriveAppKey, isValidAppKey, renderDotEnv, } from './project.js';
|
|
7
|
+
export { scaffoldProject, substitute } from './scaffold.js';
|
|
8
|
+
export { ADMIN_CONSOLE_URL, DEFAULT_API_URL, runCreate, } from './flow.js';
|
|
9
|
+
export { ReadlineIo } from './io.js';
|
|
10
|
+
export { SpawnRunner } from './commands.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,WAAW,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,QAAQ,GAKT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EACL,cAAc,EACd,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,YAAY,GAEb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAuB,MAAM,eAAe,CAAC;AACjF,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,SAAS,GAGV,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAW,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAsB,MAAM,eAAe,CAAC"}
|
package/dist/io.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CLI's I/O surface (spec 18). Abstracted behind an interface so the flow is
|
|
3
|
+
* testable with a scripted fake — the real implementation uses `node:readline`
|
|
4
|
+
* (zero-dep, per the initializer NFR).
|
|
5
|
+
*/
|
|
6
|
+
export interface Io {
|
|
7
|
+
log(message?: string): void;
|
|
8
|
+
error(message: string): void;
|
|
9
|
+
text(question: string, defaultValue?: string): Promise<string>;
|
|
10
|
+
password(question: string): Promise<string>;
|
|
11
|
+
/** Multi-select: returns the chosen values (may be empty). */
|
|
12
|
+
multiselect(question: string, choices: {
|
|
13
|
+
value: string;
|
|
14
|
+
label: string;
|
|
15
|
+
}[]): Promise<string[]>;
|
|
16
|
+
confirm(question: string, defaultValue: boolean): Promise<boolean>;
|
|
17
|
+
}
|
|
18
|
+
export declare class ReadlineIo implements Io {
|
|
19
|
+
log(message?: string): void;
|
|
20
|
+
error(message: string): void;
|
|
21
|
+
text(question: string, defaultValue?: string): Promise<string>;
|
|
22
|
+
password(question: string): Promise<string>;
|
|
23
|
+
multiselect(question: string, choices: {
|
|
24
|
+
value: string;
|
|
25
|
+
label: string;
|
|
26
|
+
}[]): Promise<string[]>;
|
|
27
|
+
confirm(question: string, defaultValue: boolean): Promise<boolean>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=io.d.ts.map
|
package/dist/io.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,WAAW,EAAE;IACjB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,8DAA8D;IAC9D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9F,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpE;AAED,qBAAa,UAAW,YAAW,EAAE;IACnC,GAAG,CAAC,OAAO,SAAK,GAAG,IAAI;IAIvB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAItB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsB3C,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GAC1C,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBd,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAWzE"}
|
package/dist/io.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline/promises';
|
|
2
|
+
import { stdin, stdout } from 'node:process';
|
|
3
|
+
export class ReadlineIo {
|
|
4
|
+
log(message = '') {
|
|
5
|
+
stdout.write(message + '\n');
|
|
6
|
+
}
|
|
7
|
+
error(message) {
|
|
8
|
+
process.stderr.write(message + '\n');
|
|
9
|
+
}
|
|
10
|
+
async text(question, defaultValue) {
|
|
11
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
12
|
+
try {
|
|
13
|
+
const suffix = defaultValue ? ` (${defaultValue})` : '';
|
|
14
|
+
const answer = (await rl.question(`${question}${suffix}: `)).trim();
|
|
15
|
+
return answer || defaultValue || '';
|
|
16
|
+
}
|
|
17
|
+
finally {
|
|
18
|
+
rl.close();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async password(question) {
|
|
22
|
+
// Mute echo while typing the password.
|
|
23
|
+
const rl = createInterface({ input: stdin, output: stdout, terminal: true });
|
|
24
|
+
const muteWrite = rl.output;
|
|
25
|
+
const original = muteWrite.write.bind(muteWrite);
|
|
26
|
+
let muted = false;
|
|
27
|
+
muteWrite.write = (chunk) => {
|
|
28
|
+
if (muted && chunk !== '\n' && chunk !== '\r\n')
|
|
29
|
+
return true;
|
|
30
|
+
return original(chunk);
|
|
31
|
+
};
|
|
32
|
+
try {
|
|
33
|
+
const promise = rl.question(`${question}: `);
|
|
34
|
+
muted = true;
|
|
35
|
+
const answer = await promise;
|
|
36
|
+
return answer;
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
muted = false;
|
|
40
|
+
rl.close();
|
|
41
|
+
stdout.write('\n');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async multiselect(question, choices) {
|
|
45
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
46
|
+
try {
|
|
47
|
+
this.log(question);
|
|
48
|
+
choices.forEach((choice, index) => this.log(` ${index + 1}) ${choice.label}`));
|
|
49
|
+
this.log('Enter numbers separated by commas (e.g. 1,3).');
|
|
50
|
+
for (;;) {
|
|
51
|
+
const raw = (await rl.question('Choose: ')).trim();
|
|
52
|
+
const picked = raw
|
|
53
|
+
.split(',')
|
|
54
|
+
.map((s) => Number.parseInt(s.trim(), 10) - 1)
|
|
55
|
+
.filter((i) => Number.isInteger(i) && i >= 0 && i < choices.length);
|
|
56
|
+
if (picked.length > 0)
|
|
57
|
+
return [...new Set(picked)].map((i) => choices[i].value);
|
|
58
|
+
this.error('Pick at least one valid number.');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
rl.close();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async confirm(question, defaultValue) {
|
|
66
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
67
|
+
try {
|
|
68
|
+
const hint = defaultValue ? 'Y/n' : 'y/N';
|
|
69
|
+
const answer = (await rl.question(`${question} (${hint}): `)).trim().toLowerCase();
|
|
70
|
+
if (!answer)
|
|
71
|
+
return defaultValue;
|
|
72
|
+
return answer === 'y' || answer === 'yes';
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
rl.close();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=io.js.map
|
package/dist/io.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { CatalogTemplate } from './capabilities.js';
|
|
2
|
+
/**
|
|
3
|
+
* Thin client for the hosted platform's non-app-scoped routes (spec 18 §CLI
|
|
4
|
+
* contract). The `/v1/platform/*` routes are not app-scoped, so they bypass the
|
|
5
|
+
* per-app `@bemaestro/sdk` client (mirrors `apps/app/src/lib/maestro-api.ts`).
|
|
6
|
+
* The CLI adds no new backend routes — every call here already exists.
|
|
7
|
+
*/
|
|
8
|
+
export interface PlatformError {
|
|
9
|
+
code: string;
|
|
10
|
+
message: string;
|
|
11
|
+
traceId?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class PlatformRequestError extends Error {
|
|
14
|
+
readonly status: number;
|
|
15
|
+
readonly error: PlatformError;
|
|
16
|
+
constructor(status: number, error: PlatformError);
|
|
17
|
+
}
|
|
18
|
+
export interface OperatorSession {
|
|
19
|
+
accessToken: string;
|
|
20
|
+
refreshToken: string;
|
|
21
|
+
operator: {
|
|
22
|
+
id: string;
|
|
23
|
+
email: string;
|
|
24
|
+
name: string;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export interface CreatedApp {
|
|
28
|
+
id: string;
|
|
29
|
+
key: string;
|
|
30
|
+
name: string;
|
|
31
|
+
status: string;
|
|
32
|
+
schemaVersion: number;
|
|
33
|
+
}
|
|
34
|
+
export type FetchImpl = typeof fetch;
|
|
35
|
+
interface PlatformClientOptions {
|
|
36
|
+
baseUrl: string;
|
|
37
|
+
fetchImpl?: FetchImpl;
|
|
38
|
+
}
|
|
39
|
+
export declare class PlatformClient {
|
|
40
|
+
private readonly baseUrl;
|
|
41
|
+
private readonly fetchImpl;
|
|
42
|
+
constructor(options: PlatformClientOptions);
|
|
43
|
+
private request;
|
|
44
|
+
login(email: string, password: string): Promise<OperatorSession>;
|
|
45
|
+
refresh(refreshToken: string): Promise<{
|
|
46
|
+
accessToken: string;
|
|
47
|
+
refreshToken: string;
|
|
48
|
+
}>;
|
|
49
|
+
logout(refreshToken: string): Promise<void>;
|
|
50
|
+
listTemplates(accessToken: string): Promise<CatalogTemplate[]>;
|
|
51
|
+
createApp(accessToken: string, input: {
|
|
52
|
+
key: string;
|
|
53
|
+
name: string;
|
|
54
|
+
templateKey?: string;
|
|
55
|
+
seed?: boolean;
|
|
56
|
+
}): Promise<CreatedApp>;
|
|
57
|
+
applyTemplate(accessToken: string, appKey: string, input: {
|
|
58
|
+
templateKey: string;
|
|
59
|
+
seed?: boolean;
|
|
60
|
+
onConflict?: 'abort' | 'skip';
|
|
61
|
+
}): Promise<unknown>;
|
|
62
|
+
}
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=platform-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-client.d.ts","sourceRoot":"","sources":["../src/platform-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;GAKG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAE3C,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,KAAK,EAAE,aAAa;gBADpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa;CAKhC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC;AAErC,UAAU,qBAAqB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAYD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,OAAO,EAAE,qBAAqB;YAK5B,OAAO;IAoBrB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAMhE,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAI/E,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAWpE,SAAS,CACP,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GACzE,OAAO,CAAC,UAAU,CAAC;IAStB,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;KAAE,GAC5E,OAAO,CAAC,OAAO,CAAC;CAMpB"}
|