runcloud 0.1.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/dist/index.js ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { registerLogin } from './commands/login.js';
4
+ import { registerStatus } from './commands/status.js';
5
+ import { registerLink } from './commands/link.js';
6
+ import { registerCreate } from './commands/create.js';
7
+ import { registerPull } from './commands/pull.js';
8
+ import { registerDeploy } from './commands/deploy.js';
9
+ import { registerMisc } from './commands/misc.js';
10
+ import { registerStack } from './commands/stack.js';
11
+ import { registerCreds } from './commands/creds.js';
12
+ import { registerBuild } from './commands/build.js';
13
+ import { registerServices } from './commands/services.js';
14
+ import { registerEmail } from './commands/email.js';
15
+ import { registerWebsite } from './commands/website.js';
16
+ import { registerDomains } from './commands/domains.js';
17
+ import { registerDns } from './commands/dns.js';
18
+ import { registerDiagnose } from './diagnose.js';
19
+ const program = new Command('newly')
20
+ .description('Develop, provision, and deploy Newly backends')
21
+ .version('0.1.0');
22
+ registerLogin(program);
23
+ registerStatus(program);
24
+ registerLink(program);
25
+ registerCreate(program);
26
+ registerPull(program);
27
+ registerDeploy(program);
28
+ registerMisc(program);
29
+ registerStack(program);
30
+ registerCreds(program);
31
+ registerBuild(program);
32
+ registerServices(program);
33
+ registerEmail(program);
34
+ registerWebsite(program);
35
+ registerDomains(program);
36
+ registerDns(program);
37
+ registerDiagnose(program);
38
+ await program.parseAsync(process.argv);
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ if (!process.env.NEWLY_HOME) {
5
+ process.env.NEWLY_HOME = process.env.NEWLY_DEV_HOME ?? join(homedir(), '.newly-dev');
6
+ }
7
+ if (!process.env.NEWLY_APP_URL && process.env.NEWLY_DEV_APP_URL) {
8
+ process.env.NEWLY_APP_URL = process.env.NEWLY_DEV_APP_URL;
9
+ }
10
+ await import('./index.js');
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { registerLogin } from './commands/login.js';
4
+ import { registerRunCloud } from './commands/run-cloud.js';
5
+ const program = new Command('runcloud')
6
+ .description('Create and control remote iOS simulator sessions')
7
+ .version('0.1.0');
8
+ registerLogin(program);
9
+ registerRunCloud(program);
10
+ await program.parseAsync(process.argv);
@@ -0,0 +1,63 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export const DEFAULT_BACKEND_SERVICES = [
4
+ { name: 'api', path: 'api-service', type: 'worker', schema: 'api', secrets: 'api', public: true },
5
+ { name: 'auth', path: 'auth-service', type: 'worker', schema: 'auth', secrets: 'auth', public: true },
6
+ ];
7
+ const SERVICE_NAME = /^[a-z][a-z0-9-]{0,31}$/;
8
+ export function readBackendServices(dir) {
9
+ const manifestPath = join(dir, 'backend', 'newly.services.json');
10
+ if (!existsSync(manifestPath))
11
+ return DEFAULT_BACKEND_SERVICES;
12
+ const parsed = JSON.parse(readFileSync(manifestPath, 'utf8'));
13
+ if (!Array.isArray(parsed.services) || parsed.services.length === 0) {
14
+ throw new Error('backend/newly.services.json must contain a non-empty services array');
15
+ }
16
+ return parsed.services.map((raw) => {
17
+ if (!raw || typeof raw !== 'object')
18
+ throw new Error('Invalid service entry in newly.services.json');
19
+ const entry = raw;
20
+ const name = String(entry.name ?? '');
21
+ const path = String(entry.path ?? '');
22
+ const type = String(entry.type ?? 'worker');
23
+ if (!SERVICE_NAME.test(name))
24
+ throw new Error(`Invalid service name in newly.services.json: ${name}`);
25
+ if (!path)
26
+ throw new Error(`Service ${name} is missing path`);
27
+ if (type !== 'worker')
28
+ throw new Error(`Service ${name} has unsupported type: ${type}`);
29
+ return {
30
+ name,
31
+ path,
32
+ type,
33
+ schema: entry.schema === undefined ? undefined : entry.schema === null ? null : String(entry.schema),
34
+ secrets: entry.secrets === undefined ? undefined : String(entry.secrets),
35
+ public: entry.public === undefined ? true : Boolean(entry.public),
36
+ };
37
+ });
38
+ }
39
+ export function parseServiceFilter(value) {
40
+ if (!value)
41
+ return [];
42
+ const names = value
43
+ .split(',')
44
+ .map((s) => s.trim())
45
+ .filter(Boolean);
46
+ for (const name of names) {
47
+ if (!SERVICE_NAME.test(name))
48
+ throw new Error(`Invalid service name: ${name}`);
49
+ }
50
+ return names;
51
+ }
52
+ export function assertKnownServices(services, selected) {
53
+ if (selected.length === 0)
54
+ return;
55
+ const known = new Set(services.map((s) => s.name));
56
+ const unknown = selected.filter((s) => !known.has(s));
57
+ if (unknown.length)
58
+ throw new Error(`Unknown service(s): ${unknown.join(', ')}`);
59
+ }
60
+ export function serviceUrl(projectId, env, service) {
61
+ const suffix = env === 'prod' ? 'api.newlyapp.com' : 'api-dev.newlyapp.com';
62
+ return `https://${service}-${projectId}-${env}.${suffix}`;
63
+ }
package/dist/sse.js ADDED
@@ -0,0 +1,19 @@
1
+ export function parseSseFrames(raw) {
2
+ const frames = [];
3
+ const blocks = raw.replace(/\r\n/g, '\n').split('\n\n');
4
+ blocks.pop();
5
+ for (const block of blocks) {
6
+ if (!block.trim())
7
+ continue;
8
+ let event = 'message';
9
+ const dataLines = [];
10
+ for (const line of block.split('\n')) {
11
+ if (line.startsWith('event:'))
12
+ event = line.slice(6).trim();
13
+ else if (line.startsWith('data:'))
14
+ dataLines.push(line.slice(5).replace(/^ /, ''));
15
+ }
16
+ frames.push({ event, data: dataLines.join('\n') });
17
+ }
18
+ return frames;
19
+ }
package/package.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "runcloud",
3
+ "version": "0.1.2",
4
+ "description": "Create and control run.cloud remote iOS simulator sessions",
5
+ "license": "UNLICENSED",
6
+ "type": "module",
7
+ "bin": {
8
+ "runcloud": "dist/run-cloud.js"
9
+ },
10
+ "engines": {
11
+ "node": ">=20"
12
+ },
13
+ "dependencies": {
14
+ "commander": "^12.1.0",
15
+ "google-auth-library": "^9.15.0",
16
+ "tar": "^7.4.3"
17
+ }
18
+ }