@deploid/core 2.0.0 → 2.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.
@@ -0,0 +1,24 @@
1
+ import { type PipelineContext } from './pipeline.js';
2
+ import type { DeploidConfig } from './types.js';
3
+ export interface CommandRunOptions {
4
+ cwd?: string;
5
+ config?: DeploidConfig;
6
+ debug?: boolean;
7
+ contextExtras?: Record<string, unknown>;
8
+ }
9
+ export interface DoctorRunOptions extends CommandRunOptions {
10
+ doctorOptions?: {
11
+ json?: boolean;
12
+ markdown?: boolean;
13
+ ci?: boolean;
14
+ summary?: boolean;
15
+ verbose?: boolean;
16
+ projectOnly?: boolean;
17
+ fix?: boolean;
18
+ };
19
+ }
20
+ export declare function createFallbackConfig(): DeploidConfig;
21
+ export declare function loadConfigOptional(cwd?: string, fallback?: DeploidConfig): Promise<DeploidConfig>;
22
+ export declare function runPluginCommand(pluginName: string, options?: CommandRunOptions): Promise<PipelineContext>;
23
+ export declare function runDoctorCommand(options?: DoctorRunOptions): Promise<PipelineContext>;
24
+ //# sourceMappingURL=app-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-api.d.ts","sourceRoot":"","sources":["../src/app-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAGjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,aAAa,CAAC,EAAE;QACd,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,EAAE,CAAC,EAAE,OAAO,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;CACH;AAED,wBAAgB,oBAAoB,IAAI,aAAa,CAOpD;AAED,wBAAsB,kBAAkB,CAAC,GAAG,GAAE,MAAsB,EAAE,QAAQ,GAAE,aAAsC,GAAG,OAAO,CAAC,aAAa,CAAC,CAM9I;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAYpH;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAW/F"}
@@ -0,0 +1,43 @@
1
+ import { createContext, runPipeline } from './pipeline.js';
2
+ import { loadConfig } from './config.js';
3
+ import { loadPlugin } from './plugin-loader.js';
4
+ export function createFallbackConfig() {
5
+ return {
6
+ appName: 'Deploid project',
7
+ appId: 'dev.deploid.placeholder',
8
+ web: { framework: 'static', buildCommand: 'echo "deploid"', webDir: 'public' },
9
+ android: { packaging: 'capacitor' }
10
+ };
11
+ }
12
+ export async function loadConfigOptional(cwd = process.cwd(), fallback = createFallbackConfig()) {
13
+ try {
14
+ return await loadConfig(cwd);
15
+ }
16
+ catch {
17
+ return fallback;
18
+ }
19
+ }
20
+ export async function runPluginCommand(pluginName, options = {}) {
21
+ const cwd = options.cwd || process.cwd();
22
+ const config = options.config || await loadConfig(cwd);
23
+ const ctx = createContext(cwd, config, options.debug);
24
+ if (options.contextExtras) {
25
+ Object.assign(ctx, options.contextExtras);
26
+ }
27
+ const step = await loadPlugin(pluginName, config);
28
+ await runPipeline(ctx, [step]);
29
+ return ctx;
30
+ }
31
+ export async function runDoctorCommand(options = {}) {
32
+ const cwd = options.cwd || process.cwd();
33
+ const config = options.config || await loadConfigOptional(cwd);
34
+ return runPluginCommand('doctor', {
35
+ cwd,
36
+ config,
37
+ debug: options.debug,
38
+ contextExtras: {
39
+ doctorOptions: options.doctorOptions || {}
40
+ }
41
+ });
42
+ }
43
+ //# sourceMappingURL=app-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-api.js","sourceRoot":"","sources":["../src/app-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAwB,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsBhD,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,OAAO,EAAE,iBAAiB;QAC1B,KAAK,EAAE,yBAAyB;QAChC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE;QAC9E,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE,EAAE,WAA0B,oBAAoB,EAAE;IACpH,IAAI,CAAC;QACH,OAAO,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB,EAAE,UAA6B,EAAE;IACxF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAEtD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,CAAC,GAA8B,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAA4B,EAAE;IACnE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC/D,OAAO,gBAAgB,CAAC,QAAQ,EAAE;QAChC,GAAG;QACH,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE;YACb,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE;SAC3C;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { DeploidConfig } from './types.js';
2
+ export type ArtifactKind = 'android-debug-apk' | 'android-release-apk' | 'android-release-aab' | 'assets' | 'desktop';
3
+ export interface ArtifactRecord {
4
+ kind: ArtifactKind;
5
+ label: string;
6
+ path: string;
7
+ exists: boolean;
8
+ isDirectory: boolean;
9
+ sizeBytes: number;
10
+ }
11
+ export declare function inspectArtifacts(cwd: string, config?: Pick<DeploidConfig, 'assets'>): ArtifactRecord[];
12
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,qBAAqB,GAAG,qBAAqB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,GAAG,cAAc,EAAE,CAStG"}
@@ -0,0 +1,37 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ export function inspectArtifacts(cwd, config) {
4
+ const assetsOutput = config?.assets?.output || 'assets-gen';
5
+ return [
6
+ makeArtifactRecord('android-debug-apk', 'Debug APK', path.join(cwd, 'android', 'app', 'build', 'outputs', 'apk', 'debug', 'app-debug.apk')),
7
+ makeArtifactRecord('android-release-apk', 'Release APK', path.join(cwd, 'android', 'app', 'build', 'outputs', 'apk', 'release', 'app-release.apk')),
8
+ makeArtifactRecord('android-release-aab', 'Release AAB', path.join(cwd, 'android', 'app', 'build', 'outputs', 'bundle', 'release', 'app-release.aab')),
9
+ makeArtifactRecord('assets', 'Generated assets', path.join(cwd, assetsOutput)),
10
+ makeArtifactRecord('desktop', 'Desktop output', path.join(cwd, 'dist-electron'))
11
+ ];
12
+ }
13
+ function makeArtifactRecord(kind, label, targetPath) {
14
+ const exists = fs.existsSync(targetPath);
15
+ const stats = exists ? fs.statSync(targetPath) : null;
16
+ return {
17
+ kind,
18
+ label,
19
+ path: targetPath,
20
+ exists,
21
+ isDirectory: Boolean(stats?.isDirectory()),
22
+ sizeBytes: stats ? measureSize(targetPath, stats.isDirectory()) : 0
23
+ };
24
+ }
25
+ function measureSize(targetPath, isDirectory) {
26
+ if (!isDirectory) {
27
+ return fs.statSync(targetPath).size;
28
+ }
29
+ let total = 0;
30
+ for (const entry of fs.readdirSync(targetPath)) {
31
+ const childPath = path.join(targetPath, entry);
32
+ const childStats = fs.statSync(childPath);
33
+ total += childStats.isDirectory() ? measureSize(childPath, true) : childStats.size;
34
+ }
35
+ return total;
36
+ }
37
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAc7B,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,MAAsC;IAClF,MAAM,YAAY,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,YAAY,CAAC;IAC5D,OAAO;QACL,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QAC3I,kBAAkB,CAAC,qBAAqB,EAAE,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACnJ,kBAAkB,CAAC,qBAAqB,EAAE,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACtJ,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC9E,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;KACjF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAkB,EAAE,KAAa,EAAE,UAAkB;IAC/E,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,OAAO;QACL,IAAI;QACJ,KAAK;QACL,IAAI,EAAE,UAAU;QAChB,MAAM;QACN,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;QAC1C,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KACpE,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB,EAAE,WAAoB;IAC3D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1C,KAAK,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;IACrF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface AndroidDeviceRecord {
2
+ id: string;
3
+ state: string;
4
+ }
5
+ export declare function listAndroidDevices(): AndroidDeviceRecord[];
6
+ //# sourceMappingURL=devices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,kBAAkB,IAAI,mBAAmB,EAAE,CAmB1D"}
@@ -0,0 +1,20 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ export function listAndroidDevices() {
3
+ const result = spawnSync('adb', ['devices'], {
4
+ encoding: 'utf8',
5
+ stdio: ['ignore', 'pipe', 'pipe']
6
+ });
7
+ if (result.status !== 0) {
8
+ const reason = (result.stderr || '').trim() || 'adb devices failed';
9
+ throw new Error(reason);
10
+ }
11
+ return (result.stdout || '')
12
+ .split('\n')
13
+ .map((line) => line.trim())
14
+ .filter((line) => line && !line.startsWith('List of devices'))
15
+ .map((line) => {
16
+ const [id, state = 'unknown'] = line.split('\t');
17
+ return { id, state };
18
+ });
19
+ }
20
+ //# sourceMappingURL=devices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.js","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAO/C,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE;QAC3C,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,oBAAoB,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SACzB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/index.d.ts CHANGED
@@ -3,4 +3,7 @@ export * from './types.js';
3
3
  export * from './config.js';
