@mesh-tech/mesh-cli 0.35.2 → 0.37.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/assets/docs-preview.css +1599 -0
- package/dist/bin/mesh.auth-preflight-JFKL4Y4X.js +48 -0
- package/dist/bin/mesh.auth-preflight-JFKL4Y4X.js.map +6 -0
- package/dist/bin/mesh.capture-history-A4IAVVIR.js +38 -0
- package/dist/bin/mesh.capture-history-A4IAVVIR.js.map +6 -0
- package/dist/bin/mesh.chunk-5A5OFSYR.js +187 -0
- package/dist/bin/mesh.chunk-5A5OFSYR.js.map +6 -0
- package/dist/bin/mesh.chunk-7DMAFUBQ.js +7715 -0
- package/dist/bin/mesh.chunk-7DMAFUBQ.js.map +6 -0
- package/dist/bin/mesh.chunk-A4DGMGHF.js +303 -0
- package/dist/bin/mesh.chunk-A4DGMGHF.js.map +6 -0
- package/dist/bin/mesh.chunk-CQ2IC4OP.js +217 -0
- package/dist/bin/mesh.chunk-CQ2IC4OP.js.map +6 -0
- package/dist/bin/mesh.chunk-F4654EPX.js +383 -0
- package/dist/bin/mesh.chunk-F4654EPX.js.map +6 -0
- package/dist/bin/mesh.chunk-IQOBTL42.js +60 -0
- package/dist/bin/mesh.chunk-IQOBTL42.js.map +6 -0
- package/dist/bin/mesh.chunk-J6DVWKRW.js +647 -0
- package/dist/bin/mesh.chunk-J6DVWKRW.js.map +6 -0
- package/dist/bin/mesh.chunk-JB7FWYSP.js +1751 -0
- package/dist/bin/mesh.chunk-JB7FWYSP.js.map +6 -0
- package/dist/bin/mesh.chunk-MCBMHWXP.js +837 -0
- package/dist/bin/mesh.chunk-MCBMHWXP.js.map +6 -0
- package/dist/bin/mesh.chunk-OW5EMVG5.js +507 -0
- package/dist/bin/mesh.chunk-OW5EMVG5.js.map +6 -0
- package/dist/bin/mesh.chunk-R5VVTXG4.js +10092 -0
- package/dist/bin/mesh.chunk-R5VVTXG4.js.map +6 -0
- package/dist/bin/mesh.chunk-VKV6Z3UI.js +1146 -0
- package/dist/bin/mesh.chunk-VKV6Z3UI.js.map +6 -0
- package/dist/bin/mesh.chunk-WFFDF346.js +59 -0
- package/dist/bin/mesh.chunk-WFFDF346.js.map +6 -0
- package/dist/bin/mesh.chunk-WOJOTUFZ.js +835 -0
- package/dist/bin/mesh.chunk-WOJOTUFZ.js.map +6 -0
- package/dist/bin/mesh.cli-reference-H3TOPIET.js +158 -0
- package/dist/bin/mesh.cli-reference-H3TOPIET.js.map +6 -0
- package/dist/bin/mesh.convert-KK6ZP256.js +274 -0
- package/dist/bin/mesh.convert-KK6ZP256.js.map +6 -0
- package/dist/bin/mesh.create-app-A5F45PWZ.js +39 -0
- package/dist/bin/mesh.create-app-A5F45PWZ.js.map +6 -0
- package/dist/bin/mesh.dev-token-server-GYDYPXYH.js +61 -0
- package/dist/bin/mesh.dev-token-server-GYDYPXYH.js.map +6 -0
- package/dist/bin/mesh.js +20 -26414
- package/dist/bin/mesh.js.map +3 -3
- package/dist/bin/mesh.login-JNHPVMCT.js +91 -0
- package/dist/bin/mesh.login-JNHPVMCT.js.map +6 -0
- package/dist/bin/mesh.platform-setup-EB64EFRN.js +37 -0
- package/dist/bin/mesh.platform-setup-EB64EFRN.js.map +6 -0
- package/dist/bin/mesh.preview-3IP34TDO.js +2410 -0
- package/dist/bin/mesh.preview-3IP34TDO.js.map +6 -0
- package/dist/bin/mesh.program-DWOKHNMQ.js +23 -0
- package/dist/bin/mesh.program-DWOKHNMQ.js.map +6 -0
- package/dist/bin/mesh.registry-OXF57OQW.js +47 -0
- package/dist/bin/mesh.registry-OXF57OQW.js.map +6 -0
- package/dist/bin/mesh.registry-identity-2HSGQGJC.js +42 -0
- package/dist/bin/mesh.registry-identity-2HSGQGJC.js.map +6 -0
- package/dist/bin/mesh.skills-MNDSMBIE.js +23 -0
- package/dist/bin/mesh.skills-MNDSMBIE.js.map +6 -0
- package/dist/bin/mesh.src-5D5DFSLX.js +1302 -0
- package/dist/bin/mesh.src-5D5DFSLX.js.map +6 -0
- package/dist/bin/mesh.src-G7TJBLNJ.js +40 -0
- package/dist/bin/mesh.src-G7TJBLNJ.js.map +6 -0
- package/dist/bin/mesh.stack-EFTFAOCV.js +64 -0
- package/dist/bin/mesh.stack-EFTFAOCV.js.map +6 -0
- package/dist/bin/mesh.start-ARIIY6CV.js +454 -0
- package/dist/bin/mesh.start-ARIIY6CV.js.map +6 -0
- package/dist/bin/mesh.wizard-ROAQAGSF.js +500 -0
- package/dist/bin/mesh.wizard-ROAQAGSF.js.map +6 -0
- package/dist/build-info.json +2 -2
- package/dist/src/commands/app-check.d.ts +2 -1
- package/dist/src/commands/app-check.js +32 -0
- package/dist/src/commands/create-app.d.ts +1 -0
- package/dist/src/commands/create-app.js +4 -0
- package/dist/src/commands/dev.d.ts +6 -0
- package/dist/src/commands/dev.js +152 -3
- package/dist/src/commands/docs.js +33 -0
- package/dist/src/commands/local/act-as-local.d.ts +5 -0
- package/dist/src/commands/local/act-as-local.js +41 -0
- package/dist/src/commands/local/auth-provision.d.ts +1 -0
- package/dist/src/commands/local/auth-provision.js +1 -0
- package/dist/src/commands/local/index.js +4 -0
- package/dist/src/commands/local/local-api-key.d.ts +44 -0
- package/dist/src/commands/local/local-api-key.js +115 -0
- package/dist/src/commands/local/local-spicedb.d.ts +95 -0
- package/dist/src/commands/local/local-spicedb.js +304 -0
- package/dist/src/commands/local/publish-docs.d.ts +81 -0
- package/dist/src/commands/local/publish-docs.js +328 -0
- package/dist/src/commands/local/seed-zitadel.js +2 -0
- package/dist/src/commands/temporal.js +191 -61
- package/dist/src/commands/temporal.js.map +3 -3
- package/dist/src/docs/convert.d.ts +35 -0
- package/dist/src/docs/convert.js +276 -0
- package/dist/src/docs/preview-source.d.ts +13 -0
- package/dist/src/docs/preview-source.js +58 -0
- package/dist/src/docs/preview.d.ts +32 -0
- package/dist/src/docs/preview.js +279 -0
- package/dist/src/utils/scaffold-versions.d.ts +1 -0
- package/dist/src/utils/scaffold-versions.js +1 -0
- package/fragments/agents/AGENTS.md.hbs +27 -27
- package/fragments/base/README.md.hbs +5 -2
- package/fragments/base/index.ts.hbs +22 -33
- package/fragments/base/package.json.hbs +5 -1
- package/fragments/service/api/openapi.json.hbs +1 -1
- package/fragments/service/docs/docs.yaml.hbs +10 -0
- package/fragments/service/docs/pages/getting-started.md.hbs +6 -9
- package/package.json +19 -3
- package/skills/mesh/SKILL.md +2 -2
- package/stack/docker-compose.hub.yml +6 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import {
|
|
2
|
+
RESERVED_REGISTRY_CONTEXT,
|
|
3
|
+
clearContextConfig,
|
|
4
|
+
clearCredentials,
|
|
5
|
+
decodeJwtPayload,
|
|
6
|
+
discoverConfigFromWellKnown,
|
|
7
|
+
firstPartyDomainFor,
|
|
8
|
+
forceRefreshToken,
|
|
9
|
+
getContextConfig,
|
|
10
|
+
getValidToken,
|
|
11
|
+
projectRoleKeys,
|
|
12
|
+
readAllContextConfigs,
|
|
13
|
+
readAllCredentials,
|
|
14
|
+
readCredentials,
|
|
15
|
+
runLoginFlow,
|
|
16
|
+
tokenStillValid,
|
|
17
|
+
writeContextConfig
|
|
18
|
+
} from "./mesh.chunk-R5VVTXG4.js";
|
|
19
|
+
import {
|
|
20
|
+
logInfo
|
|
21
|
+
} from "./mesh.chunk-WFFDF346.js";
|
|
22
|
+
import {
|
|
23
|
+
MeshCliError
|
|
24
|
+
} from "./mesh.chunk-IQOBTL42.js";
|
|
25
|
+
|
|
26
|
+
// packages/mesh-cli/src/utils/registry-broker.ts
|
|
27
|
+
var PUBLISHED_BROKER_TIMEOUT_MS = 15e3;
|
|
28
|
+
function deriveRegistryBroker(context, getCfg = getContextConfig) {
|
|
29
|
+
const cfg = getCfg(context);
|
|
30
|
+
if (!cfg?.issuer) return null;
|
|
31
|
+
try {
|
|
32
|
+
const u = new URL(cfg.issuer);
|
|
33
|
+
const parts = u.hostname.split(".");
|
|
34
|
+
parts[0] = "registry-auth";
|
|
35
|
+
return `https://${parts.join(".")}`;
|
|
36
|
+
} catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function classifyBrokerResponse(res) {
|
|
41
|
+
if (res.status === 401) return { ok: false, failure: { kind: "unauthenticated" } };
|
|
42
|
+
if (res.status === 403) {
|
|
43
|
+
const body2 = await res.json().catch(() => ({}));
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
failure: {
|
|
47
|
+
kind: "not-authorized",
|
|
48
|
+
email: typeof body2.email === "string" ? body2.email : void 0,
|
|
49
|
+
requiredRoles: Array.isArray(body2.requiredRoles) ? body2.requiredRoles.filter((r) => typeof r === "string") : void 0,
|
|
50
|
+
requestUrl: typeof body2.requestUrl === "string" ? body2.requestUrl : void 0
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (res.status !== 200) {
|
|
55
|
+
return { ok: false, failure: { kind: "unavailable", detail: `broker returned ${res.status}` } };
|
|
56
|
+
}
|
|
57
|
+
let body;
|
|
58
|
+
try {
|
|
59
|
+
body = await res.json();
|
|
60
|
+
} catch (err) {
|
|
61
|
+
return {
|
|
62
|
+
ok: false,
|
|
63
|
+
failure: { kind: "unavailable", detail: `malformed broker response: ${err.message}` }
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const { endpoint, authorizationToken, scope, expiresAt } = body;
|
|
67
|
+
if (typeof endpoint !== "string" || !endpoint || typeof authorizationToken !== "string" || !authorizationToken) {
|
|
68
|
+
return {
|
|
69
|
+
ok: false,
|
|
70
|
+
failure: { kind: "unavailable", detail: "broker response missing endpoint or authorizationToken" }
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
ok: true,
|
|
75
|
+
grant: {
|
|
76
|
+
scope: typeof scope === "string" && scope ? scope : "@mesh-tech",
|
|
77
|
+
endpoint,
|
|
78
|
+
authorizationToken,
|
|
79
|
+
expiresAt: typeof expiresAt === "string" ? expiresAt : void 0
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async function fetchRegistryGrant(context, brokerUrl, deps) {
|
|
84
|
+
const token = await deps.getValidToken(context);
|
|
85
|
+
if (!token) return { ok: false, failure: { kind: "no-session" } };
|
|
86
|
+
const doFetch = deps.fetchFn ?? fetch;
|
|
87
|
+
const controller = new AbortController();
|
|
88
|
+
const timer = setTimeout(() => controller.abort(), deps.timeoutMs ?? PUBLISHED_BROKER_TIMEOUT_MS);
|
|
89
|
+
try {
|
|
90
|
+
const res = await doFetch(`${brokerUrl.replace(/\/+$/, "")}/token`, {
|
|
91
|
+
method: "POST",
|
|
92
|
+
headers: { authorization: `Bearer ${token}` },
|
|
93
|
+
signal: controller.signal
|
|
94
|
+
});
|
|
95
|
+
return await classifyBrokerResponse(res);
|
|
96
|
+
} catch (err) {
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
failure: { kind: "unavailable", detail: err.message }
|
|
100
|
+
};
|
|
101
|
+
} finally {
|
|
102
|
+
clearTimeout(timer);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function realGrantDeps() {
|
|
106
|
+
return { getValidToken: (c) => getValidToken(c) };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// packages/mesh-cli/src/utils/registry-identity.ts
|
|
110
|
+
var REGISTRY_ALIAS = "mesh.dev";
|
|
111
|
+
var REGISTRY_DOMAIN = (() => {
|
|
112
|
+
const domain = firstPartyDomainFor(REGISTRY_ALIAS);
|
|
113
|
+
if (!domain) {
|
|
114
|
+
throw new Error(`FIRST_PARTY_CONTEXTS has no entry for the registry alias "${REGISTRY_ALIAS}"`);
|
|
115
|
+
}
|
|
116
|
+
return domain;
|
|
117
|
+
})();
|
|
118
|
+
var REGISTRY_CREDENTIAL_KEY = RESERVED_REGISTRY_CONTEXT;
|
|
119
|
+
function isReservedRegistryContext(context) {
|
|
120
|
+
return context === REGISTRY_CREDENTIAL_KEY;
|
|
121
|
+
}
|
|
122
|
+
var RegistryIdentityError = class extends MeshCliError {
|
|
123
|
+
constructor(detail) {
|
|
124
|
+
super(
|
|
125
|
+
`Could not resolve the Mesh package registry (${detail}).
|
|
126
|
+
Discovery endpoint: https://cli.${REGISTRY_DOMAIN}/.well-known/mesh.json`,
|
|
127
|
+
{ remediation: { command: "mesh registry login # retry once you are online" } }
|
|
128
|
+
);
|
|
129
|
+
this.name = "RegistryIdentityError";
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
function toIdentity(cfg) {
|
|
133
|
+
if (!cfg?.issuer || !cfg.clientId) return null;
|
|
134
|
+
const registryBroker = cfg.registryBroker ?? deriveRegistryBroker(REGISTRY_CREDENTIAL_KEY, () => cfg);
|
|
135
|
+
if (!registryBroker) return null;
|
|
136
|
+
return {
|
|
137
|
+
issuer: cfg.issuer,
|
|
138
|
+
clientId: cfg.clientId,
|
|
139
|
+
registryBroker,
|
|
140
|
+
discoveredAt: cfg.discoveredAt ?? (/* @__PURE__ */ new Date(0)).toISOString()
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async function resolveRegistryIdentity(opts = {}) {
|
|
144
|
+
if (!opts.refresh) {
|
|
145
|
+
const cached = toIdentity(getContextConfig(REGISTRY_CREDENTIAL_KEY));
|
|
146
|
+
if (cached) return cached;
|
|
147
|
+
}
|
|
148
|
+
const discovered = await discoverConfigFromWellKnown(REGISTRY_DOMAIN, REGISTRY_CREDENTIAL_KEY, {
|
|
149
|
+
quiet: true
|
|
150
|
+
});
|
|
151
|
+
if (!discovered) {
|
|
152
|
+
throw new RegistryIdentityError(
|
|
153
|
+
`discovery on ${REGISTRY_DOMAIN} failed \u2014 are you online?`
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
const stored = { ...discovered, discoveredAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
157
|
+
const identity = toIdentity(stored);
|
|
158
|
+
if (!identity) {
|
|
159
|
+
throw new RegistryIdentityError(`the discovery document names no registry broker`);
|
|
160
|
+
}
|
|
161
|
+
writeContextConfig(REGISTRY_CREDENTIAL_KEY, stored);
|
|
162
|
+
return identity;
|
|
163
|
+
}
|
|
164
|
+
function registrySessionCandidates(issuer, configs = readAllContextConfigs(), credentials = readAllCredentials()) {
|
|
165
|
+
const names = issuer ? [REGISTRY_CREDENTIAL_KEY, REGISTRY_ALIAS, REGISTRY_DOMAIN] : [REGISTRY_CREDENTIAL_KEY];
|
|
166
|
+
return names.filter((name) => {
|
|
167
|
+
if (!(name in credentials)) return false;
|
|
168
|
+
const cfg = configs[name];
|
|
169
|
+
if (!cfg?.issuer) return false;
|
|
170
|
+
return issuer ? cfg.issuer === issuer : true;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
function readRegistrySession() {
|
|
174
|
+
const identity = toIdentity(getContextConfig(REGISTRY_CREDENTIAL_KEY));
|
|
175
|
+
for (const context of registrySessionCandidates(identity?.issuer ?? null)) {
|
|
176
|
+
const creds = readCredentials(context);
|
|
177
|
+
if (creds && tokenStillValid(creds.expiresAt)) {
|
|
178
|
+
return { context, email: creds.email ?? "unknown", expiresAt: creds.expiresAt };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
async function ensureRegistrySession(opts) {
|
|
184
|
+
let identity;
|
|
185
|
+
try {
|
|
186
|
+
identity = await resolveRegistryIdentity();
|
|
187
|
+
} catch (err) {
|
|
188
|
+
return { ok: false, reason: "no-identity", detail: err.message };
|
|
189
|
+
}
|
|
190
|
+
for (const context of registrySessionCandidates(identity.issuer)) {
|
|
191
|
+
const token = await getValidToken(context);
|
|
192
|
+
if (!token) continue;
|
|
193
|
+
const creds2 = readCredentials(context);
|
|
194
|
+
if (creds2) return { ok: true, context, email: creds2.email ?? "unknown", expiresAt: creds2.expiresAt };
|
|
195
|
+
}
|
|
196
|
+
if (!opts.interactive) {
|
|
197
|
+
return {
|
|
198
|
+
ok: false,
|
|
199
|
+
reason: "no-tty",
|
|
200
|
+
detail: "no registry session is cached and this run cannot open a sign-in"
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const stored = getContextConfig(REGISTRY_CREDENTIAL_KEY);
|
|
204
|
+
if (!stored) {
|
|
205
|
+
writeContextConfig(REGISTRY_CREDENTIAL_KEY, {
|
|
206
|
+
issuer: identity.issuer,
|
|
207
|
+
clientId: identity.clientId,
|
|
208
|
+
registryBroker: identity.registryBroker
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
logInfo(
|
|
212
|
+
opts.device ? "No registry session \u2014 sign in with the device code below\u2026" : "No registry session \u2014 opening your browser to sign in\u2026 (headless? use --device)"
|
|
213
|
+
);
|
|
214
|
+
try {
|
|
215
|
+
await runLoginFlow(REGISTRY_CREDENTIAL_KEY, identity, { device: opts.device });
|
|
216
|
+
} catch (err) {
|
|
217
|
+
return { ok: false, reason: "login-failed", detail: err.message };
|
|
218
|
+
}
|
|
219
|
+
const creds = readCredentials(REGISTRY_CREDENTIAL_KEY);
|
|
220
|
+
if (!creds) {
|
|
221
|
+
return { ok: false, reason: "login-failed", detail: "sign-in completed but no session was cached" };
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
ok: true,
|
|
225
|
+
context: REGISTRY_CREDENTIAL_KEY,
|
|
226
|
+
email: creds.email ?? "unknown",
|
|
227
|
+
expiresAt: creds.expiresAt
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function registryTokenRoles(idToken) {
|
|
231
|
+
if (!idToken) return [];
|
|
232
|
+
try {
|
|
233
|
+
return projectRoleKeys(decodeJwtPayload(idToken)).sort();
|
|
234
|
+
} catch {
|
|
235
|
+
return [];
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function registryAccountState(idToken) {
|
|
239
|
+
if (!idToken) return {};
|
|
240
|
+
let claims = null;
|
|
241
|
+
try {
|
|
242
|
+
claims = decodeJwtPayload(idToken);
|
|
243
|
+
} catch {
|
|
244
|
+
return {};
|
|
245
|
+
}
|
|
246
|
+
if (!claims) return {};
|
|
247
|
+
const email = typeof claims.email === "string" ? claims.email : void 0;
|
|
248
|
+
const verified = claims.email_verified;
|
|
249
|
+
return { email, emailVerified: typeof verified === "boolean" ? verified : void 0 };
|
|
250
|
+
}
|
|
251
|
+
async function refreshRegistrySession(context) {
|
|
252
|
+
const before = registryTokenRoles(readCredentials(context)?.idToken);
|
|
253
|
+
const idToken = await forceRefreshToken(context);
|
|
254
|
+
if (!idToken) return { reminted: false, rolesChanged: false };
|
|
255
|
+
const after = registryTokenRoles(idToken);
|
|
256
|
+
const same = after.length === before.length && after.every((role, i) => role === before[i]);
|
|
257
|
+
return { reminted: true, rolesChanged: !same };
|
|
258
|
+
}
|
|
259
|
+
function clearRegistrySession() {
|
|
260
|
+
clearCredentials(REGISTRY_CREDENTIAL_KEY);
|
|
261
|
+
clearContextConfig(REGISTRY_CREDENTIAL_KEY);
|
|
262
|
+
}
|
|
263
|
+
function identityChanged(before, after) {
|
|
264
|
+
return before.issuer !== after.issuer || before.clientId !== after.clientId || before.registryBroker !== after.registryBroker;
|
|
265
|
+
}
|
|
266
|
+
function describeSessionExpiry(expiresAt, now = Date.now()) {
|
|
267
|
+
const ms = new Date(expiresAt).getTime() - now;
|
|
268
|
+
if (!(ms > 0)) return "expired";
|
|
269
|
+
const totalMinutes = Math.floor(ms / 6e4);
|
|
270
|
+
const h = Math.floor(totalMinutes / 60);
|
|
271
|
+
const m = totalMinutes % 60;
|
|
272
|
+
return h > 0 ? `${h}h ${m}m` : `${m}m`;
|
|
273
|
+
}
|
|
274
|
+
function logRegistryIdentity(identity) {
|
|
275
|
+
let host = identity.registryBroker;
|
|
276
|
+
try {
|
|
277
|
+
host = new URL(identity.registryBroker).host;
|
|
278
|
+
} catch {
|
|
279
|
+
}
|
|
280
|
+
logInfo(`Mesh package registry: mesh-platform (broker ${host})`);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export {
|
|
284
|
+
PUBLISHED_BROKER_TIMEOUT_MS,
|
|
285
|
+
fetchRegistryGrant,
|
|
286
|
+
realGrantDeps,
|
|
287
|
+
REGISTRY_ALIAS,
|
|
288
|
+
REGISTRY_DOMAIN,
|
|
289
|
+
REGISTRY_CREDENTIAL_KEY,
|
|
290
|
+
isReservedRegistryContext,
|
|
291
|
+
RegistryIdentityError,
|
|
292
|
+
resolveRegistryIdentity,
|
|
293
|
+
registrySessionCandidates,
|
|
294
|
+
readRegistrySession,
|
|
295
|
+
ensureRegistrySession,
|
|
296
|
+
registryTokenRoles,
|
|
297
|
+
registryAccountState,
|
|
298
|
+
refreshRegistrySession,
|
|
299
|
+
clearRegistrySession,
|
|
300
|
+
identityChanged,
|
|
301
|
+
describeSessionExpiry,
|
|
302
|
+
logRegistryIdentity
|
|
303
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/registry-broker.ts", "../../src/utils/registry-identity.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["body", "creds"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MeshCliError
|
|
3
|
+
} from "./mesh.chunk-IQOBTL42.js";
|
|
4
|
+
|
|
5
|
+
// packages/mesh-cli/src/commands/init/platform-setup.ts
|
|
6
|
+
import * as fs from "fs";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import { execFileSync } from "child_process";
|
|
9
|
+
var PLATFORM_SETUP_DEFAULTS = {
|
|
10
|
+
env: "dev",
|
|
11
|
+
region: "us-east-2",
|
|
12
|
+
profile: "default"
|
|
13
|
+
};
|
|
14
|
+
var DOMAIN_REQUIRED_MESSAGE = "--domain is required: the core stack creates the public Route 53 zone <env>.<domain>, and a placeholder domain scaffolds a zone whose certificate can never validate, so ingress never serves HTTPS.";
|
|
15
|
+
function defaultStateBucket(tenant) {
|
|
16
|
+
return `${tenant}-mesh-platform-pulumi-state`;
|
|
17
|
+
}
|
|
18
|
+
function defaultPlatformDir(tenant) {
|
|
19
|
+
return `${tenant}-mesh-platform`;
|
|
20
|
+
}
|
|
21
|
+
function validateEnv(value) {
|
|
22
|
+
return /^[a-z][a-z0-9-]*$/.test(value.trim()) ? true : "lowercase letters, digits and dashes, starting with a letter";
|
|
23
|
+
}
|
|
24
|
+
function validateRegion(value) {
|
|
25
|
+
return /^[a-z]{2}(-[a-z]+)+-\d$/.test(value.trim()) ? true : "an AWS region, e.g. us-east-2 or eu-west-1";
|
|
26
|
+
}
|
|
27
|
+
function validateDomain(value) {
|
|
28
|
+
const domain = value.trim().toLowerCase().replace(/\.$/, "");
|
|
29
|
+
if (!domain) return "a public domain you control, e.g. q2poc.pub";
|
|
30
|
+
if (!/^(?=.{1,253}$)([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/.test(domain)) {
|
|
31
|
+
return "a public domain you control, e.g. q2poc.pub";
|
|
32
|
+
}
|
|
33
|
+
if (/(^|\.)(example\.(com|org|net)|invalid|localhost|test)$/.test(domain)) {
|
|
34
|
+
return `${domain} is a placeholder \u2014 its ACM certificate can never validate, because nobody can delegate that zone to you. Use a domain you control.`;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
function validateStateBucket(value) {
|
|
39
|
+
const bucket = value.trim();
|
|
40
|
+
return /^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/.test(bucket) && !bucket.includes("..") ? true : "3\u201363 characters: lowercase letters, digits, dots and dashes, starting and ending alphanumeric";
|
|
41
|
+
}
|
|
42
|
+
function resolveTargetDir(tenant, flags, cwd) {
|
|
43
|
+
const dir = path.resolve(cwd, flags.dir ?? defaultPlatformDir(tenant));
|
|
44
|
+
if (fs.existsSync(dir) && fs.readdirSync(dir).length > 0) {
|
|
45
|
+
throw new MeshCliError(`Target directory is not empty: ${dir}`, {
|
|
46
|
+
remediation: { command: `mesh init platform ${tenant} --dir <empty-dir>` }
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return dir;
|
|
50
|
+
}
|
|
51
|
+
async function resolvePlatformSetup(tenant, flags, deps) {
|
|
52
|
+
const cwd = deps.cwd ?? process.cwd();
|
|
53
|
+
const dir = resolveTargetDir(tenant, flags, cwd);
|
|
54
|
+
const ask = deps.interactive && !flags.yes ? deps.prompts : void 0;
|
|
55
|
+
const env = flags.env ?? (ask ? await ask.input({ message: "Environment", default: PLATFORM_SETUP_DEFAULTS.env, validate: validateEnv }) : PLATFORM_SETUP_DEFAULTS.env);
|
|
56
|
+
if (validateEnv(env) !== true) throw new MeshCliError(`Invalid environment '${env}' \u2014 ${validateEnv(env)}.`);
|
|
57
|
+
const region = flags.region ?? (ask ? await ask.input({ message: "AWS region", default: PLATFORM_SETUP_DEFAULTS.region, validate: validateRegion }) : PLATFORM_SETUP_DEFAULTS.region);
|
|
58
|
+
if (validateRegion(region) !== true) throw new MeshCliError(`Invalid region '${region}' \u2014 ${validateRegion(region)}.`);
|
|
59
|
+
let domain = flags.domain;
|
|
60
|
+
if (domain === void 0) {
|
|
61
|
+
if (!ask) throw new MeshCliError(DOMAIN_REQUIRED_MESSAGE, { remediation: { command: `mesh init platform ${tenant} --domain <your-domain>` } });
|
|
62
|
+
domain = await ask.input({
|
|
63
|
+
message: `Public base domain (the core stack creates the Route 53 zone ${env}.<domain>; its NS records must be delegated from the parent before the deploy can finish)`,
|
|
64
|
+
validate: validateDomain
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const domainCheck = validateDomain(domain);
|
|
68
|
+
if (domainCheck !== true) throw new MeshCliError(`Invalid --domain '${domain}' \u2014 ${domainCheck}`);
|
|
69
|
+
domain = domain.trim().toLowerCase().replace(/\.$/, "");
|
|
70
|
+
const profile = flags.profile ?? (ask ? await ask.input({ message: "AWS profile the stack config references", default: PLATFORM_SETUP_DEFAULTS.profile }) : PLATFORM_SETUP_DEFAULTS.profile);
|
|
71
|
+
const bucketDefault = defaultStateBucket(tenant);
|
|
72
|
+
const stateBucket = flags.stateBucket ?? (ask ? await ask.input({ message: "Pulumi state S3 bucket (holds this platform's state \u2014 created below if it does not exist)", default: bucketDefault, validate: validateStateBucket }) : bucketDefault);
|
|
73
|
+
const bucketCheck = validateStateBucket(stateBucket);
|
|
74
|
+
if (bucketCheck !== true) throw new MeshCliError(`Invalid --state-bucket '${stateBucket}' \u2014 ${bucketCheck}`);
|
|
75
|
+
let createStateBucket = flags.createStateBucket ?? false;
|
|
76
|
+
if (flags.createStateBucket === void 0 && ask) {
|
|
77
|
+
createStateBucket = await ask.confirm({
|
|
78
|
+
message: `Create s3://${stateBucket} in ${region} now (versioned), if it does not exist?`,
|
|
79
|
+
default: true
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
tenant,
|
|
84
|
+
env,
|
|
85
|
+
region,
|
|
86
|
+
domain,
|
|
87
|
+
profile,
|
|
88
|
+
stateBucket: stateBucket.trim(),
|
|
89
|
+
dir,
|
|
90
|
+
createStateBucket
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function stateBucketCreateCommand(setup) {
|
|
94
|
+
const location = setup.region === "us-east-1" ? "" : ` --create-bucket-configuration LocationConstraint=${setup.region}`;
|
|
95
|
+
return `aws s3api create-bucket --bucket ${setup.stateBucket} --region ${setup.region}${location} --profile ${setup.profile}`;
|
|
96
|
+
}
|
|
97
|
+
function awsJson(args, profile) {
|
|
98
|
+
return execFileSync("aws", [...args, "--profile", profile], {
|
|
99
|
+
encoding: "utf8",
|
|
100
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
var realStateBucketDeps = {
|
|
104
|
+
headBucket(setup) {
|
|
105
|
+
try {
|
|
106
|
+
awsJson(["s3api", "head-bucket", "--bucket", setup.stateBucket, "--region", setup.region], setup.profile);
|
|
107
|
+
return true;
|
|
108
|
+
} catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
createBucket(setup) {
|
|
113
|
+
const args = ["s3api", "create-bucket", "--bucket", setup.stateBucket, "--region", setup.region];
|
|
114
|
+
if (setup.region !== "us-east-1") args.push("--create-bucket-configuration", `LocationConstraint=${setup.region}`);
|
|
115
|
+
awsJson(args, setup.profile);
|
|
116
|
+
},
|
|
117
|
+
enableVersioning(setup) {
|
|
118
|
+
awsJson(
|
|
119
|
+
["s3api", "put-bucket-versioning", "--bucket", setup.stateBucket, "--region", setup.region, "--versioning-configuration", "Status=Enabled"],
|
|
120
|
+
setup.profile
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
async function ensureStateBucket(setup, deps = realStateBucketDeps) {
|
|
125
|
+
if (!setup.createStateBucket) {
|
|
126
|
+
return { created: false, present: false, detail: "not requested" };
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
if (deps.headBucket(setup)) {
|
|
130
|
+
return { created: false, present: true, detail: `s3://${setup.stateBucket} already exists` };
|
|
131
|
+
}
|
|
132
|
+
} catch {
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
deps.createBucket(setup);
|
|
136
|
+
} catch (err) {
|
|
137
|
+
const why = errorDetail(err);
|
|
138
|
+
return { created: false, present: false, detail: `could not create s3://${setup.stateBucket} \u2014 ${why}` };
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
deps.enableVersioning(setup);
|
|
142
|
+
return { created: true, present: true, detail: `created s3://${setup.stateBucket} in ${setup.region} (versioning on)` };
|
|
143
|
+
} catch (err) {
|
|
144
|
+
return { created: true, present: true, detail: `created s3://${setup.stateBucket} in ${setup.region}, but versioning could not be enabled \u2014 ${errorDetail(err)}` };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function errorDetail(err) {
|
|
148
|
+
const stderr = err && typeof err === "object" && "stderr" in err ? String(err.stderr ?? "") : "";
|
|
149
|
+
const text = stderr.trim() || (err instanceof Error ? err.message : String(err));
|
|
150
|
+
return text.split("\n").filter(Boolean).slice(-1)[0] ?? "unknown error";
|
|
151
|
+
}
|
|
152
|
+
function exportCredentialsCommand(profile) {
|
|
153
|
+
return `eval "$(aws configure export-credentials --profile ${profile} --format env)" # mesh deploy reads AWS_ACCESS_KEY_ID; a platform stack carries no mesh:deployerRole`;
|
|
154
|
+
}
|
|
155
|
+
function renderPlatformNextSteps(setup, opts = {}) {
|
|
156
|
+
const dir = opts.relativeDir ?? setup.dir;
|
|
157
|
+
const steps = [];
|
|
158
|
+
if (!opts.bucket?.present) {
|
|
159
|
+
steps.push(`${stateBucketCreateCommand(setup)} # the Pulumi state bucket, once`);
|
|
160
|
+
}
|
|
161
|
+
steps.push(
|
|
162
|
+
`cd ${dir}`,
|
|
163
|
+
"pnpm install",
|
|
164
|
+
`aws sso login --profile ${setup.profile} # if this profile is SSO`,
|
|
165
|
+
exportCredentialsCommand(setup.profile),
|
|
166
|
+
`cd core && mesh deploy up # the VPC, EKS, RDS and the public zone ${setup.env}.${setup.domain}`,
|
|
167
|
+
`# \u2192 then delegate the NS records of ${setup.env}.${setup.domain} from ${setup.domain} at your registrar; the deploy stops at the mesh-gateway Ingress until ACM issues the certificate, then continues`,
|
|
168
|
+
"cd ../platform && mesh deploy up # Temporal, Zitadel, the Hub (needs Docker \u2014 it builds service images)",
|
|
169
|
+
`mesh login ${setup.tenant}.${setup.env} # your platform sign-in, once it is up`,
|
|
170
|
+
"",
|
|
171
|
+
"Then, in your apps repo, for the hello-world app:",
|
|
172
|
+
` mesh init --tenant ${setup.tenant} --platform ${setup.env}`,
|
|
173
|
+
" mesh create-app --name hello --primitives service",
|
|
174
|
+
" mesh deploy up # from the app directory"
|
|
175
|
+
);
|
|
176
|
+
return steps;
|
|
177
|
+
}
|
|
178
|
+
async function scaffoldPlatformRepo(setup) {
|
|
179
|
+
if (fs.existsSync(setup.dir) && fs.readdirSync(setup.dir).length > 0) {
|
|
180
|
+
throw new MeshCliError(`Target directory is not empty: ${setup.dir}`, {
|
|
181
|
+
remediation: { command: `mesh init platform ${setup.tenant} --dir <empty-dir>` }
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
const { copyTemplate } = await import("./mesh.create-app-A5F45PWZ.js");
|
|
185
|
+
const { findPackageRoot } = await import("./mesh.stack-EFTFAOCV.js");
|
|
186
|
+
const { syncSkills } = await import("./mesh.skills-MNDSMBIE.js");
|
|
187
|
+
const templateDir = path.join(findPackageRoot(), "templates", "platform-repo");
|
|
188
|
+
fs.mkdirSync(setup.dir, { recursive: true });
|
|
189
|
+
copyTemplate(templateDir, setup.dir, {
|
|
190
|
+
tenant: setup.tenant,
|
|
191
|
+
env: setup.env,
|
|
192
|
+
region: setup.region,
|
|
193
|
+
domain: setup.domain,
|
|
194
|
+
profile: setup.profile,
|
|
195
|
+
stateBucket: setup.stateBucket
|
|
196
|
+
});
|
|
197
|
+
syncSkills(setup.dir);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export {
|
|
201
|
+
PLATFORM_SETUP_DEFAULTS,
|
|
202
|
+
DOMAIN_REQUIRED_MESSAGE,
|
|
203
|
+
defaultStateBucket,
|
|
204
|
+
defaultPlatformDir,
|
|
205
|
+
validateEnv,
|
|
206
|
+
validateRegion,
|
|
207
|
+
validateDomain,
|
|
208
|
+
validateStateBucket,
|
|
209
|
+
resolveTargetDir,
|
|
210
|
+
resolvePlatformSetup,
|
|
211
|
+
stateBucketCreateCommand,
|
|
212
|
+
realStateBucketDeps,
|
|
213
|
+
ensureStateBucket,
|
|
214
|
+
exportCredentialsCommand,
|
|
215
|
+
renderPlatformNextSteps,
|
|
216
|
+
scaffoldPlatformRepo
|
|
217
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/init/platform-setup.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|