@ericminassian/plat 0.0.0-stage → 0.1.0
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/api-types.d.ts +7 -0
- package/dist/api-types.js +3 -0
- package/dist/api-types.js.map +1 -0
- package/dist/api.d.ts +123 -0
- package/dist/api.js +271 -0
- package/dist/api.js.map +1 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +4 -0
- package/dist/bin.js.map +1 -0
- package/dist/build.d.ts +45 -0
- package/dist/build.js +188 -0
- package/dist/build.js.map +1 -0
- package/dist/commands/account.d.ts +2 -0
- package/dist/commands/account.js +45 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/apps.d.ts +2 -0
- package/dist/commands/apps.js +75 -0
- package/dist/commands/apps.js.map +1 -0
- package/dist/commands/common.d.ts +19 -0
- package/dist/commands/common.js +43 -0
- package/dist/commands/common.js.map +1 -0
- package/dist/commands/lifecycle.d.ts +3 -0
- package/dist/commands/lifecycle.js +105 -0
- package/dist/commands/lifecycle.js.map +1 -0
- package/dist/commands/manage.d.ts +2 -0
- package/dist/commands/manage.js +103 -0
- package/dist/commands/manage.js.map +1 -0
- package/dist/commands/observe.d.ts +8 -0
- package/dist/commands/observe.js +195 -0
- package/dist/commands/observe.js.map +1 -0
- package/dist/credentials.d.ts +13 -0
- package/dist/credentials.js +42 -0
- package/dist/credentials.js.map +1 -0
- package/dist/deploy.d.ts +23 -0
- package/dist/deploy.js +100 -0
- package/dist/deploy.js.map +1 -0
- package/dist/dev/crons.d.ts +16 -0
- package/dist/dev/crons.js +47 -0
- package/dist/dev/crons.js.map +1 -0
- package/dist/dev/entries.d.ts +6 -0
- package/dist/dev/entries.js +21 -0
- package/dist/dev/entries.js.map +1 -0
- package/dist/dev/index.d.ts +33 -0
- package/dist/dev/index.js +262 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/local-stage.d.ts +46 -0
- package/dist/dev/local-stage.js +116 -0
- package/dist/dev/local-stage.js.map +1 -0
- package/dist/dev/pretty.d.ts +16 -0
- package/dist/dev/pretty.js +91 -0
- package/dist/dev/pretty.js.map +1 -0
- package/dist/dev/proc.d.ts +7 -0
- package/dist/dev/proc.js +16 -0
- package/dist/dev/proc.js.map +1 -0
- package/dist/dev/router.d.ts +67 -0
- package/dist/dev/router.js +184 -0
- package/dist/dev/router.js.map +1 -0
- package/dist/dev/server-entry.d.ts +1 -0
- package/dist/dev/server-entry.js +28 -0
- package/dist/dev/server-entry.js.map +1 -0
- package/dist/dev/test.d.ts +10 -0
- package/dist/dev/test.js +62 -0
- package/dist/dev/test.js.map +1 -0
- package/dist/dev/worker-host.d.ts +1 -0
- package/dist/dev/worker-host.js +67 -0
- package/dist/dev/worker-host.js.map +1 -0
- package/dist/dev/worker.d.ts +57 -0
- package/dist/dev/worker.js +216 -0
- package/dist/dev/worker.js.map +1 -0
- package/dist/github.d.ts +39 -0
- package/dist/github.js +108 -0
- package/dist/github.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +23 -0
- package/dist/init.js +102 -0
- package/dist/init.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.js +24 -0
- package/dist/main.js.map +1 -0
- package/dist/project.d.ts +22 -0
- package/dist/project.js +81 -0
- package/dist/project.js.map +1 -0
- package/dist/util/net.d.ts +4 -0
- package/dist/util/net.js +33 -0
- package/dist/util/net.js.map +1 -0
- package/dist/util/output.d.ts +42 -0
- package/dist/util/output.js +105 -0
- package/dist/util/output.js.map +1 -0
- package/dist/util/prompt.d.ts +3 -0
- package/dist/util/prompt.js +22 -0
- package/dist/util/prompt.js.map +1 -0
- package/dist/util/time.d.ts +11 -0
- package/dist/util/time.js +29 -0
- package/dist/util/time.js.map +1 -0
- package/dist/util/zip.d.ts +10 -0
- package/dist/util/zip.js +45 -0
- package/dist/util/zip.js.map +1 -0
- package/package.json +50 -3
- package/src/api-types.ts +8 -0
- package/src/api.ts +341 -0
- package/src/bin.ts +4 -0
- package/src/build.ts +255 -0
- package/src/commands/account.ts +62 -0
- package/src/commands/apps.ts +102 -0
- package/src/commands/common.ts +51 -0
- package/src/commands/lifecycle.ts +139 -0
- package/src/commands/manage.ts +169 -0
- package/src/commands/observe.ts +276 -0
- package/src/credentials.ts +50 -0
- package/src/deploy.ts +138 -0
- package/src/dev/crons.ts +70 -0
- package/src/dev/entries.ts +23 -0
- package/src/dev/index.ts +281 -0
- package/src/dev/local-stage.ts +176 -0
- package/src/dev/pretty.ts +90 -0
- package/src/dev/proc.ts +15 -0
- package/src/dev/router.ts +246 -0
- package/src/dev/server-entry.ts +21 -0
- package/src/dev/test.ts +68 -0
- package/src/dev/worker-host.ts +62 -0
- package/src/dev/worker.ts +332 -0
- package/src/github.ts +121 -0
- package/src/index.ts +20 -0
- package/src/init.ts +123 -0
- package/src/main.ts +28 -0
- package/src/project.ts +89 -0
- package/src/util/net.ts +33 -0
- package/src/util/output.ts +117 -0
- package/src/util/prompt.ts +20 -0
- package/src/util/time.ts +32 -0
- package/src/util/zip.ts +46 -0
- package/template/.github/workflows/platform.yml +24 -0
- package/template/AGENTS.md +134 -0
- package/template/CLAUDE.md +1 -0
- package/template/README.md +13 -0
- package/template/_gitignore +8 -0
- package/template/package.json +31 -0
- package/template/platform.json +18 -0
- package/template/src/server.ts +100 -0
- package/template/src/types.ts +21 -0
- package/template/src/worker.ts +32 -0
- package/template/test/server.test.ts +120 -0
- package/template/test/todos.integration.test.ts +30 -0
- package/template/tsconfig.json +18 -0
- package/template/vitest.config.ts +9 -0
- package/template/vitest.integration.config.ts +10 -0
- package/template/web/index.html +12 -0
- package/template/web/src/App.tsx +102 -0
- package/template/web/src/api.ts +11 -0
- package/template/web/src/main.tsx +10 -0
- package/template/web/src/styles.css +102 -0
- package/template/web/tsconfig.json +18 -0
- package/template/web/vite.config.ts +19 -0
- package/README.md +0 -3
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { EventBridgeClient, ListRulesCommand, ListTargetsByRuleCommand, PutTargetsCommand, RemoveTargetsCommand, } from '@aws-sdk/client-eventbridge';
|
|
4
|
+
import { LambdaClient, ListEventSourceMappingsCommand, UpdateEventSourceMappingCommand, } from '@aws-sdk/client-lambda';
|
|
5
|
+
import { CreateQueueCommand, DeleteMessageBatchCommand, GetQueueAttributesCommand, ReceiveMessageCommand, SetQueueAttributesCommand, SQSClient, } from '@aws-sdk/client-sqs';
|
|
6
|
+
import { names } from '@ericminassian/platform-core';
|
|
7
|
+
import { SDK_WORKER } from '../build.js';
|
|
8
|
+
import { resolveFromApp } from '../project.js';
|
|
9
|
+
import { freePort, waitForPort } from '../util/net.js';
|
|
10
|
+
import { tsxArgs } from './entries.js';
|
|
11
|
+
import { emulatorClientConfig, localEnv } from './local-stage.js';
|
|
12
|
+
import { killTree } from './proc.js';
|
|
13
|
+
export async function startLocalWorker(stage, manifest, root, opts = {}) {
|
|
14
|
+
if (!manifest.worker)
|
|
15
|
+
throw new Error('manifest has no worker');
|
|
16
|
+
const port = await freePort();
|
|
17
|
+
const env = localEnv(stage, manifest, {
|
|
18
|
+
PLATFORM_WORKER_ENTRY: resolve(root, manifest.worker.entry),
|
|
19
|
+
PLATFORM_SDK_WORKER: resolveFromApp(root, SDK_WORKER),
|
|
20
|
+
PLATFORM_WORKER_PORT: String(port),
|
|
21
|
+
PLATFORM_WORKER_TIMEOUT_MS: String(manifest.worker.timeoutSeconds * 1000),
|
|
22
|
+
PLATFORM_WORKER_FUNCTION: stage.result.workerFunction?.name ?? names.workerFunction(manifest.name, stage.stage),
|
|
23
|
+
PLATFORM_LOG_PRETTY: '1',
|
|
24
|
+
});
|
|
25
|
+
const child = spawn(process.execPath, tsxArgs('worker-host', opts.watch !== false), {
|
|
26
|
+
cwd: root,
|
|
27
|
+
env,
|
|
28
|
+
detached: true,
|
|
29
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
30
|
+
});
|
|
31
|
+
await waitForPort(port, '127.0.0.1', 60_000);
|
|
32
|
+
return {
|
|
33
|
+
port,
|
|
34
|
+
child,
|
|
35
|
+
async invoke(event) {
|
|
36
|
+
// tsx watch restarts the host on edits; wait for it to come back.
|
|
37
|
+
await waitForPort(port, '127.0.0.1', 30_000);
|
|
38
|
+
const res = await fetch(`http://127.0.0.1:${port}/`, { method: 'POST', body: JSON.stringify(event) });
|
|
39
|
+
return (await res.json());
|
|
40
|
+
},
|
|
41
|
+
stop() {
|
|
42
|
+
killTree(child);
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export async function startWorkerDispatch(stage, manifest, worker, log = () => { }) {
|
|
47
|
+
const cfg = emulatorClientConfig(stage.conn);
|
|
48
|
+
const sqs = new SQSClient(cfg);
|
|
49
|
+
const lambda = new LambdaClient(cfg);
|
|
50
|
+
const events = new EventBridgeClient(cfg);
|
|
51
|
+
const functionName = stage.result.workerFunction?.name;
|
|
52
|
+
let stopped = false;
|
|
53
|
+
// The emulator's own event source mappings would hand messages to its sandboxed runtime; turn them off.
|
|
54
|
+
if (functionName) {
|
|
55
|
+
const esms = await lambda
|
|
56
|
+
.send(new ListEventSourceMappingsCommand({ FunctionName: functionName }))
|
|
57
|
+
.catch(() => undefined);
|
|
58
|
+
for (const m of esms?.EventSourceMappings ?? []) {
|
|
59
|
+
if (m.UUID && m.State !== 'Disabled') {
|
|
60
|
+
await lambda
|
|
61
|
+
.send(new UpdateEventSourceMappingCommand({ UUID: m.UUID, Enabled: false }))
|
|
62
|
+
.catch(() => undefined);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const loops = [];
|
|
67
|
+
for (const [name, q] of Object.entries(stage.bindings.queues)) {
|
|
68
|
+
const batchSize = manifest.queues[name]?.batchSize ?? 10;
|
|
69
|
+
loops.push(pollQueue(sqs, q.url, batchSize, () => stopped, async (messages) => {
|
|
70
|
+
const r = await worker.invoke(sqsEvent(messages, q.arn, stage.conn.region));
|
|
71
|
+
const failed = new Set(r.ok
|
|
72
|
+
? (r.result
|
|
73
|
+
?.batchItemFailures ?? []).map((f) => f.itemIdentifier)
|
|
74
|
+
: messages.map((m) => m.MessageId));
|
|
75
|
+
log('queue', name, failed.size ? 'error' : 'ok', r.ok ? (failed.size ? `${failed.size} failed` : undefined) : r.error?.message);
|
|
76
|
+
return messages.filter((m) => !failed.has(m.MessageId));
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
if (functionName && stage.bindings.bus) {
|
|
80
|
+
const tapUrl = await tapEventRules(sqs, events, stage, functionName);
|
|
81
|
+
if (tapUrl) {
|
|
82
|
+
loops.push(pollQueue(sqs, tapUrl, 1, () => stopped, async (messages) => {
|
|
83
|
+
const done = [];
|
|
84
|
+
for (const m of messages) {
|
|
85
|
+
const event = JSON.parse(m.Body ?? '{}');
|
|
86
|
+
const attempts = Number(m.Attributes?.ApproximateReceiveCount ?? '1');
|
|
87
|
+
const r = await worker.invoke(event);
|
|
88
|
+
log('event', event['detail-type'] ?? '?', r.ok ? 'ok' : 'error', r.error?.message);
|
|
89
|
+
// Lambda async invokes retry twice, then drop: same here.
|
|
90
|
+
if (r.ok || attempts >= 3)
|
|
91
|
+
done.push(m);
|
|
92
|
+
}
|
|
93
|
+
return done;
|
|
94
|
+
}, 5));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
async runCron(name) {
|
|
99
|
+
const r = await worker.invoke({ __platform: 'cron', name });
|
|
100
|
+
log('cron', name, r.ok ? 'ok' : 'error', r.error?.message);
|
|
101
|
+
return r;
|
|
102
|
+
},
|
|
103
|
+
stop() {
|
|
104
|
+
stopped = true;
|
|
105
|
+
sqs.destroy();
|
|
106
|
+
lambda.destroy();
|
|
107
|
+
events.destroy();
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/** Lambda's SQS event shape. */
|
|
112
|
+
export function sqsEvent(messages, queueArn, region) {
|
|
113
|
+
return {
|
|
114
|
+
Records: messages.map((m) => ({
|
|
115
|
+
messageId: m.MessageId,
|
|
116
|
+
receiptHandle: m.ReceiptHandle,
|
|
117
|
+
body: m.Body ?? '',
|
|
118
|
+
attributes: m.Attributes ?? {},
|
|
119
|
+
messageAttributes: Object.fromEntries(Object.entries(m.MessageAttributes ?? {}).map(([k, v]) => [
|
|
120
|
+
k,
|
|
121
|
+
{
|
|
122
|
+
stringValue: v.StringValue,
|
|
123
|
+
binaryValue: v.BinaryValue,
|
|
124
|
+
dataType: v.DataType,
|
|
125
|
+
stringListValues: [],
|
|
126
|
+
binaryListValues: [],
|
|
127
|
+
},
|
|
128
|
+
])),
|
|
129
|
+
md5OfBody: m.MD5OfBody,
|
|
130
|
+
eventSource: 'aws:sqs',
|
|
131
|
+
eventSourceARN: queueArn,
|
|
132
|
+
awsRegion: region,
|
|
133
|
+
})),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Re-point the stage's EventBridge rules from the (sandboxed) emulator Lambda
|
|
138
|
+
* to a tap queue the dispatcher polls. Returns the tap queue URL.
|
|
139
|
+
*/
|
|
140
|
+
async function tapEventRules(sqs, events, stage, functionName) {
|
|
141
|
+
const bus = stage.bindings.bus.name;
|
|
142
|
+
const rules = (await events.send(new ListRulesCommand({ EventBusName: bus })).catch(() => undefined))?.Rules ?? [];
|
|
143
|
+
if (rules.length === 0)
|
|
144
|
+
return null;
|
|
145
|
+
const tapName = `${names.base(stage.bindings.app, stage.stage)}--plat-dev-events`;
|
|
146
|
+
const tapUrl = (await sqs.send(new CreateQueueCommand({ QueueName: tapName }))).QueueUrl;
|
|
147
|
+
const tapArn = (await sqs.send(new GetQueueAttributesCommand({ QueueUrl: tapUrl, AttributeNames: ['QueueArn'] }))).Attributes.QueueArn;
|
|
148
|
+
await sqs.send(new SetQueueAttributesCommand({
|
|
149
|
+
QueueUrl: tapUrl,
|
|
150
|
+
Attributes: {
|
|
151
|
+
Policy: JSON.stringify({
|
|
152
|
+
Version: '2012-10-17',
|
|
153
|
+
Statement: [
|
|
154
|
+
{
|
|
155
|
+
Effect: 'Allow',
|
|
156
|
+
Principal: { Service: 'events.amazonaws.com' },
|
|
157
|
+
Action: 'sqs:SendMessage',
|
|
158
|
+
Resource: tapArn,
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
}),
|
|
162
|
+
},
|
|
163
|
+
}));
|
|
164
|
+
for (const rule of rules) {
|
|
165
|
+
if (!rule.Name)
|
|
166
|
+
continue;
|
|
167
|
+
const targets = (await events.send(new ListTargetsByRuleCommand({ Rule: rule.Name, EventBusName: bus }))).Targets ?? [];
|
|
168
|
+
const lambdaTargets = targets.filter((t) => t.Arn?.includes(`:function:${functionName}`));
|
|
169
|
+
if (lambdaTargets.length === 0)
|
|
170
|
+
continue;
|
|
171
|
+
await events.send(new RemoveTargetsCommand({ Rule: rule.Name, EventBusName: bus, Ids: lambdaTargets.map((t) => t.Id) }));
|
|
172
|
+
await events.send(new PutTargetsCommand({
|
|
173
|
+
Rule: rule.Name,
|
|
174
|
+
EventBusName: bus,
|
|
175
|
+
Targets: [{ Id: 'plat-dev-tap', Arn: tapArn }],
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
return tapUrl;
|
|
179
|
+
}
|
|
180
|
+
/** Long-poll a queue; `handle` returns the messages to delete. */
|
|
181
|
+
async function pollQueue(sqs, url, batchSize, stopped, handle, waitSeconds = 5) {
|
|
182
|
+
while (!stopped()) {
|
|
183
|
+
let messages = [];
|
|
184
|
+
try {
|
|
185
|
+
messages =
|
|
186
|
+
(await sqs.send(new ReceiveMessageCommand({
|
|
187
|
+
QueueUrl: url,
|
|
188
|
+
MaxNumberOfMessages: batchSize,
|
|
189
|
+
WaitTimeSeconds: waitSeconds,
|
|
190
|
+
MessageSystemAttributeNames: ['All'],
|
|
191
|
+
MessageAttributeNames: ['All'],
|
|
192
|
+
}))).Messages ?? [];
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
if (stopped())
|
|
196
|
+
return;
|
|
197
|
+
await new Promise((r) => setTimeout(r, 1_000));
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (messages.length === 0)
|
|
201
|
+
continue;
|
|
202
|
+
try {
|
|
203
|
+
const done = await handle(messages);
|
|
204
|
+
if (done.length) {
|
|
205
|
+
await sqs.send(new DeleteMessageBatchCommand({
|
|
206
|
+
QueueUrl: url,
|
|
207
|
+
Entries: done.map((m, i) => ({ Id: String(i), ReceiptHandle: m.ReceiptHandle })),
|
|
208
|
+
}));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
// Leave the messages; they become visible again after the visibility timeout.
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/dev/worker.ts"],"names":[],"mappings":"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"}
|
package/dist/github.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** GitHub Actions environment, read from `process.env` (injectable for tests). */
|
|
2
|
+
export type Env = Record<string, string | undefined>;
|
|
3
|
+
export declare function isGitHubActions(env?: Env): boolean;
|
|
4
|
+
interface GitHubEvent {
|
|
5
|
+
number?: number;
|
|
6
|
+
pull_request?: {
|
|
7
|
+
number?: number;
|
|
8
|
+
head?: {
|
|
9
|
+
sha?: string;
|
|
10
|
+
ref?: string;
|
|
11
|
+
};
|
|
12
|
+
title?: string;
|
|
13
|
+
};
|
|
14
|
+
head_commit?: {
|
|
15
|
+
message?: string;
|
|
16
|
+
};
|
|
17
|
+
repository?: {
|
|
18
|
+
default_branch?: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export declare function readEvent(env?: Env): GitHubEvent;
|
|
22
|
+
/**
|
|
23
|
+
* The stage a CI run deploys to: `pr-<n>` for pull requests, `prod` for pushes
|
|
24
|
+
* (or manual runs) on the default branch. `explicit` (from `--stage`) wins.
|
|
25
|
+
*/
|
|
26
|
+
export declare function deriveStage(explicit: string | undefined, env?: Env): string;
|
|
27
|
+
/** Commit metadata for the deployment record. */
|
|
28
|
+
export declare function gitInfo(cwd: string, env?: Env): {
|
|
29
|
+
commit?: string;
|
|
30
|
+
ref?: string;
|
|
31
|
+
message?: string;
|
|
32
|
+
};
|
|
33
|
+
/** GitHub Actions OIDC token for `audience` (requires `permissions: id-token: write`). */
|
|
34
|
+
export declare function fetchOidcToken(audience: string, env?: Env): Promise<string>;
|
|
35
|
+
export declare function canUseOidc(env?: Env): boolean;
|
|
36
|
+
/** `key=value` into `$GITHUB_OUTPUT` (no-op outside Actions). */
|
|
37
|
+
export declare function setOutput(key: string, value: string, env?: Env): void;
|
|
38
|
+
export declare function appendStepSummary(markdown: string, env?: Env): void;
|
|
39
|
+
export {};
|
package/dist/github.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { appendFileSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { PROD_STAGE, previewStage, validateStageName } from '@ericminassian/platform-core';
|
|
4
|
+
import { CliError, EXIT } from './util/output.js';
|
|
5
|
+
export function isGitHubActions(env = process.env) {
|
|
6
|
+
return env.GITHUB_ACTIONS === 'true';
|
|
7
|
+
}
|
|
8
|
+
export function readEvent(env = process.env) {
|
|
9
|
+
if (!env.GITHUB_EVENT_PATH)
|
|
10
|
+
return {};
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(readFileSync(env.GITHUB_EVENT_PATH, 'utf8'));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The stage a CI run deploys to: `pr-<n>` for pull requests, `prod` for pushes
|
|
20
|
+
* (or manual runs) on the default branch. `explicit` (from `--stage`) wins.
|
|
21
|
+
*/
|
|
22
|
+
export function deriveStage(explicit, env = process.env) {
|
|
23
|
+
if (explicit) {
|
|
24
|
+
const err = validateStageName(explicit);
|
|
25
|
+
if (err)
|
|
26
|
+
throw new CliError(err, { exitCode: EXIT.usage });
|
|
27
|
+
return explicit;
|
|
28
|
+
}
|
|
29
|
+
if (!isGitHubActions(env)) {
|
|
30
|
+
throw new CliError('no stage given', {
|
|
31
|
+
hint: 'pass --stage <name> (CI derives it: pull requests → pr-<n>, main → prod)',
|
|
32
|
+
exitCode: EXIT.usage,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const event = readEvent(env);
|
|
36
|
+
const name = env.GITHUB_EVENT_NAME;
|
|
37
|
+
if (name === 'pull_request' || name === 'pull_request_target') {
|
|
38
|
+
const n = event.pull_request?.number ?? event.number;
|
|
39
|
+
if (!n)
|
|
40
|
+
throw new CliError('pull_request event without a PR number', { exitCode: EXIT.usage });
|
|
41
|
+
return previewStage(n);
|
|
42
|
+
}
|
|
43
|
+
const defaultBranch = event.repository?.default_branch ?? 'main';
|
|
44
|
+
if (env.GITHUB_REF === `refs/heads/${defaultBranch}`)
|
|
45
|
+
return PROD_STAGE;
|
|
46
|
+
throw new CliError(`can't derive a stage for ${name ?? 'this event'} on ${env.GITHUB_REF ?? 'unknown ref'}`, {
|
|
47
|
+
hint: 'pass --stage explicitly',
|
|
48
|
+
exitCode: EXIT.usage,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/** Commit metadata for the deployment record. */
|
|
52
|
+
export function gitInfo(cwd, env = process.env) {
|
|
53
|
+
if (isGitHubActions(env)) {
|
|
54
|
+
const event = readEvent(env);
|
|
55
|
+
return {
|
|
56
|
+
commit: event.pull_request?.head?.sha ?? env.GITHUB_SHA,
|
|
57
|
+
ref: event.pull_request?.head?.ref ? `refs/heads/${event.pull_request.head.ref}` : env.GITHUB_REF,
|
|
58
|
+
message: (event.pull_request?.title ?? event.head_commit?.message)?.split('\n')[0],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const git = (...args) => {
|
|
62
|
+
try {
|
|
63
|
+
return execFileSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const branch = git('rev-parse', '--abbrev-ref', 'HEAD');
|
|
70
|
+
return {
|
|
71
|
+
commit: git('rev-parse', 'HEAD'),
|
|
72
|
+
ref: branch ? `refs/heads/${branch}` : undefined,
|
|
73
|
+
message: git('log', '-1', '--format=%s'),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** GitHub Actions OIDC token for `audience` (requires `permissions: id-token: write`). */
|
|
77
|
+
export async function fetchOidcToken(audience, env = process.env) {
|
|
78
|
+
const url = env.ACTIONS_ID_TOKEN_REQUEST_URL;
|
|
79
|
+
const token = env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
|
|
80
|
+
if (!url || !token) {
|
|
81
|
+
throw new CliError('GitHub Actions OIDC is not available', {
|
|
82
|
+
hint: 'add `permissions: { id-token: write }` to the workflow',
|
|
83
|
+
exitCode: EXIT.auth,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
const res = await fetch(`${url}${url.includes('?') ? '&' : '?'}audience=${encodeURIComponent(audience)}`, {
|
|
87
|
+
headers: { authorization: `bearer ${token}`, accept: 'application/json' },
|
|
88
|
+
});
|
|
89
|
+
if (!res.ok)
|
|
90
|
+
throw new CliError(`OIDC token request failed: HTTP ${res.status}`, { exitCode: EXIT.auth });
|
|
91
|
+
const body = (await res.json());
|
|
92
|
+
if (!body.value)
|
|
93
|
+
throw new CliError('OIDC token response had no value', { exitCode: EXIT.auth });
|
|
94
|
+
return body.value;
|
|
95
|
+
}
|
|
96
|
+
export function canUseOidc(env = process.env) {
|
|
97
|
+
return isGitHubActions(env) && !!env.ACTIONS_ID_TOKEN_REQUEST_URL && !!env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
|
|
98
|
+
}
|
|
99
|
+
/** `key=value` into `$GITHUB_OUTPUT` (no-op outside Actions). */
|
|
100
|
+
export function setOutput(key, value, env = process.env) {
|
|
101
|
+
if (env.GITHUB_OUTPUT)
|
|
102
|
+
appendFileSync(env.GITHUB_OUTPUT, `${key}=${value}\n`);
|
|
103
|
+
}
|
|
104
|
+
export function appendStepSummary(markdown, env = process.env) {
|
|
105
|
+
if (env.GITHUB_STEP_SUMMARY)
|
|
106
|
+
appendFileSync(env.GITHUB_STEP_SUMMARY, `${markdown}\n`);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ericminassian/plat — programmatic API of the CLI. The foundation deploy
|
|
3
|
+
* and tests import `buildApp`; everything else is for the `plat` binary.
|
|
4
|
+
*/
|
|
5
|
+
export { ApiClient, ApiError, apiBaseUrl } from './api.ts';
|
|
6
|
+
export { type BuildOptions, type BuildResult, buildApp, bundleWorker, validateForBuild } from './build.ts';
|
|
7
|
+
export { configDir, credentialsPath, loadCredentials, type StoredCredentials } from './credentials.ts';
|
|
8
|
+
export { type DeployOptions, type DeployResult, deploy, presignedPostForm, waitForDeployment, } from './deploy.ts';
|
|
9
|
+
export { type LocalStage, localEnv, startLocalStage } from './dev/local-stage.ts';
|
|
10
|
+
export { deriveStage, fetchOidcToken, gitInfo, isGitHubActions } from './github.ts';
|
|
11
|
+
export { type InitOptions, type InitResult, initApp, TEMPLATE_APP_NAME } from './init.ts';
|
|
12
|
+
export { createProgram, main } from './main.ts';
|
|
13
|
+
export { findProjectRoot, loadProject, type Project } from './project.ts';
|
|
14
|
+
export { CliError, EXIT } from './util/output.ts';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ericminassian/plat — programmatic API of the CLI. The foundation deploy
|
|
3
|
+
* and tests import `buildApp`; everything else is for the `plat` binary.
|
|
4
|
+
*/
|
|
5
|
+
export { ApiClient, ApiError, apiBaseUrl } from './api.js';
|
|
6
|
+
export { buildApp, bundleWorker, validateForBuild } from './build.js';
|
|
7
|
+
export { configDir, credentialsPath, loadCredentials } from './credentials.js';
|
|
8
|
+
export { deploy, presignedPostForm, waitForDeployment, } from './deploy.js';
|
|
9
|
+
export { localEnv, startLocalStage } from './dev/local-stage.js';
|
|
10
|
+
export { deriveStage, fetchOidcToken, gitInfo, isGitHubActions } from './github.js';
|
|
11
|
+
export { initApp, TEMPLATE_APP_NAME } from './init.js';
|
|
12
|
+
export { createProgram, main } from './main.js';
|
|
13
|
+
export { findProjectRoot, loadProject } from './project.js';
|
|
14
|
+
export { CliError, EXIT } from './util/output.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAuC,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC3G,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAA0B,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAGL,MAAM,EACN,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAmB,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAqC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAgB,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** The app name used throughout `templates/app`; replaced on `plat init`. */
|
|
2
|
+
export declare const TEMPLATE_APP_NAME = "template-app";
|
|
3
|
+
export declare const TEMPLATE_PACKAGE_NAME = "platform-app-template";
|
|
4
|
+
/** Written into new apps so CI's corepack uses the same pnpm as the platform. */
|
|
5
|
+
export declare const PACKAGE_MANAGER = "pnpm@12.11.2";
|
|
6
|
+
/** Published CLI: `template/` inside the package. In this repo: `templates/app`. */
|
|
7
|
+
export declare function templateDir(): string;
|
|
8
|
+
export interface InitOptions {
|
|
9
|
+
dir: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
force?: boolean;
|
|
12
|
+
/** Version range written for platform packages. Default `^<cli version>`. */
|
|
13
|
+
versionRange?: string;
|
|
14
|
+
template?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface InitResult {
|
|
17
|
+
dir: string;
|
|
18
|
+
name: string;
|
|
19
|
+
files: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function initApp(opts: InitOptions): InitResult;
|
|
22
|
+
export declare function replaceAppName(content: string, name: string): string;
|
|
23
|
+
export declare function rewritePackageJson(content: string, name: string, range: string): string;
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { basename, dirname, extname, join, relative, resolve } from 'node:path';
|
|
3
|
+
import { validateAppName } from '@ericminassian/platform-core';
|
|
4
|
+
import { cliPackageRoot, cliVersion } from './project.js';
|
|
5
|
+
import { CliError, EXIT } from './util/output.js';
|
|
6
|
+
/** The app name used throughout `templates/app`; replaced on `plat init`. */
|
|
7
|
+
export const TEMPLATE_APP_NAME = 'template-app';
|
|
8
|
+
export const TEMPLATE_PACKAGE_NAME = 'platform-app-template';
|
|
9
|
+
/** Written into new apps so CI's corepack uses the same pnpm as the platform. */
|
|
10
|
+
export const PACKAGE_MANAGER = 'pnpm@12.11.2';
|
|
11
|
+
const SKIP = new Set(['node_modules', '.plat', 'dist', 'coverage', '.turbo']);
|
|
12
|
+
const TEXT_EXT = new Set([
|
|
13
|
+
'.ts',
|
|
14
|
+
'.tsx',
|
|
15
|
+
'.js',
|
|
16
|
+
'.mjs',
|
|
17
|
+
'.cjs',
|
|
18
|
+
'.json',
|
|
19
|
+
'.md',
|
|
20
|
+
'.html',
|
|
21
|
+
'.css',
|
|
22
|
+
'.yml',
|
|
23
|
+
'.yaml',
|
|
24
|
+
'.txt',
|
|
25
|
+
'.gitignore',
|
|
26
|
+
'',
|
|
27
|
+
]);
|
|
28
|
+
/** Published CLI: `template/` inside the package. In this repo: `templates/app`. */
|
|
29
|
+
export function templateDir() {
|
|
30
|
+
const packaged = join(cliPackageRoot(), 'template');
|
|
31
|
+
if (existsSync(join(packaged, 'platform.json')))
|
|
32
|
+
return packaged;
|
|
33
|
+
const repo = resolve(cliPackageRoot(), '..', '..', 'templates', 'app');
|
|
34
|
+
if (existsSync(join(repo, 'platform.json')))
|
|
35
|
+
return repo;
|
|
36
|
+
throw new CliError('app template not found (broken CLI install?)');
|
|
37
|
+
}
|
|
38
|
+
export function initApp(opts) {
|
|
39
|
+
const dir = resolve(opts.dir);
|
|
40
|
+
const name = opts.name ?? basename(dir);
|
|
41
|
+
const err = validateAppName(name);
|
|
42
|
+
if (err)
|
|
43
|
+
throw new CliError(`invalid app name: ${err}`, { exitCode: EXIT.usage });
|
|
44
|
+
if (existsSync(dir) && readdirSync(dir).filter((f) => f !== '.git').length > 0 && !opts.force) {
|
|
45
|
+
throw new CliError(`${dir} is not empty`, {
|
|
46
|
+
hint: 'choose an empty directory or pass --force',
|
|
47
|
+
exitCode: EXIT.usage,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const src = opts.template ?? templateDir();
|
|
51
|
+
const range = opts.versionRange ?? `^${cliVersion()}`;
|
|
52
|
+
const files = copyTree(src, dir, (rel, content) => rel === 'package.json' ? rewritePackageJson(content, name, range) : replaceAppName(content, name));
|
|
53
|
+
return { dir, name, files: files.sort() };
|
|
54
|
+
}
|
|
55
|
+
export function replaceAppName(content, name) {
|
|
56
|
+
return content.split(TEMPLATE_APP_NAME).join(name);
|
|
57
|
+
}
|
|
58
|
+
export function rewritePackageJson(content, name, range) {
|
|
59
|
+
const pkg = JSON.parse(content);
|
|
60
|
+
pkg.name = name;
|
|
61
|
+
pkg.packageManager ??= PACKAGE_MANAGER;
|
|
62
|
+
for (const field of ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies']) {
|
|
63
|
+
const deps = pkg[field];
|
|
64
|
+
if (!deps)
|
|
65
|
+
continue;
|
|
66
|
+
for (const [dep, v] of Object.entries(deps))
|
|
67
|
+
if (v.startsWith('workspace:'))
|
|
68
|
+
deps[dep] = range;
|
|
69
|
+
}
|
|
70
|
+
return `${JSON.stringify(pkg, null, 2)}\n`;
|
|
71
|
+
}
|
|
72
|
+
/** Copies `src` to `dest`, transforming text files; returns the written paths (relative). */
|
|
73
|
+
function copyTree(src, dest, transform) {
|
|
74
|
+
const written = [];
|
|
75
|
+
const walk = (from) => {
|
|
76
|
+
for (const entry of readdirSync(from, { withFileTypes: true })) {
|
|
77
|
+
if (SKIP.has(entry.name))
|
|
78
|
+
continue;
|
|
79
|
+
const abs = join(from, entry.name);
|
|
80
|
+
const rel = relative(src, abs).split('\\').join('/');
|
|
81
|
+
if (rel === 'web/dist')
|
|
82
|
+
continue;
|
|
83
|
+
if (entry.isDirectory()) {
|
|
84
|
+
walk(abs);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// npm drops `.gitignore` from packages, so the published template stores `_gitignore`.
|
|
88
|
+
const outRel = rel.replace(/(^|\/)_gitignore$/, '$1.gitignore');
|
|
89
|
+
const target = join(dest, outRel);
|
|
90
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
91
|
+
const isText = TEXT_EXT.has(extname(entry.name)) && statSync(abs).size < 1_000_000;
|
|
92
|
+
if (isText)
|
|
93
|
+
writeFileSync(target, transform(outRel, readFileSync(abs, 'utf8')));
|
|
94
|
+
else
|
|
95
|
+
copyFileSync(abs, target);
|
|
96
|
+
written.push(outRel);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
walk(src);
|
|
100
|
+
return written;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
ADDED
package/dist/main.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { registerAccount } from './commands/account.js';
|
|
3
|
+
import { registerApps } from './commands/apps.js';
|
|
4
|
+
import { registerLifecycle } from './commands/lifecycle.js';
|
|
5
|
+
import { registerManage } from './commands/manage.js';
|
|
6
|
+
import { registerObserve } from './commands/observe.js';
|
|
7
|
+
import { cliVersion } from './project.js';
|
|
8
|
+
export function createProgram() {
|
|
9
|
+
const program = new Command('plat')
|
|
10
|
+
.description('The platform CLI: create, run locally (AWS Emulator), deploy and observe apps.\nEvery command accepts --json for machine-readable output.')
|
|
11
|
+
.version(cliVersion(), '-v, --version')
|
|
12
|
+
.showHelpAfterError('(run with --help for usage)')
|
|
13
|
+
.configureHelp({ sortSubcommands: false });
|
|
14
|
+
registerLifecycle(program);
|
|
15
|
+
registerApps(program);
|
|
16
|
+
registerAccount(program);
|
|
17
|
+
registerObserve(program);
|
|
18
|
+
registerManage(program);
|
|
19
|
+
return program;
|
|
20
|
+
}
|
|
21
|
+
export async function main(argv) {
|
|
22
|
+
await createProgram().parseAsync(argv);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAChC,WAAW,CACV,2IAA2I,CAC5I;SACA,OAAO,CAAC,UAAU,EAAE,EAAE,eAAe,CAAC;SACtC,kBAAkB,CAAC,6BAA6B,CAAC;SACjD,aAAa,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;IAE7C,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ResolvedManifest } from '@ericminassian/platform-core';
|
|
2
|
+
export declare const MANIFEST_FILE = "platform.json";
|
|
3
|
+
export interface Project {
|
|
4
|
+
/** Directory containing platform.json. */
|
|
5
|
+
root: string;
|
|
6
|
+
/** platform.json as written. */
|
|
7
|
+
raw: Record<string, unknown>;
|
|
8
|
+
manifest: ResolvedManifest;
|
|
9
|
+
}
|
|
10
|
+
/** Walk up from `cwd` to the nearest platform.json. */
|
|
11
|
+
export declare function findProjectRoot(cwd: string): string | null;
|
|
12
|
+
export declare function loadProject(cwd: string): Project;
|
|
13
|
+
/** App name from `--app`, else the nearest platform.json. */
|
|
14
|
+
export declare function resolveAppName(opt: string | undefined, cwd?: string): string;
|
|
15
|
+
export declare function cliVersion(): string;
|
|
16
|
+
export declare function cliPackageRoot(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a module the way the *app* would (its own node_modules first), so
|
|
19
|
+
* the server wrapper and app code share one copy of the SDK. Falls back to the
|
|
20
|
+
* CLI's own dependency.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveFromApp(appRoot: string, specifier: string): string;
|