@01.software/init 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index.mjs → index.js} +73 -47
- package/dist/index.js.map +1 -0
- package/package.json +17 -8
- package/dist/index.mjs.map +0 -1
|
@@ -67,18 +67,33 @@ async function promptUser(hasSdk, detectedPm) {
|
|
|
67
67
|
);
|
|
68
68
|
packageManager = pm;
|
|
69
69
|
}
|
|
70
|
-
const
|
|
70
|
+
const keys = await prompts(
|
|
71
71
|
[
|
|
72
72
|
{
|
|
73
73
|
type: "text",
|
|
74
74
|
name: "clientKey",
|
|
75
75
|
message: "Client Key (optional, saved to .env)",
|
|
76
76
|
initial: ""
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: "text",
|
|
80
|
+
name: "secretKey",
|
|
81
|
+
message: "Secret Key (optional, saved to .env)",
|
|
82
|
+
initial: ""
|
|
77
83
|
}
|
|
78
84
|
],
|
|
79
85
|
{ onCancel }
|
|
80
86
|
);
|
|
81
|
-
|
|
87
|
+
const { setupMcp } = await prompts(
|
|
88
|
+
{
|
|
89
|
+
type: "confirm",
|
|
90
|
+
name: "setupMcp",
|
|
91
|
+
message: "Set up MCP integration? (.mcp.json)",
|
|
92
|
+
initial: true
|
|
93
|
+
},
|
|
94
|
+
{ onCancel }
|
|
95
|
+
);
|
|
96
|
+
return { ...keys, setupMcp, packageManager };
|
|
82
97
|
}
|
|
83
98
|
|
|
84
99
|
// src/init.ts
|
|
@@ -120,45 +135,27 @@ export const serverClient = createServerClient({
|
|
|
120
135
|
})
|
|
121
136
|
`;
|
|
122
137
|
}
|
|
123
|
-
function
|
|
124
|
-
return `'use client'
|
|
125
|
-
|
|
126
|
-
import { client } from '@/lib/software/client'
|
|
127
|
-
|
|
128
|
-
export default function Home() {
|
|
129
|
-
const { data, isLoading } = client.query.useQuery({
|
|
130
|
-
collection: 'products',
|
|
131
|
-
options: { limit: 10 },
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
return (
|
|
135
|
-
<main style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
|
|
136
|
-
<h1>My App</h1>
|
|
137
|
-
<p>Built with <a href="https://01.software">01.software</a> SDK</p>
|
|
138
|
-
|
|
139
|
-
<h2>Products</h2>
|
|
140
|
-
{isLoading ? (
|
|
141
|
-
<p>Loading...</p>
|
|
142
|
-
) : (
|
|
143
|
-
<ul>
|
|
144
|
-
{data?.docs.map((product) => (
|
|
145
|
-
<li key={product.id}>{product.title ?? product.id}</li>
|
|
146
|
-
))}
|
|
147
|
-
{data?.docs.length === 0 && <li>No products found</li>}
|
|
148
|
-
</ul>
|
|
149
|
-
)}
|
|
150
|
-
</main>
|
|
151
|
-
)
|
|
152
|
-
}
|
|
153
|
-
`;
|
|
154
|
-
}
|
|
155
|
-
function getEnvContent(clientKey) {
|
|
138
|
+
function getEnvContent(clientKey, secretKey) {
|
|
156
139
|
return `
|
|
157
140
|
# 01.software
|
|
158
141
|
NEXT_PUBLIC_SOFTWARE_CLIENT_KEY=${clientKey}
|
|
159
|
-
SOFTWARE_SECRET_KEY
|
|
142
|
+
SOFTWARE_SECRET_KEY=${secretKey}
|
|
160
143
|
`;
|
|
161
144
|
}
|
|
145
|
+
function getMcpServerEntry(apiKey) {
|
|
146
|
+
return {
|
|
147
|
+
type: "http",
|
|
148
|
+
url: "https://mcp.01.software/mcp",
|
|
149
|
+
headers: { "x-api-key": apiKey }
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function getMcpConfigTemplate(apiKey) {
|
|
153
|
+
return JSON.stringify(
|
|
154
|
+
{ mcpServers: { "01software": getMcpServerEntry(apiKey) } },
|
|
155
|
+
null,
|
|
156
|
+
2
|
|
157
|
+
) + "\n";
|
|
158
|
+
}
|
|
162
159
|
|
|
163
160
|
// src/init.ts
|
|
164
161
|
async function init(cwd, info, answers) {
|
|
@@ -168,7 +165,7 @@ async function init(cwd, info, answers) {
|
|
|
168
165
|
const wsPatched = packageManager === "pnpm" && patchPnpmWorkspace(cwd);
|
|
169
166
|
const pkgs = "@01.software/sdk @tanstack/react-query";
|
|
170
167
|
const pnpmFlag = hasPnpmWorkspace(cwd) ? " -w" : "";
|
|
171
|
-
const addCmd = packageManager === "pnpm" ? `pnpm add${pnpmFlag} ${pkgs}` : packageManager === "yarn" ? `yarn add ${pkgs}` : packageManager === "bun" ? `bun add ${pkgs}` : `npm
|
|
168
|
+
const addCmd = packageManager === "pnpm" ? `pnpm add${pnpmFlag} ${pkgs}` : packageManager === "yarn" ? `yarn add ${pkgs}` : packageManager === "bun" ? `bun add ${pkgs}` : `npm install ${pkgs}`;
|
|
172
169
|
try {
|
|
173
170
|
execSync(addCmd, { cwd, stdio: "pipe" });
|
|
174
171
|
} catch (error) {
|
|
@@ -203,15 +200,8 @@ async function init(cwd, info, answers) {
|
|
|
203
200
|
fs2.writeFileSync(serverPath, getServerTemplate());
|
|
204
201
|
console.log(pc.green(" Created"), relativePath(cwd, serverPath));
|
|
205
202
|
}
|
|
206
|
-
const appDir = path2.join(baseDir, "app");
|
|
207
|
-
const pagePath = path2.join(appDir, "page.tsx");
|
|
208
|
-
if (!fs2.existsSync(pagePath)) {
|
|
209
|
-
fs2.mkdirSync(appDir, { recursive: true });
|
|
210
|
-
fs2.writeFileSync(pagePath, getPageTemplate());
|
|
211
|
-
console.log(pc.green(" Created"), relativePath(cwd, pagePath));
|
|
212
|
-
}
|
|
213
203
|
const envPath = path2.join(cwd, ".env");
|
|
214
|
-
const envContent = getEnvContent(answers.clientKey || "");
|
|
204
|
+
const envContent = getEnvContent(answers.clientKey || "", answers.secretKey || "");
|
|
215
205
|
if (fs2.existsSync(envPath)) {
|
|
216
206
|
const existing = fs2.readFileSync(envPath, "utf-8");
|
|
217
207
|
if (existing.includes("NEXT_PUBLIC_SOFTWARE_CLIENT_KEY")) {
|
|
@@ -224,6 +214,38 @@ async function init(cwd, info, answers) {
|
|
|
224
214
|
fs2.writeFileSync(envPath, envContent.trimStart());
|
|
225
215
|
console.log(pc.green(" Created"), ".env");
|
|
226
216
|
}
|
|
217
|
+
if (answers.setupMcp) {
|
|
218
|
+
const clientKey = answers.clientKey || "";
|
|
219
|
+
const secretKey = answers.secretKey || "";
|
|
220
|
+
const apiKey = clientKey && secretKey ? Buffer.from(`${clientKey}:${secretKey}`).toString("base64") : "YOUR_API_KEY";
|
|
221
|
+
const mcpPath = path2.join(cwd, ".mcp.json");
|
|
222
|
+
if (fs2.existsSync(mcpPath)) {
|
|
223
|
+
try {
|
|
224
|
+
const existing = JSON.parse(fs2.readFileSync(mcpPath, "utf-8"));
|
|
225
|
+
if (existing.mcpServers?.["01software"]) {
|
|
226
|
+
console.log(pc.yellow(" Skipped"), ".mcp.json", pc.dim("(01software already configured)"));
|
|
227
|
+
} else {
|
|
228
|
+
existing.mcpServers = existing.mcpServers || {};
|
|
229
|
+
existing.mcpServers["01software"] = getMcpServerEntry(apiKey);
|
|
230
|
+
fs2.writeFileSync(mcpPath, JSON.stringify(existing, null, 2) + "\n");
|
|
231
|
+
console.log(pc.green(" Updated"), ".mcp.json");
|
|
232
|
+
}
|
|
233
|
+
} catch {
|
|
234
|
+
console.log(pc.yellow(" Skipped"), ".mcp.json", pc.dim("(could not parse existing file)"));
|
|
235
|
+
}
|
|
236
|
+
} else {
|
|
237
|
+
fs2.writeFileSync(mcpPath, getMcpConfigTemplate(apiKey));
|
|
238
|
+
console.log(pc.green(" Created"), ".mcp.json");
|
|
239
|
+
}
|
|
240
|
+
const gitignorePath = path2.join(cwd, ".gitignore");
|
|
241
|
+
if (fs2.existsSync(gitignorePath)) {
|
|
242
|
+
const gitignore = fs2.readFileSync(gitignorePath, "utf-8");
|
|
243
|
+
if (!gitignore.includes(".mcp.json")) {
|
|
244
|
+
fs2.appendFileSync(gitignorePath, "\n# MCP config (contains API key)\n.mcp.json\n");
|
|
245
|
+
console.log(pc.green(" Updated"), ".gitignore", pc.dim("(added .mcp.json)"));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
227
249
|
}
|
|
228
250
|
function relativePath(cwd, filePath) {
|
|
229
251
|
return path2.relative(cwd, filePath);
|
|
@@ -299,10 +321,14 @@ async function main() {
|
|
|
299
321
|
console.log();
|
|
300
322
|
console.log(pc2.cyan(" <QueryProvider>{children}</QueryProvider>"));
|
|
301
323
|
console.log();
|
|
302
|
-
if (!answers.clientKey) {
|
|
324
|
+
if (!answers.clientKey || !answers.secretKey) {
|
|
303
325
|
console.log(pc2.dim(" Update .env with your API keys"));
|
|
304
326
|
console.log();
|
|
305
327
|
}
|
|
328
|
+
if (answers.setupMcp && (!answers.clientKey || !answers.secretKey)) {
|
|
329
|
+
console.log(pc2.dim(" Update .mcp.json x-api-key with Base64(clientKey:secretKey)"));
|
|
330
|
+
console.log();
|
|
331
|
+
}
|
|
306
332
|
console.log(pc2.cyan(` ${run} dev`));
|
|
307
333
|
console.log();
|
|
308
334
|
} catch (error) {
|
|
@@ -315,4 +341,4 @@ async function main() {
|
|
|
315
341
|
}
|
|
316
342
|
}
|
|
317
343
|
main();
|
|
318
|
-
//# sourceMappingURL=index.
|
|
344
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/detect.ts","../src/prompts.ts","../src/init.ts","../src/templates.ts"],"sourcesContent":["import pc from 'picocolors'\nimport { detectProject } from './detect'\nimport { promptUser } from './prompts'\nimport { init } from './init'\n\nasync function main() {\n const cwd = process.cwd()\n\n console.log()\n console.log(pc.bold(' @01.software/init'))\n console.log(pc.dim(' Initialize 01.software SDK in your Next.js project'))\n console.log()\n\n // 1. Detect project\n const info = detectProject(cwd)\n\n if (!info.hasPackageJson) {\n console.log(pc.red(' No package.json found in the current directory.'))\n console.log(pc.dim(' Run this command inside an existing Next.js project.'))\n console.log()\n process.exit(1)\n }\n\n if (!info.isNextProject) {\n console.log(pc.red(' This does not appear to be a Next.js project.'))\n console.log(pc.dim(' Create one first: npx create-next-app my-app'))\n console.log()\n process.exit(1)\n }\n\n if (info.packageManager) {\n console.log(pc.dim(` Detected: Next.js / ${info.packageManager} / ${info.srcDir ? 'src/app' : 'app'}`))\n } else {\n console.log(pc.dim(` Detected: Next.js / ${info.srcDir ? 'src/app' : 'app'}`))\n }\n console.log()\n\n try {\n // 2. Prompt\n const answers = await promptUser(info.hasSdk, info.packageManager)\n if (!answers) {\n console.log(pc.yellow(' Cancelled.'))\n process.exit(0)\n }\n\n // Resolve package manager from detection or user selection\n const resolvedPm = info.packageManager ?? answers.packageManager ?? 'npm'\n const resolvedInfo = { ...info, packageManager: resolvedPm }\n\n // 3. Init\n console.log()\n await init(cwd, resolvedInfo, answers)\n\n // 4. Next steps\n const run = resolvedPm === 'npm' ? 'npm run' : resolvedPm\n\n console.log()\n console.log(pc.green(' Done!'))\n console.log()\n console.log(' Next steps:')\n console.log()\n console.log(pc.dim(' Add the QueryProvider to your root layout:'))\n console.log()\n console.log(pc.cyan(\" import { QueryProvider } from '@/lib/software/query-provider'\"))\n console.log()\n console.log(pc.dim(' Wrap children with <QueryProvider>:'))\n console.log()\n console.log(pc.cyan(' <QueryProvider>{children}</QueryProvider>'))\n console.log()\n if (!answers.clientKey || !answers.secretKey) {\n console.log(pc.dim(' Update .env with your API keys'))\n console.log()\n }\n if (answers.setupMcp && (!answers.clientKey || !answers.secretKey)) {\n console.log(pc.dim(' Update .mcp.json x-api-key with Base64(clientKey:secretKey)'))\n console.log()\n }\n console.log(pc.cyan(` ${run} dev`))\n console.log()\n } catch (error) {\n if (error instanceof Error && error.message === 'cancelled') {\n console.log(pc.yellow(' Cancelled.'))\n process.exit(0)\n }\n console.error(pc.red(' Error:'), error)\n process.exit(1)\n }\n}\n\nmain()\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun'\n\nexport interface ProjectInfo {\n hasPackageJson: boolean\n isNextProject: boolean\n packageManager: PackageManager | null // null if no lockfile detected\n hasSdk: boolean\n srcDir: boolean // true if src/app exists, false if app exists at root\n}\n\nexport function detectProject(cwd: string): ProjectInfo {\n const pkgPath = path.join(cwd, 'package.json')\n const hasPackageJson = fs.existsSync(pkgPath)\n\n let isNextProject = false\n let hasSdk = false\n\n if (hasPackageJson) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies }\n isNextProject = 'next' in allDeps\n hasSdk = '@01.software/sdk' in allDeps\n }\n\n // Detect package manager from lockfile\n let packageManager: PackageManager | null = null\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) {\n packageManager = 'pnpm'\n } else if (fs.existsSync(path.join(cwd, 'yarn.lock'))) {\n packageManager = 'yarn'\n } else if (\n fs.existsSync(path.join(cwd, 'bun.lockb')) ||\n fs.existsSync(path.join(cwd, 'bun.lock'))\n ) {\n packageManager = 'bun'\n } else if (fs.existsSync(path.join(cwd, 'package-lock.json'))) {\n packageManager = 'npm'\n }\n\n // Detect src/app vs app directory structure\n const srcDir = fs.existsSync(path.join(cwd, 'src', 'app'))\n\n return { hasPackageJson, isNextProject, packageManager, hasSdk, srcDir }\n}\n","import prompts from 'prompts'\nimport type { PackageManager } from './detect'\n\nexport interface InitAnswers {\n clientKey: string\n secretKey: string\n setupMcp: boolean\n packageManager?: PackageManager\n}\n\nexport async function promptUser(\n hasSdk: boolean,\n detectedPm: PackageManager | null,\n): Promise<InitAnswers | null> {\n const onCancel = () => {\n throw new Error('cancelled')\n }\n\n // Confirm re-init if SDK already installed\n if (hasSdk) {\n const { proceed } = await prompts(\n {\n type: 'confirm',\n name: 'proceed',\n message: '@01.software/sdk is already installed. Re-initialize?',\n initial: false,\n },\n { onCancel },\n )\n if (!proceed) return null\n }\n\n // Ask for package manager if no lockfile detected\n let packageManager: PackageManager | undefined\n if (!detectedPm) {\n const { pm } = await prompts(\n {\n type: 'select',\n name: 'pm',\n message: 'Which package manager do you use?',\n choices: [\n { title: 'npm', value: 'npm' },\n { title: 'pnpm', value: 'pnpm' },\n { title: 'yarn', value: 'yarn' },\n { title: 'bun', value: 'bun' },\n ],\n },\n { onCancel },\n )\n packageManager = pm\n }\n\n const keys = await prompts(\n [\n {\n type: 'text',\n name: 'clientKey',\n message: 'Client Key (optional, saved to .env)',\n initial: '',\n },\n {\n type: 'text',\n name: 'secretKey',\n message: 'Secret Key (optional, saved to .env)',\n initial: '',\n },\n ],\n { onCancel },\n )\n\n const { setupMcp } = await prompts(\n {\n type: 'confirm',\n name: 'setupMcp',\n message: 'Set up MCP integration? (.mcp.json)',\n initial: true,\n },\n { onCancel },\n )\n\n return { ...keys, setupMcp, packageManager } as InitAnswers\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { execSync } from 'node:child_process'\nimport pc from 'picocolors'\nimport type { PackageManager, ProjectInfo } from './detect'\n\ntype ResolvedProjectInfo = Omit<ProjectInfo, 'packageManager'> & {\n packageManager: PackageManager\n}\nimport type { InitAnswers } from './prompts'\nimport {\n getClientTemplate,\n getQueryProviderTemplate,\n getServerTemplate,\n getEnvContent,\n getMcpConfigTemplate,\n getMcpServerEntry,\n} from './templates'\n\nexport async function init(\n cwd: string,\n info: ResolvedProjectInfo,\n answers: InitAnswers,\n): Promise<void> {\n const { packageManager, srcDir } = info\n const baseDir = srcDir ? path.join(cwd, 'src') : cwd\n\n // 1. Install dependencies\n console.log(pc.dim(' Installing @01.software/sdk and @tanstack/react-query...'))\n\n // pnpm-workspace.yaml without packages: breaks pnpm add — patch temporarily\n const wsPatched = packageManager === 'pnpm' && patchPnpmWorkspace(cwd)\n\n const pkgs = '@01.software/sdk @tanstack/react-query'\n const pnpmFlag = hasPnpmWorkspace(cwd) ? ' -w' : ''\n const addCmd =\n packageManager === 'pnpm'\n ? `pnpm add${pnpmFlag} ${pkgs}`\n : packageManager === 'yarn'\n ? `yarn add ${pkgs}`\n : packageManager === 'bun'\n ? `bun add ${pkgs}`\n : `npm install ${pkgs}`\n\n try {\n execSync(addCmd, { cwd, stdio: 'pipe' })\n } catch (error) {\n const err = error as { stdout?: Buffer; stderr?: Buffer }\n const msg =\n String(err.stderr || '').trim() || String(err.stdout || '').trim() || String(error)\n console.log(pc.red(' Failed to install dependencies:'))\n console.log(pc.dim(` ${msg}`))\n throw error\n } finally {\n if (wsPatched) restorePnpmWorkspace(cwd)\n }\n\n // 2. Write lib/software/client.ts\n const libDir = path.join(baseDir, 'lib', 'software')\n fs.mkdirSync(libDir, { recursive: true })\n\n const clientPath = path.join(libDir, 'client.ts')\n if (fs.existsSync(clientPath)) {\n console.log(pc.yellow(' Skipped'), relativePath(cwd, clientPath), pc.dim('(already exists)'))\n } else {\n fs.writeFileSync(clientPath, getClientTemplate())\n console.log(pc.green(' Created'), relativePath(cwd, clientPath))\n }\n\n // 3. Write lib/software/query-provider.tsx\n const queryProviderPath = path.join(libDir, 'query-provider.tsx')\n if (fs.existsSync(queryProviderPath)) {\n console.log(pc.yellow(' Skipped'), relativePath(cwd, queryProviderPath), pc.dim('(already exists)'))\n } else {\n fs.writeFileSync(queryProviderPath, getQueryProviderTemplate())\n console.log(pc.green(' Created'), relativePath(cwd, queryProviderPath))\n }\n\n // 4. Write lib/software/server.ts\n const serverPath = path.join(libDir, 'server.ts')\n if (fs.existsSync(serverPath)) {\n console.log(pc.yellow(' Skipped'), relativePath(cwd, serverPath), pc.dim('(already exists)'))\n } else {\n fs.writeFileSync(serverPath, getServerTemplate())\n console.log(pc.green(' Created'), relativePath(cwd, serverPath))\n }\n\n // 5. Append to .env (skip if keys already present)\n const envPath = path.join(cwd, '.env')\n const envContent = getEnvContent(answers.clientKey || '', answers.secretKey || '')\n if (fs.existsSync(envPath)) {\n const existing = fs.readFileSync(envPath, 'utf-8')\n if (existing.includes('NEXT_PUBLIC_SOFTWARE_CLIENT_KEY')) {\n console.log(pc.yellow(' Skipped'), '.env', pc.dim('(keys already present)'))\n } else {\n fs.appendFileSync(envPath, envContent)\n console.log(pc.green(' Updated'), '.env')\n }\n } else {\n fs.writeFileSync(envPath, envContent.trimStart())\n console.log(pc.green(' Created'), '.env')\n }\n\n // 6. Write .mcp.json (MCP integration)\n if (answers.setupMcp) {\n const clientKey = answers.clientKey || ''\n const secretKey = answers.secretKey || ''\n const apiKey =\n clientKey && secretKey\n ? Buffer.from(`${clientKey}:${secretKey}`).toString('base64')\n : 'YOUR_API_KEY'\n\n const mcpPath = path.join(cwd, '.mcp.json')\n if (fs.existsSync(mcpPath)) {\n try {\n const existing = JSON.parse(fs.readFileSync(mcpPath, 'utf-8'))\n if (existing.mcpServers?.['01software']) {\n console.log(pc.yellow(' Skipped'), '.mcp.json', pc.dim('(01software already configured)'))\n } else {\n existing.mcpServers = existing.mcpServers || {}\n existing.mcpServers['01software'] = getMcpServerEntry(apiKey)\n fs.writeFileSync(mcpPath, JSON.stringify(existing, null, 2) + '\\n')\n console.log(pc.green(' Updated'), '.mcp.json')\n }\n } catch {\n console.log(pc.yellow(' Skipped'), '.mcp.json', pc.dim('(could not parse existing file)'))\n }\n } else {\n fs.writeFileSync(mcpPath, getMcpConfigTemplate(apiKey))\n console.log(pc.green(' Created'), '.mcp.json')\n }\n\n // 7. Add .mcp.json to .gitignore (contains API key)\n const gitignorePath = path.join(cwd, '.gitignore')\n if (fs.existsSync(gitignorePath)) {\n const gitignore = fs.readFileSync(gitignorePath, 'utf-8')\n if (!gitignore.includes('.mcp.json')) {\n fs.appendFileSync(gitignorePath, '\\n# MCP config (contains API key)\\n.mcp.json\\n')\n console.log(pc.green(' Updated'), '.gitignore', pc.dim('(added .mcp.json)'))\n }\n }\n }\n}\n\nfunction relativePath(cwd: string, filePath: string): string {\n return path.relative(cwd, filePath)\n}\n\nconst WS_FILE = 'pnpm-workspace.yaml'\nconst WS_BACKUP = 'pnpm-workspace.yaml.bak'\n\nfunction hasPnpmWorkspace(cwd: string): boolean {\n return fs.existsSync(path.join(cwd, WS_FILE))\n}\n\n/** Append packages: [] if pnpm-workspace.yaml exists without it — returns true if patched */\nfunction patchPnpmWorkspace(cwd: string): boolean {\n const wsPath = path.join(cwd, WS_FILE)\n if (!fs.existsSync(wsPath)) return false\n const content = fs.readFileSync(wsPath, 'utf-8')\n if (content.includes('packages:')) return false\n // backup original and append packages: []\n fs.copyFileSync(wsPath, path.join(cwd, WS_BACKUP))\n fs.writeFileSync(wsPath, content.trimEnd() + '\\npackages: []\\n')\n return true\n}\n\n/** Restore original pnpm-workspace.yaml from backup */\nfunction restorePnpmWorkspace(cwd: string): void {\n const backupPath = path.join(cwd, WS_BACKUP)\n if (!fs.existsSync(backupPath)) return\n fs.copyFileSync(backupPath, path.join(cwd, WS_FILE))\n fs.unlinkSync(backupPath)\n}\n","export function getClientTemplate(): string {\n return `import { createBrowserClient } from '@01.software/sdk'\n\nexport const client = createBrowserClient({\n clientKey: process.env.NEXT_PUBLIC_SOFTWARE_CLIENT_KEY!,\n})\n`\n}\n\nexport function getQueryProviderTemplate(): string {\n return `'use client'\n\nimport { QueryClientProvider } from '@tanstack/react-query'\nimport { client } from './client'\n\nexport function QueryProvider({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={client.queryClient}>\n {children}\n </QueryClientProvider>\n )\n}\n`\n}\n\nexport function getServerTemplate(): string {\n return `import { createServerClient } from '@01.software/sdk'\n\nexport const serverClient = createServerClient({\n clientKey: process.env.NEXT_PUBLIC_SOFTWARE_CLIENT_KEY!,\n secretKey: process.env.SOFTWARE_SECRET_KEY!,\n})\n`\n}\n\nexport function getEnvContent(clientKey: string, secretKey: string): string {\n return `\\n# 01.software\nNEXT_PUBLIC_SOFTWARE_CLIENT_KEY=${clientKey}\nSOFTWARE_SECRET_KEY=${secretKey}\n`\n}\n\nexport function getMcpServerEntry(apiKey: string) {\n return {\n type: 'http' as const,\n url: 'https://mcp.01.software/mcp',\n headers: { 'x-api-key': apiKey },\n }\n}\n\nexport function getMcpConfigTemplate(apiKey: string): string {\n return JSON.stringify(\n { mcpServers: { '01software': getMcpServerEntry(apiKey) } },\n null,\n 2,\n ) + '\\n'\n}"],"mappings":"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","names":["pc","fs","path","path","fs","pc"]}
|
package/package.json
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@01.software/init",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Initialize 01.software SDK in your Next.js project",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"bin": {
|
|
6
|
-
"01-init": "./dist/index.
|
|
7
|
+
"01-init": "./dist/index.js"
|
|
7
8
|
},
|
|
8
9
|
"files": [
|
|
9
10
|
"dist"
|
|
10
11
|
],
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"dev": "tsup --watch",
|
|
14
|
-
"check-types": "tsc --noEmit"
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=18.0.0"
|
|
15
14
|
},
|
|
16
15
|
"dependencies": {
|
|
17
16
|
"prompts": "^2.4.2",
|
|
@@ -25,5 +24,15 @@
|
|
|
25
24
|
"publishConfig": {
|
|
26
25
|
"access": "public"
|
|
27
26
|
},
|
|
28
|
-
"
|
|
29
|
-
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsup",
|
|
29
|
+
"dev": "tsup --watch",
|
|
30
|
+
"check-types": "tsc --noEmit",
|
|
31
|
+
"version:dev": "node ../../scripts/update-version.js",
|
|
32
|
+
"publish:dev": "pnpm run version:dev && pnpm publish --no-git-checks --access public --tag dev",
|
|
33
|
+
"version:patch": "pnpm version patch --no-git-tag-version",
|
|
34
|
+
"version:minor": "pnpm version minor --no-git-tag-version",
|
|
35
|
+
"version:major": "pnpm version major --no-git-tag-version",
|
|
36
|
+
"publish:prod": "pnpm publish --access public"
|
|
37
|
+
}
|
|
38
|
+
}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/detect.ts","../src/prompts.ts","../src/init.ts","../src/templates.ts"],"sourcesContent":["import pc from 'picocolors'\nimport { detectProject } from './detect'\nimport { promptUser } from './prompts'\nimport { init } from './init'\n\nasync function main() {\n const cwd = process.cwd()\n\n console.log()\n console.log(pc.bold(' @01.software/init'))\n console.log(pc.dim(' Initialize 01.software SDK in your Next.js project'))\n console.log()\n\n // 1. Detect project\n const info = detectProject(cwd)\n\n if (!info.hasPackageJson) {\n console.log(pc.red(' No package.json found in the current directory.'))\n console.log(pc.dim(' Run this command inside an existing Next.js project.'))\n console.log()\n process.exit(1)\n }\n\n if (!info.isNextProject) {\n console.log(pc.red(' This does not appear to be a Next.js project.'))\n console.log(pc.dim(' Create one first: npx create-next-app my-app'))\n console.log()\n process.exit(1)\n }\n\n if (info.packageManager) {\n console.log(pc.dim(` Detected: Next.js / ${info.packageManager} / ${info.srcDir ? 'src/app' : 'app'}`))\n } else {\n console.log(pc.dim(` Detected: Next.js / ${info.srcDir ? 'src/app' : 'app'}`))\n }\n console.log()\n\n try {\n // 2. Prompt\n const answers = await promptUser(info.hasSdk, info.packageManager)\n if (!answers) {\n console.log(pc.yellow(' Cancelled.'))\n process.exit(0)\n }\n\n // Resolve package manager from detection or user selection\n const resolvedPm = info.packageManager ?? answers.packageManager ?? 'npm'\n const resolvedInfo = { ...info, packageManager: resolvedPm }\n\n // 3. Init\n console.log()\n await init(cwd, resolvedInfo, answers)\n\n // 4. Next steps\n const run = resolvedPm === 'npm' ? 'npm run' : resolvedPm\n\n console.log()\n console.log(pc.green(' Done!'))\n console.log()\n console.log(' Next steps:')\n console.log()\n console.log(pc.dim(' Add the QueryProvider to your root layout:'))\n console.log()\n console.log(pc.cyan(\" import { QueryProvider } from '@/lib/software/query-provider'\"))\n console.log()\n console.log(pc.dim(' Wrap children with <QueryProvider>:'))\n console.log()\n console.log(pc.cyan(' <QueryProvider>{children}</QueryProvider>'))\n console.log()\n if (!answers.clientKey) {\n console.log(pc.dim(' Update .env with your API keys'))\n console.log()\n }\n console.log(pc.cyan(` ${run} dev`))\n console.log()\n } catch (error) {\n if (error instanceof Error && error.message === 'cancelled') {\n console.log(pc.yellow(' Cancelled.'))\n process.exit(0)\n }\n console.error(pc.red(' Error:'), error)\n process.exit(1)\n }\n}\n\nmain()\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun'\n\nexport interface ProjectInfo {\n hasPackageJson: boolean\n isNextProject: boolean\n packageManager: PackageManager | null // null if no lockfile detected\n hasSdk: boolean\n srcDir: boolean // true if src/app exists, false if app exists at root\n}\n\nexport function detectProject(cwd: string): ProjectInfo {\n const pkgPath = path.join(cwd, 'package.json')\n const hasPackageJson = fs.existsSync(pkgPath)\n\n let isNextProject = false\n let hasSdk = false\n\n if (hasPackageJson) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies }\n isNextProject = 'next' in allDeps\n hasSdk = '@01.software/sdk' in allDeps\n }\n\n // Detect package manager from lockfile\n let packageManager: PackageManager | null = null\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) {\n packageManager = 'pnpm'\n } else if (fs.existsSync(path.join(cwd, 'yarn.lock'))) {\n packageManager = 'yarn'\n } else if (\n fs.existsSync(path.join(cwd, 'bun.lockb')) ||\n fs.existsSync(path.join(cwd, 'bun.lock'))\n ) {\n packageManager = 'bun'\n } else if (fs.existsSync(path.join(cwd, 'package-lock.json'))) {\n packageManager = 'npm'\n }\n\n // Detect src/app vs app directory structure\n const srcDir = fs.existsSync(path.join(cwd, 'src', 'app'))\n\n return { hasPackageJson, isNextProject, packageManager, hasSdk, srcDir }\n}\n","import prompts from 'prompts'\nimport type { PackageManager } from './detect'\n\nexport interface InitAnswers {\n clientKey: string\n packageManager?: PackageManager\n}\n\nexport async function promptUser(\n hasSdk: boolean,\n detectedPm: PackageManager | null,\n): Promise<InitAnswers | null> {\n const onCancel = () => {\n throw new Error('cancelled')\n }\n\n // Confirm re-init if SDK already installed\n if (hasSdk) {\n const { proceed } = await prompts(\n {\n type: 'confirm',\n name: 'proceed',\n message: '@01.software/sdk is already installed. Re-initialize?',\n initial: false,\n },\n { onCancel },\n )\n if (!proceed) return null\n }\n\n // Ask for package manager if no lockfile detected\n let packageManager: PackageManager | undefined\n if (!detectedPm) {\n const { pm } = await prompts(\n {\n type: 'select',\n name: 'pm',\n message: 'Which package manager do you use?',\n choices: [\n { title: 'npm', value: 'npm' },\n { title: 'pnpm', value: 'pnpm' },\n { title: 'yarn', value: 'yarn' },\n { title: 'bun', value: 'bun' },\n ],\n },\n { onCancel },\n )\n packageManager = pm\n }\n\n const response = await prompts(\n [\n {\n type: 'text',\n name: 'clientKey',\n message: 'Client Key (optional, saved to .env)',\n initial: '',\n },\n ],\n { onCancel },\n )\n\n return { ...response, packageManager } as InitAnswers\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { execSync } from 'node:child_process'\nimport pc from 'picocolors'\nimport type { PackageManager, ProjectInfo } from './detect'\n\ntype ResolvedProjectInfo = Omit<ProjectInfo, 'packageManager'> & {\n packageManager: PackageManager\n}\nimport type { InitAnswers } from './prompts'\nimport {\n getClientTemplate,\n getQueryProviderTemplate,\n getServerTemplate,\n getPageTemplate,\n getEnvContent,\n} from './templates'\n\nexport async function init(\n cwd: string,\n info: ResolvedProjectInfo,\n answers: InitAnswers,\n): Promise<void> {\n const { packageManager, srcDir } = info\n const baseDir = srcDir ? path.join(cwd, 'src') : cwd\n\n // 1. Install dependencies\n console.log(pc.dim(' Installing @01.software/sdk and @tanstack/react-query...'))\n\n // pnpm-workspace.yaml without packages: breaks pnpm add — patch temporarily\n const wsPatched = packageManager === 'pnpm' && patchPnpmWorkspace(cwd)\n\n const pkgs = '@01.software/sdk @tanstack/react-query'\n const pnpmFlag = hasPnpmWorkspace(cwd) ? ' -w' : ''\n const addCmd =\n packageManager === 'pnpm'\n ? `pnpm add${pnpmFlag} ${pkgs}`\n : packageManager === 'yarn'\n ? `yarn add ${pkgs}`\n : packageManager === 'bun'\n ? `bun add ${pkgs}`\n : `npm add ${pkgs}`\n\n try {\n execSync(addCmd, { cwd, stdio: 'pipe' })\n } catch (error) {\n const err = error as { stdout?: Buffer; stderr?: Buffer }\n const msg =\n String(err.stderr || '').trim() || String(err.stdout || '').trim() || String(error)\n console.log(pc.red(' Failed to install dependencies:'))\n console.log(pc.dim(` ${msg}`))\n throw error\n } finally {\n if (wsPatched) restorePnpmWorkspace(cwd)\n }\n\n // 2. Write lib/software/client.ts\n const libDir = path.join(baseDir, 'lib', 'software')\n fs.mkdirSync(libDir, { recursive: true })\n\n const clientPath = path.join(libDir, 'client.ts')\n if (fs.existsSync(clientPath)) {\n console.log(pc.yellow(' Skipped'), relativePath(cwd, clientPath), pc.dim('(already exists)'))\n } else {\n fs.writeFileSync(clientPath, getClientTemplate())\n console.log(pc.green(' Created'), relativePath(cwd, clientPath))\n }\n\n // 3. Write lib/software/query-provider.tsx\n const queryProviderPath = path.join(libDir, 'query-provider.tsx')\n if (fs.existsSync(queryProviderPath)) {\n console.log(pc.yellow(' Skipped'), relativePath(cwd, queryProviderPath), pc.dim('(already exists)'))\n } else {\n fs.writeFileSync(queryProviderPath, getQueryProviderTemplate())\n console.log(pc.green(' Created'), relativePath(cwd, queryProviderPath))\n }\n\n // 4. Write lib/software/server.ts\n const serverPath = path.join(libDir, 'server.ts')\n if (fs.existsSync(serverPath)) {\n console.log(pc.yellow(' Skipped'), relativePath(cwd, serverPath), pc.dim('(already exists)'))\n } else {\n fs.writeFileSync(serverPath, getServerTemplate())\n console.log(pc.green(' Created'), relativePath(cwd, serverPath))\n }\n\n // 5. Write app/page.tsx (only if no existing page)\n const appDir = path.join(baseDir, 'app')\n const pagePath = path.join(appDir, 'page.tsx')\n if (!fs.existsSync(pagePath)) {\n fs.mkdirSync(appDir, { recursive: true })\n fs.writeFileSync(pagePath, getPageTemplate())\n console.log(pc.green(' Created'), relativePath(cwd, pagePath))\n }\n\n // 6. Append to .env (skip if keys already present)\n const envPath = path.join(cwd, '.env')\n const envContent = getEnvContent(answers.clientKey || '')\n if (fs.existsSync(envPath)) {\n const existing = fs.readFileSync(envPath, 'utf-8')\n if (existing.includes('NEXT_PUBLIC_SOFTWARE_CLIENT_KEY')) {\n console.log(pc.yellow(' Skipped'), '.env', pc.dim('(keys already present)'))\n } else {\n fs.appendFileSync(envPath, envContent)\n console.log(pc.green(' Updated'), '.env')\n }\n } else {\n fs.writeFileSync(envPath, envContent.trimStart())\n console.log(pc.green(' Created'), '.env')\n }\n}\n\nfunction relativePath(cwd: string, filePath: string): string {\n return path.relative(cwd, filePath)\n}\n\nconst WS_FILE = 'pnpm-workspace.yaml'\nconst WS_BACKUP = 'pnpm-workspace.yaml.bak'\n\nfunction hasPnpmWorkspace(cwd: string): boolean {\n return fs.existsSync(path.join(cwd, WS_FILE))\n}\n\n/** Append packages: [] if pnpm-workspace.yaml exists without it — returns true if patched */\nfunction patchPnpmWorkspace(cwd: string): boolean {\n const wsPath = path.join(cwd, WS_FILE)\n if (!fs.existsSync(wsPath)) return false\n const content = fs.readFileSync(wsPath, 'utf-8')\n if (content.includes('packages:')) return false\n // backup original and append packages: []\n fs.copyFileSync(wsPath, path.join(cwd, WS_BACKUP))\n fs.writeFileSync(wsPath, content.trimEnd() + '\\npackages: []\\n')\n return true\n}\n\n/** Restore original pnpm-workspace.yaml from backup */\nfunction restorePnpmWorkspace(cwd: string): void {\n const backupPath = path.join(cwd, WS_BACKUP)\n if (!fs.existsSync(backupPath)) return\n fs.copyFileSync(backupPath, path.join(cwd, WS_FILE))\n fs.unlinkSync(backupPath)\n}\n","export function getClientTemplate(): string {\n return `import { createBrowserClient } from '@01.software/sdk'\n\nexport const client = createBrowserClient({\n clientKey: process.env.NEXT_PUBLIC_SOFTWARE_CLIENT_KEY!,\n})\n`\n}\n\nexport function getQueryProviderTemplate(): string {\n return `'use client'\n\nimport { QueryClientProvider } from '@tanstack/react-query'\nimport { client } from './client'\n\nexport function QueryProvider({ children }: { children: React.ReactNode }) {\n return (\n <QueryClientProvider client={client.queryClient}>\n {children}\n </QueryClientProvider>\n )\n}\n`\n}\n\nexport function getServerTemplate(): string {\n return `import { createServerClient } from '@01.software/sdk'\n\nexport const serverClient = createServerClient({\n clientKey: process.env.NEXT_PUBLIC_SOFTWARE_CLIENT_KEY!,\n secretKey: process.env.SOFTWARE_SECRET_KEY!,\n})\n`\n}\n\nexport function getPageTemplate(): string {\n return `'use client'\n\nimport { client } from '@/lib/software/client'\n\nexport default function Home() {\n const { data, isLoading } = client.query.useQuery({\n collection: 'products',\n options: { limit: 10 },\n })\n\n return (\n <main style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>\n <h1>My App</h1>\n <p>Built with <a href=\"https://01.software\">01.software</a> SDK</p>\n\n <h2>Products</h2>\n {isLoading ? (\n <p>Loading...</p>\n ) : (\n <ul>\n {data?.docs.map((product) => (\n <li key={product.id}>{product.title ?? product.id}</li>\n ))}\n {data?.docs.length === 0 && <li>No products found</li>}\n </ul>\n )}\n </main>\n )\n}\n`\n}\n\nexport function getEnvContent(clientKey: string): string {\n return `\\n# 01.software\nNEXT_PUBLIC_SOFTWARE_CLIENT_KEY=${clientKey}\nSOFTWARE_SECRET_KEY=\n`\n}"],"mappings":"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","names":["pc","fs","path","path","fs","pc"]}
|