4
4
  export * from './pipeline.js';
5
5
  export * from './plugin-loader.js';
6
+ export * from './app-api.js';
7
+ export * from './artifacts.js';
8
+ export * from './devices.js';
6
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -3,4 +3,7 @@ export * from './types.js';
3
3
  export * from './config.js';
4
4
  export * from './pipeline.js';
5
5
  export * from './plugin-loader.js';
6
+ export * from './app-api.js';
7
+ export * from './artifacts.js';
8
+ export * from './devices.js';
6
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAG1D,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAoBjG;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAa1F"}
1
+ {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAK1D,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAyBjG;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAa1F"}
@@ -1,4 +1,6 @@
1
1
  import { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
2
4
  export async function loadPlugin(pluginName, config) {
3
5
  // Keep config in signature for future plugin selection hooks.
4
6
  void config;
@@ -15,6 +17,10 @@ export async function loadPlugin(pluginName, config) {
15
17
  if (existsSync(localPluginPath)) {
16
18
  return instantiatePlugin(await import(localPluginPath), pluginName);
17
19
  }
20
+ const workspacePluginPath = path.resolve(process.cwd(), 'packages', 'plugins', pluginName, 'dist', 'index.js');
21
+ if (existsSync(workspacePluginPath)) {
22
+ return instantiatePlugin(await import(pathToFileURL(workspacePluginPath).href), pluginName);
23
+ }
18
24
  throw new Error(`Plugin "${pluginName}" not found. Expected package "${packageName}".`);
19
25
  }
20
26
  export async function loadPluginsFromConfig(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deploid/core",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -17,4 +17,4 @@
17
17
  "scripts": {
18
18
  "build": "tsc -b"
19
19
  }
20
- }
20
+ }
package/src/app-api.ts ADDED
@@ -0,0 +1,67 @@
1
+ import { createContext, runPipeline, type PipelineContext } from './pipeline.js';
2
+ import { loadConfig } from './config.js';
3
+ import { loadPlugin } from './plugin-loader.js';
4
+ import type { DeploidConfig } from './types.js';
5
+
6
+ export interface CommandRunOptions {
7
+ cwd?: string;
8
+ config?: DeploidConfig;
9
+ debug?: boolean;
10
+ contextExtras?: Record<string, unknown>;
11
+ }
12
+
13
+ export interface DoctorRunOptions extends CommandRunOptions {
14
+ doctorOptions?: {
15
+ json?: boolean;
16
+ markdown?: boolean;
17
+ ci?: boolean;
18
+ summary?: boolean;
19
+ verbose?: boolean;
20
+ projectOnly?: boolean;
21
+ fix?: boolean;
22
+ };
23
+ }
24
+
25
+ export function createFallbackConfig(): DeploidConfig {
26
+ return {
27
+ appName: 'Deploid project',
28
+ appId: 'dev.deploid.placeholder',
29
+ web: { framework: 'static', buildCommand: 'echo "deploid"', webDir: 'public' },
30
+ android: { packaging: 'capacitor' }
31
+ };
32
+ }
33
+
34
+ export async function loadConfigOptional(cwd: string = process.cwd(), fallback: DeploidConfig = createFallbackConfig()): Promise<DeploidConfig> {
35
+ try {
36
+ return await loadConfig(cwd);
37
+ } catch {
38
+ return fallback;
39
+ }
40
+ }
41
+
42
+ export async function runPluginCommand(pluginName: string, options: CommandRunOptions = {}): Promise<PipelineContext> {
43
+ const cwd = options.cwd || process.cwd();
44
+ const config = options.config || await loadConfig(cwd);
45
+ const ctx = createContext(cwd, config, options.debug);
46
+
47
+ if (options.contextExtras) {
48
+ Object.assign(ctx as Record<string, unknown>, options.contextExtras);
49
+ }
50
+
51
+ const step = await loadPlugin(pluginName, config);
52
+ await runPipeline(ctx, [step]);
53
+ return ctx;
54
+ }
55
+
56
+ export async function runDoctorCommand(options: DoctorRunOptions = {}): Promise<PipelineContext> {
57
+ const cwd = options.cwd || process.cwd();
58
+ const config = options.config || await loadConfigOptional(cwd);
59
+ return runPluginCommand('doctor', {
60
+ cwd,
61
+ config,
62
+ debug: options.debug,
63
+ contextExtras: {
64
+ doctorOptions: options.doctorOptions || {}
65
+ }
66
+ });
67
+ }
@@ -0,0 +1,52 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import type { DeploidConfig } from './types.js';
4
+
5
+ export type ArtifactKind = 'android-debug-apk' | 'android-release-apk' | 'android-release-aab' | 'assets' | 'desktop';
6
+
7
+ export interface ArtifactRecord {
8
+ kind: ArtifactKind;
9
+ label: string;
10
+ path: string;
11
+ exists: boolean;
12
+ isDirectory: boolean;
13
+ sizeBytes: number;
14
+ }
15
+
16
+ export function inspectArtifacts(cwd: string, config?: Pick<DeploidConfig, 'assets'>): ArtifactRecord[] {
17
+ const assetsOutput = config?.assets?.output || 'assets-gen';
18
+ return [
19
+ makeArtifactRecord('android-debug-apk', 'Debug APK', path.join(cwd, 'android', 'app', 'build', 'outputs', 'apk', 'debug', 'app-debug.apk')),
20
+ makeArtifactRecord('android-release-apk', 'Release APK', path.join(cwd, 'android', 'app', 'build', 'outputs', 'apk', 'release', 'app-release.apk')),
21
+ makeArtifactRecord('android-release-aab', 'Release AAB', path.join(cwd, 'android', 'app', 'build', 'outputs', 'bundle', 'release', 'app-release.aab')),
22
+ makeArtifactRecord('assets', 'Generated assets', path.join(cwd, assetsOutput)),
23
+ makeArtifactRecord('desktop', 'Desktop output', path.join(cwd, 'dist-electron'))
24
+ ];
25
+ }
26
+
27
+ function makeArtifactRecord(kind: ArtifactKind, label: string, targetPath: string): ArtifactRecord {
28
+ const exists = fs.existsSync(targetPath);
29
+ const stats = exists ? fs.statSync(targetPath) : null;
30
+ return {
31
+ kind,
32
+ label,
33
+ path: targetPath,
34
+ exists,
35
+ isDirectory: Boolean(stats?.isDirectory()),
36
+ sizeBytes: stats ? measureSize(targetPath, stats.isDirectory()) : 0
37
+ };
38
+ }
39
+
40
+ function measureSize(targetPath: string, isDirectory: boolean): number {
41
+ if (!isDirectory) {
42
+ return fs.statSync(targetPath).size;
43
+ }
44
+
45
+ let total = 0;
46
+ for (const entry of fs.readdirSync(targetPath)) {
47
+ const childPath = path.join(targetPath, entry);
48
+ const childStats = fs.statSync(childPath);
49
+ total += childStats.isDirectory() ? measureSize(childPath, true) : childStats.size;
50
+ }
51
+ return total;
52
+ }
package/src/devices.ts ADDED
@@ -0,0 +1,27 @@
1
+ import { spawnSync } from 'node:child_process';
2
+
3
+ export interface AndroidDeviceRecord {
4
+ id: string;
5
+ state: string;
6
+ }
7
+
8
+ export function listAndroidDevices(): AndroidDeviceRecord[] {
9
+ const result = spawnSync('adb', ['devices'], {
10
+ encoding: 'utf8',
11
+ stdio: ['ignore', 'pipe', 'pipe']
12
+ });
13
+
14
+ if (result.status !== 0) {
15
+ const reason = (result.stderr || '').trim() || 'adb devices failed';
16
+ throw new Error(reason);
17
+ }
18
+
19
+ return (result.stdout || '')
20
+ .split('\n')
21
+ .map((line) => line.trim())
22
+ .filter((line) => line && !line.startsWith('List of devices'))
23
+ .map((line) => {
24
+ const [id, state = 'unknown'] = line.split('\t');
25
+ return { id, state };
26
+ });
27
+ }
package/src/index.ts CHANGED
@@ -3,5 +3,6 @@ export * from './types.js';
3
3
  export * from './config.js';
4
4
  export * from './pipeline.js';
5
5
  export * from './plugin-loader.js';
6
-
7
-
6
+ export * from './app-api.js';
7
+ export * from './artifacts.js';
8
+ export * from './devices.js';
@@ -1,6 +1,8 @@
1
1
  import { PipelineStep } from './pipeline.js';
2
2
  import { DeploidConfig, DeploidPlugin } from './types.js';
3
3
  import { existsSync } from 'node:fs';
4
+ import path from 'node:path';
5
+ import { pathToFileURL } from 'node:url';
4
6
 
5
7
  export async function loadPlugin(pluginName: string, config: DeploidConfig): Promise<PipelineStep> {
6
8
  // Keep config in signature for future plugin selection hooks.
@@ -21,6 +23,11 @@ export async function loadPlugin(pluginName: string, config: DeploidConfig): Pro
21
23
  return instantiatePlugin(await import(localPluginPath), pluginName);
22
24
  }
23
25
 
26
+ const workspacePluginPath = path.resolve(process.cwd(), 'packages', 'plugins', pluginName, 'dist', 'index.js');
27
+ if (existsSync(workspacePluginPath)) {
28
+ return instantiatePlugin(await import(pathToFileURL(workspacePluginPath).href), pluginName);
29
+ }
30
+
24
31
  throw new Error(`Plugin "${pluginName}" not found. Expected package "${packageName}".`);
25
32
  }
26
33
 
@@ -1 +0,0 @@
1
- {"root":["./src/config.ts","./src/index.ts","./src/logger.ts","./src/pipeline.ts","./src/plugin-loader.ts","./src/types.ts"],"version":"5.9.3"}