primitive-admin 1.0.11 → 1.0.12
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/bin/primitive.js
CHANGED
|
@@ -3,6 +3,7 @@ import { Command } from "commander";
|
|
|
3
3
|
import { readFileSync } from "fs";
|
|
4
4
|
import { fileURLToPath } from "url";
|
|
5
5
|
import { dirname, resolve } from "path";
|
|
6
|
+
import { registerInitCommand } from "../src/commands/init.js";
|
|
6
7
|
import { registerAuthCommands } from "../src/commands/auth.js";
|
|
7
8
|
import { registerAppsCommands } from "../src/commands/apps.js";
|
|
8
9
|
import { registerUsersCommands } from "../src/commands/users.js";
|
|
@@ -49,7 +50,8 @@ App Context:
|
|
|
49
50
|
Documentation:
|
|
50
51
|
See https://primitive-labs.github.io/primitive-docs/ for full documentation.
|
|
51
52
|
`);
|
|
52
|
-
// Register all command groups
|
|
53
|
+
// Register all command groups (init first, then logically grouped)
|
|
54
|
+
registerInitCommand(program);
|
|
53
55
|
registerAuthCommands(program);
|
|
54
56
|
registerAppsCommands(program);
|
|
55
57
|
registerUsersCommands(program);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../bin/primitive.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAExF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC;;;4EAG6D,CAAC;KAC1E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;CAiBvB,CAAC,CAAC;AAEH,
|
|
1
|
+
{"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../bin/primitive.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAExF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC;;;4EAG6D,CAAC;KAC1E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;CAiBvB,CAAC,CAAC;AAEH,mEAAmE;AACnE,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,4BAA4B,CAAC,OAAO,CAAC,CAAC;AACtC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,2BAA2B,CAAC,OAAO,CAAC,CAAC;AACrC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,uBAAuB;AACvB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IAC7B,6CAA6C;AAC/C,CAAC,CAAC,CAAC;AAEH,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC3B,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,8BAA8B,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { resolve, basename } from "path";
|
|
3
|
+
import { input, confirm, select } from "@inquirer/prompts";
|
|
4
|
+
import { loadCredentials } from "../lib/config.js";
|
|
5
|
+
import { browserLogin } from "../lib/auth-flow.js";
|
|
6
|
+
import { ApiClient } from "../lib/api-client.js";
|
|
7
|
+
import { downloadAndExtractTemplate, updateEnvFile, isPnpmInstalled, installPnpm, runPnpmInstall, isDirectoryEmpty, } from "../lib/template.js";
|
|
8
|
+
import { success, error, info, warn, keyValue, divider, } from "../lib/output.js";
|
|
9
|
+
const DEFAULT_SERVER_URL = process.env.PRIMITIVE_SERVER_URL || "https://primitiveapi.com";
|
|
10
|
+
export function registerInitCommand(program) {
|
|
11
|
+
program
|
|
12
|
+
.command("init")
|
|
13
|
+
.description("Create a new Primitive app from template")
|
|
14
|
+
.argument("[directory]", "Directory to create the project in (default: current directory)")
|
|
15
|
+
.option("--use-existing-app-id <id>", "Use an existing app ID instead of creating a new one")
|
|
16
|
+
.option("-s, --server <url>", "Server URL", DEFAULT_SERVER_URL)
|
|
17
|
+
.option("--skip-install", "Skip running pnpm install")
|
|
18
|
+
.addHelpText("after", `
|
|
19
|
+
Examples:
|
|
20
|
+
$ primitive init my-app # Create in ./my-app, prompt for app name
|
|
21
|
+
$ primitive init # Interactive: prompt for directory and app name
|
|
22
|
+
$ primitive init . --use-existing-app-id 01HXY... # Use existing app in current dir
|
|
23
|
+
$ primitive init my-app --skip-install # Skip dependency install
|
|
24
|
+
|
|
25
|
+
This command will:
|
|
26
|
+
1. Download the Primitive app template
|
|
27
|
+
2. Prompt for an app name and create it on the Primitive server (or use existing)
|
|
28
|
+
3. Configure the project with your app ID
|
|
29
|
+
4. Install dependencies with pnpm
|
|
30
|
+
`)
|
|
31
|
+
.action(handleInit);
|
|
32
|
+
}
|
|
33
|
+
async function handleInit(projectDirArg, options) {
|
|
34
|
+
const serverUrl = options.server || DEFAULT_SERVER_URL;
|
|
35
|
+
// Step 1: Determine project directory
|
|
36
|
+
let projectDir = projectDirArg;
|
|
37
|
+
if (!projectDir) {
|
|
38
|
+
projectDir = await input({
|
|
39
|
+
message: "Where would you like to create the project?",
|
|
40
|
+
default: ".",
|
|
41
|
+
validate: (value) => {
|
|
42
|
+
if (!value.trim())
|
|
43
|
+
return "Directory cannot be empty";
|
|
44
|
+
return true;
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const targetDir = resolve(process.cwd(), projectDir);
|
|
49
|
+
// Used as the default app name suggestion when prompting
|
|
50
|
+
const defaultAppName = projectDir === "." ? basename(targetDir) : projectDir;
|
|
51
|
+
// Step 2: Check if directory exists and is non-empty
|
|
52
|
+
if (existsSync(targetDir) && !isDirectoryEmpty(targetDir)) {
|
|
53
|
+
warn(`Directory "${projectDir}" already exists and is not empty.`);
|
|
54
|
+
const overwrite = await confirm({
|
|
55
|
+
message: "Do you want to overwrite the existing contents?",
|
|
56
|
+
default: false,
|
|
57
|
+
});
|
|
58
|
+
if (!overwrite) {
|
|
59
|
+
error("Aborted. Please choose a different project name.");
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Step 3: Download template
|
|
64
|
+
info("Setting up your project...");
|
|
65
|
+
try {
|
|
66
|
+
await downloadAndExtractTemplate({
|
|
67
|
+
targetDir,
|
|
68
|
+
onProgress: info,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
error(`Failed to download template: ${err.message}`);
|
|
73
|
+
error("Check your internet connection and try again.");
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
// Step 4: Check authentication
|
|
77
|
+
let credentials = loadCredentials();
|
|
78
|
+
let appId;
|
|
79
|
+
let appName;
|
|
80
|
+
if (options.useExistingAppId) {
|
|
81
|
+
// Using existing app ID - verify it exists
|
|
82
|
+
appId = options.useExistingAppId;
|
|
83
|
+
appName = "(existing app)"; // Default if we can't verify
|
|
84
|
+
if (!credentials) {
|
|
85
|
+
info("You need to log in to verify the app.");
|
|
86
|
+
const shouldLogin = await confirm({
|
|
87
|
+
message: "Log in now?",
|
|
88
|
+
default: true,
|
|
89
|
+
});
|
|
90
|
+
if (shouldLogin) {
|
|
91
|
+
const result = await browserLogin(serverUrl);
|
|
92
|
+
if (!result.success) {
|
|
93
|
+
error(`Login failed: ${result.error}`);
|
|
94
|
+
warn(`Template files were extracted to "${targetDir}" but VITE_APP_ID is not configured.`);
|
|
95
|
+
warn("You'll need to manually set VITE_APP_ID in your .env file to use this project.");
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
credentials = result.credentials;
|
|
99
|
+
success(`Logged in as ${credentials.email}`);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
warn("Skipping app verification. Make sure the app ID is correct.");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (credentials) {
|
|
106
|
+
try {
|
|
107
|
+
const client = new ApiClient();
|
|
108
|
+
const appInfo = await client.getApp(appId);
|
|
109
|
+
appName = appInfo.name;
|
|
110
|
+
info(`Using existing app: ${appName}`);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
warn(`Could not verify app: ${err.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// Creating new app - authentication required
|
|
119
|
+
if (!credentials) {
|
|
120
|
+
info("You need to log in to create an app.");
|
|
121
|
+
const shouldLogin = await confirm({
|
|
122
|
+
message: "Log in now?",
|
|
123
|
+
default: true,
|
|
124
|
+
});
|
|
125
|
+
if (!shouldLogin) {
|
|
126
|
+
error("Cannot create app without authentication. Use --use-existing-app-id to skip app creation.");
|
|
127
|
+
warn(`Template files were extracted to "${targetDir}" but VITE_APP_ID is not configured.`);
|
|
128
|
+
warn("You'll need to manually set VITE_APP_ID in your .env file to use this project.");
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
const result = await browserLogin(serverUrl);
|
|
132
|
+
if (!result.success) {
|
|
133
|
+
error(`Login failed: ${result.error}`);
|
|
134
|
+
warn(`Template files were extracted to "${targetDir}" but VITE_APP_ID is not configured.`);
|
|
135
|
+
warn("You'll need to manually set VITE_APP_ID in your .env file to use this project.");
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
credentials = result.credentials;
|
|
139
|
+
success(`Logged in as ${credentials.email}`);
|
|
140
|
+
}
|
|
141
|
+
// Prompt for app name
|
|
142
|
+
appName = await input({
|
|
143
|
+
message: "What would you like to name your app?",
|
|
144
|
+
default: defaultAppName,
|
|
145
|
+
});
|
|
146
|
+
// Create app
|
|
147
|
+
info("Creating app on Primitive server...");
|
|
148
|
+
try {
|
|
149
|
+
const client = new ApiClient();
|
|
150
|
+
const result = await client.createApp({
|
|
151
|
+
name: appName,
|
|
152
|
+
initialAdminEmail: credentials.email,
|
|
153
|
+
});
|
|
154
|
+
const id = result.app?.appId || result.appId;
|
|
155
|
+
if (!id) {
|
|
156
|
+
throw new Error("App created but no appId returned");
|
|
157
|
+
}
|
|
158
|
+
appId = id;
|
|
159
|
+
success(`App created: ${appName}`);
|
|
160
|
+
keyValue("App ID", appId);
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
error(`Failed to create app: ${err.message}`);
|
|
164
|
+
error("You can try again or use --use-existing-app-id with an existing app.");
|
|
165
|
+
warn(`Template files were extracted to "${targetDir}" but VITE_APP_ID is not configured.`);
|
|
166
|
+
warn("You'll need to manually set VITE_APP_ID in your .env file to use this project.");
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
// Configure app access mode
|
|
170
|
+
console.log();
|
|
171
|
+
info("Let's configure who can access your app.");
|
|
172
|
+
info("(You can change this later with 'primitive apps update')");
|
|
173
|
+
const accessMode = await select({
|
|
174
|
+
message: "Who should be able to sign up for your app?",
|
|
175
|
+
choices: [
|
|
176
|
+
{
|
|
177
|
+
value: "public",
|
|
178
|
+
name: "Anyone (public)",
|
|
179
|
+
description: "Anyone can create an account",
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
value: "domain",
|
|
183
|
+
name: "Domain restricted",
|
|
184
|
+
description: "Only users with email addresses from specific domains",
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
value: "invite-only",
|
|
188
|
+
name: "Invite only",
|
|
189
|
+
description: "Only users you explicitly invite can sign up",
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
default: "invite-only",
|
|
193
|
+
});
|
|
194
|
+
const client = new ApiClient();
|
|
195
|
+
const settingsPayload = {
|
|
196
|
+
mode: accessMode,
|
|
197
|
+
};
|
|
198
|
+
if (accessMode === "domain") {
|
|
199
|
+
const domainsInput = await input({
|
|
200
|
+
message: "Enter allowed email domain(s) (comma-separated, e.g., 'acme.com, example.org'):",
|
|
201
|
+
validate: (value) => {
|
|
202
|
+
if (!value.trim())
|
|
203
|
+
return "Please enter at least one domain";
|
|
204
|
+
return true;
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
const allowedDomains = domainsInput
|
|
208
|
+
.split(",")
|
|
209
|
+
.map((d) => d.trim().toLowerCase())
|
|
210
|
+
.filter((d) => d.length > 0);
|
|
211
|
+
settingsPayload.allowedDomains = allowedDomains;
|
|
212
|
+
}
|
|
213
|
+
// Update app settings with the chosen mode
|
|
214
|
+
try {
|
|
215
|
+
await client.updateAppSettings(appId, settingsPayload);
|
|
216
|
+
success(`App configured for ${accessMode} access.`);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
warn(`Could not update app settings: ${err.message}`);
|
|
220
|
+
}
|
|
221
|
+
// If invite-only, offer to add initial allowed users
|
|
222
|
+
if (accessMode === "invite-only") {
|
|
223
|
+
const inviteNow = await confirm({
|
|
224
|
+
message: "Would you like to add initial users who can sign up? (no emails will be sent)",
|
|
225
|
+
default: false,
|
|
226
|
+
});
|
|
227
|
+
if (inviteNow) {
|
|
228
|
+
const emailsInput = await input({
|
|
229
|
+
message: "Enter email address(es) to allow (comma-separated):",
|
|
230
|
+
validate: (value) => {
|
|
231
|
+
if (!value.trim())
|
|
232
|
+
return "Please enter at least one email";
|
|
233
|
+
const emails = value.split(",").map((e) => e.trim());
|
|
234
|
+
for (const email of emails) {
|
|
235
|
+
if (!email.includes("@")) {
|
|
236
|
+
return `Invalid email: ${email}`;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return true;
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
const emails = emailsInput
|
|
243
|
+
.split(",")
|
|
244
|
+
.map((e) => e.trim())
|
|
245
|
+
.filter((e) => e.length > 0);
|
|
246
|
+
info("Adding invited users...");
|
|
247
|
+
let inviteCount = 0;
|
|
248
|
+
for (const email of emails) {
|
|
249
|
+
try {
|
|
250
|
+
await client.createInvitation(appId, {
|
|
251
|
+
email,
|
|
252
|
+
role: "member",
|
|
253
|
+
sendEmail: false,
|
|
254
|
+
});
|
|
255
|
+
inviteCount++;
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
warn(`Could not add ${email}: ${err.message}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (inviteCount > 0) {
|
|
262
|
+
success(`Added ${inviteCount} user(s) to the invite list.`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Step 5: Update .env file
|
|
268
|
+
info("Configuring environment...");
|
|
269
|
+
try {
|
|
270
|
+
const envResult = updateEnvFile(targetDir, appId);
|
|
271
|
+
if (!envResult.envUpdated) {
|
|
272
|
+
warn("No .env or .env.example file found in template.");
|
|
273
|
+
warn(`Please manually set VITE_APP_ID=${appId} in your .env file.`);
|
|
274
|
+
}
|
|
275
|
+
else if (!envResult.envProductionUpdated) {
|
|
276
|
+
info(".env configured. No .env.production file found (this is optional).");
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
success("Environment configured (.env and .env.production).");
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
warn(`Could not update .env file: ${err.message}`);
|
|
284
|
+
warn(`Please manually set VITE_APP_ID=${appId} in your .env file.`);
|
|
285
|
+
}
|
|
286
|
+
// Step 6: Check and install pnpm
|
|
287
|
+
if (!options.skipInstall) {
|
|
288
|
+
let pnpmAvailable = await isPnpmInstalled();
|
|
289
|
+
if (!pnpmAvailable) {
|
|
290
|
+
info("pnpm is required but not installed.");
|
|
291
|
+
const installPnpmNow = await confirm({
|
|
292
|
+
message: "Install pnpm globally now?",
|
|
293
|
+
default: true,
|
|
294
|
+
});
|
|
295
|
+
if (installPnpmNow) {
|
|
296
|
+
info("Installing pnpm...");
|
|
297
|
+
try {
|
|
298
|
+
await installPnpm();
|
|
299
|
+
success("pnpm installed.");
|
|
300
|
+
pnpmAvailable = true;
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
warn(`Could not install pnpm: ${err.message}`);
|
|
304
|
+
warn("Please install pnpm manually: npm install -g pnpm");
|
|
305
|
+
warn("Then run 'pnpm install' in your project directory.");
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
warn("Skipping dependency installation.");
|
|
310
|
+
warn("Please install pnpm and run 'pnpm install' in your project.");
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Step 7: Run pnpm install if pnpm is available
|
|
314
|
+
if (pnpmAvailable) {
|
|
315
|
+
info("Installing dependencies...");
|
|
316
|
+
try {
|
|
317
|
+
await runPnpmInstall(targetDir);
|
|
318
|
+
success("Dependencies installed.");
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
warn(`Dependency installation failed: ${err.message}`);
|
|
322
|
+
warn("You can try running 'pnpm install' manually.");
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
info("Skipping dependency installation (--skip-install).");
|
|
328
|
+
}
|
|
329
|
+
// Step 8: Show success message
|
|
330
|
+
divider();
|
|
331
|
+
success("Project initialized successfully!");
|
|
332
|
+
divider();
|
|
333
|
+
keyValue("Directory", targetDir);
|
|
334
|
+
keyValue("App Name", appName);
|
|
335
|
+
keyValue("App ID", appId);
|
|
336
|
+
divider();
|
|
337
|
+
info("Next steps:");
|
|
338
|
+
if (projectDir !== ".") {
|
|
339
|
+
console.log(` cd ${projectDir}`);
|
|
340
|
+
}
|
|
341
|
+
if (options.skipInstall) {
|
|
342
|
+
console.log(" pnpm install");
|
|
343
|
+
}
|
|
344
|
+
console.log(" pnpm run dev");
|
|
345
|
+
console.log();
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, renameSync, rmSync, statSync, } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import * as tar from "tar";
|
|
4
|
+
const TEMPLATE_URL = "https://github.com/Primitive-Labs/primitive-app-template/archive/refs/heads/main.tar.gz";
|
|
5
|
+
const DOWNLOAD_TIMEOUT_MS = 30000; // 30 seconds
|
|
6
|
+
/**
|
|
7
|
+
* Check if a directory is empty.
|
|
8
|
+
*/
|
|
9
|
+
export function isDirectoryEmpty(dir) {
|
|
10
|
+
if (!existsSync(dir)) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
const files = readdirSync(dir);
|
|
14
|
+
return files.length === 0;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Downloads and extracts the Primitive app template.
|
|
18
|
+
* The tarball extracts to a subfolder, so we strip that prefix by moving contents up.
|
|
19
|
+
*/
|
|
20
|
+
export async function downloadAndExtractTemplate(options) {
|
|
21
|
+
const { targetDir, onProgress } = options;
|
|
22
|
+
// Ensure target directory exists
|
|
23
|
+
mkdirSync(targetDir, { recursive: true });
|
|
24
|
+
onProgress?.("Downloading template...");
|
|
25
|
+
// Fetch the tarball with timeout
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
const timeout = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS);
|
|
28
|
+
let response;
|
|
29
|
+
try {
|
|
30
|
+
response = await fetch(TEMPLATE_URL, { signal: controller.signal });
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
clearTimeout(timeout);
|
|
34
|
+
if (err.name === "AbortError") {
|
|
35
|
+
throw new Error(`Download timed out after ${DOWNLOAD_TIMEOUT_MS / 1000} seconds`);
|
|
36
|
+
}
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
clearTimeout(timeout);
|
|
41
|
+
}
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
throw new Error(`Failed to download template: HTTP ${response.status}`);
|
|
44
|
+
}
|
|
45
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
46
|
+
const buffer = Buffer.from(arrayBuffer);
|
|
47
|
+
onProgress?.("Extracting template...");
|
|
48
|
+
// Create a temporary directory for extraction
|
|
49
|
+
const tempDir = join(targetDir, ".primitive-temp-" + Date.now());
|
|
50
|
+
mkdirSync(tempDir, { recursive: true });
|
|
51
|
+
// Write buffer to temp file and extract
|
|
52
|
+
const tempTarPath = join(tempDir, "template.tar.gz");
|
|
53
|
+
writeFileSync(tempTarPath, buffer);
|
|
54
|
+
// Extract tarball using tar
|
|
55
|
+
await tar.extract({
|
|
56
|
+
file: tempTarPath,
|
|
57
|
+
cwd: tempDir,
|
|
58
|
+
});
|
|
59
|
+
// Remove the temp tarball
|
|
60
|
+
rmSync(tempTarPath);
|
|
61
|
+
// Find the extracted directory (e.g., "primitive-app-template-main")
|
|
62
|
+
const extractedItems = readdirSync(tempDir);
|
|
63
|
+
if (extractedItems.length !== 1) {
|
|
64
|
+
throw new Error(`Unexpected template structure: expected 1 directory, found ${extractedItems.length}`);
|
|
65
|
+
}
|
|
66
|
+
const extractedDir = join(tempDir, extractedItems[0]);
|
|
67
|
+
// Verify it's a directory
|
|
68
|
+
if (!statSync(extractedDir).isDirectory()) {
|
|
69
|
+
throw new Error("Unexpected template structure: expected a directory");
|
|
70
|
+
}
|
|
71
|
+
// Move contents to target directory
|
|
72
|
+
for (const item of readdirSync(extractedDir)) {
|
|
73
|
+
const src = join(extractedDir, item);
|
|
74
|
+
const dest = join(targetDir, item);
|
|
75
|
+
// Remove existing item if it exists (for overwrite scenarios)
|
|
76
|
+
if (existsSync(dest)) {
|
|
77
|
+
rmSync(dest, { recursive: true, force: true });
|
|
78
|
+
}
|
|
79
|
+
renameSync(src, dest);
|
|
80
|
+
}
|
|
81
|
+
// Clean up temp directory
|
|
82
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
83
|
+
onProgress?.("Template extracted successfully.");
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Updates a single env file with the app ID.
|
|
87
|
+
* Returns true if the file was updated, false if it didn't exist.
|
|
88
|
+
*/
|
|
89
|
+
function updateSingleEnvFile(envPath, appId, fallbackPath) {
|
|
90
|
+
let envContent = "";
|
|
91
|
+
// If file doesn't exist but fallback does, copy from fallback
|
|
92
|
+
if (!existsSync(envPath) && fallbackPath && existsSync(fallbackPath)) {
|
|
93
|
+
envContent = readFileSync(fallbackPath, "utf-8");
|
|
94
|
+
}
|
|
95
|
+
else if (existsSync(envPath)) {
|
|
96
|
+
envContent = readFileSync(envPath, "utf-8");
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
// Update or add VITE_APP_ID
|
|
102
|
+
if (envContent.includes("VITE_APP_ID=")) {
|
|
103
|
+
envContent = envContent.replace(/VITE_APP_ID=.*/, `VITE_APP_ID=${appId}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
envContent = envContent.trimEnd() + `\nVITE_APP_ID=${appId}\n`;
|
|
107
|
+
}
|
|
108
|
+
writeFileSync(envPath, envContent.trimEnd() + "\n");
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Updates .env and .env.production files with the app ID.
|
|
113
|
+
* For .env, if it doesn't exist but .env.example does, copies from example first.
|
|
114
|
+
* Returns information about which files were updated.
|
|
115
|
+
*/
|
|
116
|
+
export function updateEnvFile(targetDir, appId) {
|
|
117
|
+
const envPath = join(targetDir, ".env");
|
|
118
|
+
const envExamplePath = join(targetDir, ".env.example");
|
|
119
|
+
const envProductionPath = join(targetDir, ".env.production");
|
|
120
|
+
// Update .env (create from .env.example if needed)
|
|
121
|
+
const envUpdated = updateSingleEnvFile(envPath, appId, envExamplePath);
|
|
122
|
+
// Update .env.production if it exists
|
|
123
|
+
const envProductionUpdated = updateSingleEnvFile(envProductionPath, appId);
|
|
124
|
+
return { envUpdated, envProductionUpdated };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Checks if pnpm is installed globally.
|
|
128
|
+
*/
|
|
129
|
+
export async function isPnpmInstalled() {
|
|
130
|
+
const { execSync } = await import("child_process");
|
|
131
|
+
try {
|
|
132
|
+
execSync("pnpm --version", { stdio: "ignore" });
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Attempts to install pnpm globally using npm.
|
|
141
|
+
*/
|
|
142
|
+
export async function installPnpm() {
|
|
143
|
+
const { spawn } = await import("child_process");
|
|
144
|
+
return new Promise((resolve, reject) => {
|
|
145
|
+
const proc = spawn("npm", ["install", "-g", "pnpm"], {
|
|
146
|
+
stdio: "inherit",
|
|
147
|
+
shell: true,
|
|
148
|
+
});
|
|
149
|
+
proc.on("close", (code) => {
|
|
150
|
+
if (code === 0) {
|
|
151
|
+
resolve();
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
reject(new Error(`npm install -g pnpm exited with code ${code}`));
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
proc.on("error", reject);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Runs pnpm install in the target directory.
|
|
162
|
+
*/
|
|
163
|
+
export async function runPnpmInstall(targetDir) {
|
|
164
|
+
const { spawn } = await import("child_process");
|
|
165
|
+
return new Promise((resolve, reject) => {
|
|
166
|
+
const proc = spawn("pnpm", ["install"], {
|
|
167
|
+
cwd: targetDir,
|
|
168
|
+
stdio: "inherit",
|
|
169
|
+
shell: true,
|
|
170
|
+
});
|
|
171
|
+
proc.on("close", (code) => {
|
|
172
|
+
if (code === 0) {
|
|
173
|
+
resolve();
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
reject(new Error(`pnpm install exited with code ${code}`));
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
proc.on("error", reject);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/lib/template.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "primitive-admin",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.12",
|
|
4
4
|
"description": "CLI for administering Primitive applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,19 +10,6 @@
|
|
|
10
10
|
"dist/",
|
|
11
11
|
"README.md"
|
|
12
12
|
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsc",
|
|
15
|
-
"typecheck": "tsc --noEmit",
|
|
16
|
-
"prepublishOnly": "pnpm run build",
|
|
17
|
-
"test": "vitest run --config vitest.config.ts",
|
|
18
|
-
"test:unit": "vitest run --config vitest.config.ts tests/unit",
|
|
19
|
-
"test:integration": "vitest run --config vitest.config.ts tests/integration",
|
|
20
|
-
"test:llm": "vitest run --config vitest.config.ts tests/integration/llm.test.ts",
|
|
21
|
-
"test:batch": "vitest run --config vitest.config.ts tests/integration/batch-tests.test.ts",
|
|
22
|
-
"test:prompt-tests": "vitest run --config vitest.config.ts tests/integration/prompt-tests.test.ts",
|
|
23
|
-
"test:workflow-tests": "vitest run --config vitest.config.ts tests/integration/workflow-tests.test.ts",
|
|
24
|
-
"test:sync-test-cases": "vitest run --config vitest.config.ts tests/integration/sync-test-cases.test.ts"
|
|
25
|
-
},
|
|
26
13
|
"keywords": [
|
|
27
14
|
"primitive",
|
|
28
15
|
"cli",
|
|
@@ -41,7 +28,8 @@
|
|
|
41
28
|
"commander": "^12.1.0",
|
|
42
29
|
"inquirer": "^9.2.12",
|
|
43
30
|
"mime-types": "^2.1.35",
|
|
44
|
-
"open": "^10.0.3"
|
|
31
|
+
"open": "^10.0.3",
|
|
32
|
+
"tar": "^7.0.0"
|
|
45
33
|
},
|
|
46
34
|
"devDependencies": {
|
|
47
35
|
"@types/inquirer": "^9.0.9",
|
|
@@ -50,5 +38,17 @@
|
|
|
50
38
|
"tsx": "^4.20.3",
|
|
51
39
|
"typescript": "^5.7.2",
|
|
52
40
|
"vitest": "^1.6.1"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"test": "vitest run --config vitest.config.ts",
|
|
46
|
+
"test:unit": "vitest run --config vitest.config.ts tests/unit",
|
|
47
|
+
"test:integration": "vitest run --config vitest.config.ts tests/integration",
|
|
48
|
+
"test:llm": "vitest run --config vitest.config.ts tests/integration/llm.test.ts",
|
|
49
|
+
"test:batch": "vitest run --config vitest.config.ts tests/integration/batch-tests.test.ts",
|
|
50
|
+
"test:prompt-tests": "vitest run --config vitest.config.ts tests/integration/prompt-tests.test.ts",
|
|
51
|
+
"test:workflow-tests": "vitest run --config vitest.config.ts tests/integration/workflow-tests.test.ts",
|
|
52
|
+
"test:sync-test-cases": "vitest run --config vitest.config.ts tests/integration/sync-test-cases.test.ts"
|
|
53
53
|
}
|
|
54
|
-
}
|
|
54
|
+
}
|