primitive-admin 1.1.0-alpha.3 → 1.1.0-alpha.31
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/README.md +168 -21
- package/assets/skill/skills/primitive-platform/SKILL.md +226 -0
- package/dist/bin/primitive.js +198 -15
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/admins.js +107 -0
- package/dist/src/commands/admins.js.map +1 -1
- package/dist/src/commands/analytics.js +464 -55
- package/dist/src/commands/analytics.js.map +1 -1
- package/dist/src/commands/apps.js +27 -13
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/auth.js +165 -5
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/blob-buckets.js +354 -0
- package/dist/src/commands/blob-buckets.js.map +1 -0
- package/dist/src/commands/catalog.js +17 -17
- package/dist/src/commands/catalog.js.map +1 -1
- package/dist/src/commands/collection-type-configs.js +178 -0
- package/dist/src/commands/collection-type-configs.js.map +1 -0
- package/dist/src/commands/collections.js +526 -0
- package/dist/src/commands/collections.js.map +1 -0
- package/dist/src/commands/comparisons.js +6 -6
- package/dist/src/commands/comparisons.js.map +1 -1
- package/dist/src/commands/cron-triggers.js +364 -0
- package/dist/src/commands/cron-triggers.js.map +1 -0
- package/dist/src/commands/database-types.js +462 -0
- package/dist/src/commands/database-types.js.map +1 -0
- package/dist/src/commands/databases.js +1067 -58
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.js +510 -2
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/email-templates.js +281 -0
- package/dist/src/commands/email-templates.js.map +1 -0
- package/dist/src/commands/env.js +260 -0
- package/dist/src/commands/env.js.map +1 -0
- package/dist/src/commands/group-type-configs.js +189 -0
- package/dist/src/commands/group-type-configs.js.map +1 -0
- package/dist/src/commands/groups.js +28 -25
- package/dist/src/commands/groups.js.map +1 -1
- package/dist/src/commands/init.js +719 -188
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/integrations.js +504 -33
- package/dist/src/commands/integrations.js.map +1 -1
- package/dist/src/commands/prompts.js +17 -16
- package/dist/src/commands/prompts.js.map +1 -1
- package/dist/src/commands/rule-sets.js +366 -0
- package/dist/src/commands/rule-sets.js.map +1 -0
- package/dist/src/commands/secrets.js +108 -0
- package/dist/src/commands/secrets.js.map +1 -0
- package/dist/src/commands/skill.js +29 -0
- package/dist/src/commands/skill.js.map +1 -0
- package/dist/src/commands/sync.js +2363 -182
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.js +9 -9
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/users.js +426 -4
- package/dist/src/commands/users.js.map +1 -1
- package/dist/src/commands/webhooks.js +386 -0
- package/dist/src/commands/webhooks.js.map +1 -0
- package/dist/src/commands/workflows.js +614 -64
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/api-client.js +942 -83
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/config.js +51 -53
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/constants.js +3 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/credentials-store.js +307 -0
- package/dist/src/lib/credentials-store.js.map +1 -0
- package/dist/src/lib/env-resolver.js +121 -0
- package/dist/src/lib/env-resolver.js.map +1 -0
- package/dist/src/lib/init-config.js +87 -0
- package/dist/src/lib/init-config.js.map +1 -0
- package/dist/src/lib/migration-nag.js +163 -0
- package/dist/src/lib/migration-nag.js.map +1 -0
- package/dist/src/lib/output.js +58 -6
- package/dist/src/lib/output.js.map +1 -1
- package/dist/src/lib/paginate.js +42 -0
- package/dist/src/lib/paginate.js.map +1 -0
- package/dist/src/lib/project-config.js +209 -0
- package/dist/src/lib/project-config.js.map +1 -0
- package/dist/src/lib/refresh-admin-credentials.js +103 -0
- package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
- package/dist/src/lib/skill-installer.js +135 -0
- package/dist/src/lib/skill-installer.js.map +1 -0
- package/dist/src/lib/sync-paths.js +102 -0
- package/dist/src/lib/sync-paths.js.map +1 -0
- package/dist/src/lib/template.js +279 -18
- package/dist/src/lib/template.js.map +1 -1
- package/dist/src/lib/toml-database-config.js +384 -0
- package/dist/src/lib/toml-database-config.js.map +1 -0
- package/dist/src/lib/toml-params-validator.js +183 -0
- package/dist/src/lib/toml-params-validator.js.map +1 -0
- package/dist/src/lib/version-check.js +172 -0
- package/dist/src/lib/version-check.js.map +1 -0
- package/dist/src/lib/workflow-fragments.js +121 -0
- package/dist/src/lib/workflow-fragments.js.map +1 -0
- package/dist/src/lib/workflow-toml-validator.js +328 -0
- package/dist/src/lib/workflow-toml-validator.js.map +1 -0
- package/package.json +7 -4
package/dist/src/lib/template.js
CHANGED
|
@@ -1,8 +1,25 @@
|
|
|
1
|
-
import { existsSync, mkdirSync,
|
|
1
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from "fs";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import * as tar from "tar";
|
|
4
|
+
import { PRODUCTION_SERVER_URL } from "./constants.js";
|
|
4
5
|
const TEMPLATE_URL = "https://github.com/Primitive-Labs/primitive-app-template/archive/refs/heads/main.tar.gz";
|
|
6
|
+
const IOS_TEMPLATE_URL = "https://api.github.com/repos/Primitive-Labs/primitive-ios-template/tarball/main";
|
|
5
7
|
const DOWNLOAD_TIMEOUT_MS = 30000; // 30 seconds
|
|
8
|
+
/**
|
|
9
|
+
* Tries to get a GitHub token from the gh CLI for authenticated downloads.
|
|
10
|
+
* Returns null if gh is not installed or not authenticated.
|
|
11
|
+
*/
|
|
12
|
+
async function getGitHubToken() {
|
|
13
|
+
const { execSync } = await import("child_process");
|
|
14
|
+
try {
|
|
15
|
+
return execSync("gh auth token", { stdio: ["ignore", "pipe", "ignore"] })
|
|
16
|
+
.toString()
|
|
17
|
+
.trim();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
6
23
|
/**
|
|
7
24
|
* Check if a directory is empty.
|
|
8
25
|
*/
|
|
@@ -27,7 +44,16 @@ export async function downloadAndExtractTemplate(options) {
|
|
|
27
44
|
const timeout = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS);
|
|
28
45
|
let response;
|
|
29
46
|
try {
|
|
30
|
-
|
|
47
|
+
const url = options.templateUrl || TEMPLATE_URL;
|
|
48
|
+
const headers = {
|
|
49
|
+
"User-Agent": "primitive-cli",
|
|
50
|
+
};
|
|
51
|
+
// For private repos, use GitHub token if available (from gh CLI)
|
|
52
|
+
const ghToken = await getGitHubToken();
|
|
53
|
+
if (ghToken) {
|
|
54
|
+
headers["Authorization"] = `token ${ghToken}`;
|
|
55
|
+
}
|
|
56
|
+
response = await fetch(url, { signal: controller.signal, headers });
|
|
31
57
|
}
|
|
32
58
|
catch (err) {
|
|
33
59
|
clearTimeout(timeout);
|
|
@@ -83,10 +109,38 @@ export async function downloadAndExtractTemplate(options) {
|
|
|
83
109
|
onProgress?.("Template extracted successfully.");
|
|
84
110
|
}
|
|
85
111
|
/**
|
|
86
|
-
*
|
|
112
|
+
* Derives VITE_API_URL and VITE_WS_URL from a server URL.
|
|
113
|
+
* https:// → wss://, http:// → ws://
|
|
114
|
+
*/
|
|
115
|
+
function deriveEnvUrls(serverUrl) {
|
|
116
|
+
const apiUrl = serverUrl.replace(/\/+$/, "");
|
|
117
|
+
if (!/^https?:\/\//.test(apiUrl)) {
|
|
118
|
+
throw new Error(`Invalid server URL (must start with http:// or https://): ${apiUrl}`);
|
|
119
|
+
}
|
|
120
|
+
const wsUrl = apiUrl
|
|
121
|
+
.replace(/^https:\/\//, "wss://")
|
|
122
|
+
.replace(/^http:\/\//, "ws://");
|
|
123
|
+
return { apiUrl, wsUrl };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Sets or replaces a key=value pair in env file content.
|
|
127
|
+
*/
|
|
128
|
+
function setEnvVar(content, key, value) {
|
|
129
|
+
const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
130
|
+
const pattern = new RegExp(`^${escapedKey}=.*`, "m");
|
|
131
|
+
// Quote values that contain characters dotenv would misparse (# starts
|
|
132
|
+
// a comment, leading/trailing whitespace is stripped, etc.)
|
|
133
|
+
const formatted = /[#\n]/.test(value) ? `"${value.replace(/"/g, '\\"')}"` : value;
|
|
134
|
+
if (pattern.test(content)) {
|
|
135
|
+
return content.replace(pattern, `${key}=${formatted}`);
|
|
136
|
+
}
|
|
137
|
+
return content.trimEnd() + `\n${key}=${formatted}\n`;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Updates a single env file with the app ID and server URLs.
|
|
87
141
|
* Returns true if the file was updated, false if it didn't exist.
|
|
88
142
|
*/
|
|
89
|
-
function updateSingleEnvFile(envPath, appId, fallbackPath) {
|
|
143
|
+
function updateSingleEnvFile(envPath, appId, serverUrl, appName, fallbackPath) {
|
|
90
144
|
let envContent = "";
|
|
91
145
|
// If file doesn't exist but fallback does, copy from fallback
|
|
92
146
|
if (!existsSync(envPath) && fallbackPath && existsSync(fallbackPath)) {
|
|
@@ -98,29 +152,47 @@ function updateSingleEnvFile(envPath, appId, fallbackPath) {
|
|
|
98
152
|
else {
|
|
99
153
|
return false;
|
|
100
154
|
}
|
|
101
|
-
|
|
102
|
-
if (
|
|
103
|
-
envContent = envContent
|
|
155
|
+
envContent = setEnvVar(envContent, "VITE_APP_ID", appId);
|
|
156
|
+
if (appName) {
|
|
157
|
+
envContent = setEnvVar(envContent, "VITE_APP_NAME", appName);
|
|
104
158
|
}
|
|
105
|
-
|
|
106
|
-
|
|
159
|
+
const { apiUrl, wsUrl } = deriveEnvUrls(serverUrl);
|
|
160
|
+
envContent = setEnvVar(envContent, "VITE_API_URL", apiUrl);
|
|
161
|
+
envContent = setEnvVar(envContent, "VITE_WS_URL", wsUrl);
|
|
162
|
+
// Update or add VITE_API_URL and VITE_WS_URL based on the auth server
|
|
163
|
+
if (serverUrl) {
|
|
164
|
+
const wsUrl = serverUrl
|
|
165
|
+
.replace(/^https:\/\//, "wss://")
|
|
166
|
+
.replace(/^http:\/\//, "ws://");
|
|
167
|
+
if (envContent.includes("VITE_API_URL=")) {
|
|
168
|
+
envContent = envContent.replace(/VITE_API_URL=.*/, `VITE_API_URL=${serverUrl}`);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
envContent = envContent.trimEnd() + `\nVITE_API_URL=${serverUrl}\n`;
|
|
172
|
+
}
|
|
173
|
+
if (envContent.includes("VITE_WS_URL=")) {
|
|
174
|
+
envContent = envContent.replace(/VITE_WS_URL=.*/, `VITE_WS_URL=${wsUrl}`);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
envContent = envContent.trimEnd() + `\nVITE_WS_URL=${wsUrl}\n`;
|
|
178
|
+
}
|
|
107
179
|
}
|
|
108
180
|
writeFileSync(envPath, envContent.trimEnd() + "\n");
|
|
109
181
|
return true;
|
|
110
182
|
}
|
|
111
183
|
/**
|
|
112
|
-
* Updates .env and .env.production files with the app ID.
|
|
184
|
+
* Updates .env and .env.production files with the app ID and server URLs.
|
|
113
185
|
* For .env, if it doesn't exist but .env.example does, copies from example first.
|
|
114
186
|
* Returns information about which files were updated.
|
|
115
187
|
*/
|
|
116
|
-
export function updateEnvFile(targetDir, appId) {
|
|
188
|
+
export function updateEnvFile(targetDir, appId, serverUrl, appName) {
|
|
117
189
|
const envPath = join(targetDir, ".env");
|
|
118
190
|
const envExamplePath = join(targetDir, ".env.example");
|
|
119
191
|
const envProductionPath = join(targetDir, ".env.production");
|
|
120
192
|
// Update .env (create from .env.example if needed)
|
|
121
|
-
const envUpdated = updateSingleEnvFile(envPath, appId, envExamplePath);
|
|
122
|
-
//
|
|
123
|
-
const envProductionUpdated = updateSingleEnvFile(envProductionPath, appId);
|
|
193
|
+
const envUpdated = updateSingleEnvFile(envPath, appId, serverUrl, appName, envExamplePath);
|
|
194
|
+
// .env.production always points at production regardless of the chosen dev server
|
|
195
|
+
const envProductionUpdated = updateSingleEnvFile(envProductionPath, appId, PRODUCTION_SERVER_URL, appName);
|
|
124
196
|
return { envUpdated, envProductionUpdated };
|
|
125
197
|
}
|
|
126
198
|
/**
|
|
@@ -183,20 +255,209 @@ export async function installPnpmGlobally() {
|
|
|
183
255
|
});
|
|
184
256
|
}
|
|
185
257
|
/**
|
|
186
|
-
* Checks if the primitive CLI
|
|
187
|
-
*
|
|
188
|
-
*
|
|
258
|
+
* Checks if the primitive CLI is installed and available in PATH.
|
|
259
|
+
* Checks for the `primitive` command directly, which covers installs via
|
|
260
|
+
* npm, pnpm, yarn, or any other package manager.
|
|
189
261
|
*/
|
|
190
262
|
export async function isPrimitiveCliInstalled() {
|
|
191
263
|
const { execSync } = await import("child_process");
|
|
192
264
|
try {
|
|
193
|
-
execSync("
|
|
265
|
+
execSync("primitive --version", { stdio: "ignore" });
|
|
194
266
|
return true;
|
|
195
267
|
}
|
|
196
268
|
catch {
|
|
197
269
|
return false;
|
|
198
270
|
}
|
|
199
271
|
}
|
|
272
|
+
/**
|
|
273
|
+
* Initializes a git repository in the target directory.
|
|
274
|
+
*/
|
|
275
|
+
async function spawnGit(args, cwd) {
|
|
276
|
+
const { spawn } = await import("child_process");
|
|
277
|
+
return new Promise((resolve, reject) => {
|
|
278
|
+
const proc = spawn("git", args, {
|
|
279
|
+
cwd,
|
|
280
|
+
stdio: "ignore",
|
|
281
|
+
shell: process.platform === "win32",
|
|
282
|
+
});
|
|
283
|
+
proc.on("close", (code) => {
|
|
284
|
+
if (code === 0) {
|
|
285
|
+
resolve();
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
reject(new Error(`git ${args[0]} exited with code ${code}`));
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
proc.on("error", reject);
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
export async function gitInitRepo(targetDir) {
|
|
295
|
+
await spawnGit(["init"], targetDir);
|
|
296
|
+
}
|
|
297
|
+
export async function gitInitialCommit(targetDir) {
|
|
298
|
+
await spawnGit(["add", "-A"], targetDir);
|
|
299
|
+
await spawnGit(["commit", "--allow-empty", "-m", "Initial Commit"], targetDir);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Tries to connect to `host:port`. Returns true if something answered
|
|
303
|
+
* (port occupied), false if the connection was refused (port free).
|
|
304
|
+
*/
|
|
305
|
+
function canConnect(port, host) {
|
|
306
|
+
return new Promise((resolve) => {
|
|
307
|
+
import("net").then(({ createConnection }) => {
|
|
308
|
+
const socket = createConnection({ port, host });
|
|
309
|
+
socket.once("connect", () => {
|
|
310
|
+
socket.destroy();
|
|
311
|
+
resolve(true);
|
|
312
|
+
});
|
|
313
|
+
socket.once("error", () => resolve(false));
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Checks whether a TCP port is currently in use on localhost.
|
|
319
|
+
* Tries both IPv4 (127.0.0.1) and IPv6 (::1) since a server may only
|
|
320
|
+
* bind to one address family.
|
|
321
|
+
*/
|
|
322
|
+
export async function isPortFree(port) {
|
|
323
|
+
const [v4, v6] = await Promise.all([
|
|
324
|
+
canConnect(port, "127.0.0.1"),
|
|
325
|
+
canConnect(port, "::1"),
|
|
326
|
+
]);
|
|
327
|
+
return !v4 && !v6;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Pins the dev server port in vite.config.{ts,js,mts,mjs} by injecting or
|
|
331
|
+
* updating the `server.port` field. Returns true if a config file was found
|
|
332
|
+
* and patched.
|
|
333
|
+
*/
|
|
334
|
+
export function updateViteConfig(targetDir, port) {
|
|
335
|
+
const candidates = [
|
|
336
|
+
"vite.config.ts",
|
|
337
|
+
"vite.config.js",
|
|
338
|
+
"vite.config.mts",
|
|
339
|
+
"vite.config.mjs",
|
|
340
|
+
];
|
|
341
|
+
let configPath = null;
|
|
342
|
+
for (const name of candidates) {
|
|
343
|
+
const p = join(targetDir, name);
|
|
344
|
+
if (existsSync(p)) {
|
|
345
|
+
configPath = p;
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (!configPath)
|
|
350
|
+
return false;
|
|
351
|
+
let content = readFileSync(configPath, "utf-8");
|
|
352
|
+
if (/server\s*:\s*\{[^}]*port\s*:/.test(content)) {
|
|
353
|
+
content = content.replace(/(server\s*:\s*\{[^}]*port\s*:\s*)\d+/, `$1${port}`);
|
|
354
|
+
}
|
|
355
|
+
else if (/server\s*:\s*\{/.test(content)) {
|
|
356
|
+
content = content.replace(/(server\s*:\s*\{)/, `$1\n port: ${port},`);
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
content = content.replace(/(defineConfig\s*\(\s*\{)/, `$1\n server: {\n port: ${port},\n },`);
|
|
360
|
+
}
|
|
361
|
+
writeFileSync(configPath, content);
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Updates port-sensitive env vars (VITE_OAUTH_REDIRECT_URI, VITE_BASE_URL)
|
|
366
|
+
* in the project's .env file to point at the given localhost port.
|
|
367
|
+
*/
|
|
368
|
+
export function updateEnvPort(targetDir, port) {
|
|
369
|
+
const envPath = join(targetDir, ".env");
|
|
370
|
+
if (!existsSync(envPath))
|
|
371
|
+
return;
|
|
372
|
+
const origin = `http://localhost:${port}`;
|
|
373
|
+
let content = readFileSync(envPath, "utf-8");
|
|
374
|
+
if (content.includes("VITE_OAUTH_REDIRECT_URI=")) {
|
|
375
|
+
content = content.replace(/VITE_OAUTH_REDIRECT_URI=.*/, `VITE_OAUTH_REDIRECT_URI=${origin}/oauth/callback`);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
content =
|
|
379
|
+
content.trimEnd() +
|
|
380
|
+
`\nVITE_OAUTH_REDIRECT_URI=${origin}/oauth/callback\n`;
|
|
381
|
+
}
|
|
382
|
+
if (content.includes("VITE_BASE_URL=")) {
|
|
383
|
+
content = content.replace(/VITE_BASE_URL=.*/, `VITE_BASE_URL=${origin}`);
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
content = content.trimEnd() + `\nVITE_BASE_URL=${origin}\n`;
|
|
387
|
+
}
|
|
388
|
+
writeFileSync(envPath, content.trimEnd() + "\n");
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Starting from `startPort` (default 5173), finds the first free port and
|
|
392
|
+
* returns which ports were already occupied and which port vite will bind to.
|
|
393
|
+
* `exhausted` is true when all checked ports were occupied and the returned
|
|
394
|
+
* port is a best-guess beyond the checked range.
|
|
395
|
+
*/
|
|
396
|
+
export async function findDevPort(startPort = 5173, maxChecks = 10) {
|
|
397
|
+
const takenPorts = [];
|
|
398
|
+
for (let port = startPort; port < startPort + maxChecks; port++) {
|
|
399
|
+
if (await isPortFree(port)) {
|
|
400
|
+
return { availablePort: port, takenPorts, exhausted: false };
|
|
401
|
+
}
|
|
402
|
+
takenPorts.push(port);
|
|
403
|
+
}
|
|
404
|
+
// All checked ports were occupied — best guess is the next one
|
|
405
|
+
return { availablePort: startPort + maxChecks, takenPorts, exhausted: true };
|
|
406
|
+
}
|
|
407
|
+
// ── iOS template helpers ──────────────────────────────────────────────
|
|
408
|
+
export { IOS_TEMPLATE_URL };
|
|
409
|
+
/**
|
|
410
|
+
* Updates primitive.json in the iOS template with app ID, server URL, and app name.
|
|
411
|
+
* Replaces __PRIMITIVE_*__ placeholder values.
|
|
412
|
+
* Returns true if the file was found and updated.
|
|
413
|
+
*/
|
|
414
|
+
export function updatePrimitiveJson(targetDir, appId, serverUrl, appName) {
|
|
415
|
+
const jsonPath = join(targetDir, "primitive.json");
|
|
416
|
+
if (!existsSync(jsonPath))
|
|
417
|
+
return false;
|
|
418
|
+
let content = readFileSync(jsonPath, "utf-8");
|
|
419
|
+
content = content.replace(/__PRIMITIVE_APP_ID__/g, appId);
|
|
420
|
+
content = content.replace(/__PRIMITIVE_SERVER_URL__/g, serverUrl.replace(/\/+$/, ""));
|
|
421
|
+
if (appName) {
|
|
422
|
+
content = content.replace(/__PRIMITIVE_APP_NAME__/g, appName);
|
|
423
|
+
}
|
|
424
|
+
writeFileSync(jsonPath, content);
|
|
425
|
+
return true;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Checks if Xcode command-line tools are installed.
|
|
429
|
+
*/
|
|
430
|
+
export async function isXcodeInstalled() {
|
|
431
|
+
const { execSync } = await import("child_process");
|
|
432
|
+
try {
|
|
433
|
+
execSync("xcodebuild -version", { stdio: "ignore" });
|
|
434
|
+
return true;
|
|
435
|
+
}
|
|
436
|
+
catch {
|
|
437
|
+
return false;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Runs `swift package resolve` in the target directory to download SPM dependencies.
|
|
442
|
+
*/
|
|
443
|
+
export async function runSwiftPackageResolve(targetDir) {
|
|
444
|
+
const { spawn } = await import("child_process");
|
|
445
|
+
return new Promise((resolve, reject) => {
|
|
446
|
+
const proc = spawn("swift", ["package", "resolve"], {
|
|
447
|
+
cwd: targetDir,
|
|
448
|
+
stdio: "inherit",
|
|
449
|
+
});
|
|
450
|
+
proc.on("close", (code) => {
|
|
451
|
+
if (code === 0) {
|
|
452
|
+
resolve();
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
reject(new Error(`swift package resolve exited with code ${code}`));
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
proc.on("error", reject);
|
|
459
|
+
});
|
|
460
|
+
}
|
|
200
461
|
/**
|
|
201
462
|
* Installs the primitive CLI (primitive-admin) globally using npm.
|
|
202
463
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/lib/template.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/lib/template.ts"],"names":[],"mappings":"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"}
|