@getpara/cli 2.15.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/README.md +97 -0
- package/dist/api/client.d.ts +49 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +247 -0
- package/dist/api/errors.d.ts +9 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +29 -0
- package/dist/api/types.d.ts +155 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +58 -0
- package/dist/auth/polling-flow.d.ts +7 -0
- package/dist/auth/polling-flow.d.ts.map +1 -0
- package/dist/auth/polling-flow.js +94 -0
- package/dist/auth/session-manager.d.ts +7 -0
- package/dist/auth/session-manager.d.ts.map +1 -0
- package/dist/auth/session-manager.js +42 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +151 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +18 -0
- package/dist/commands/auth/login.d.ts +3 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +70 -0
- package/dist/commands/auth/logout.d.ts +3 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +45 -0
- package/dist/commands/auth/status.d.ts +3 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +54 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +122 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +587 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +67 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +45 -0
- package/dist/commands/keys/archive.d.ts +3 -0
- package/dist/commands/keys/archive.d.ts.map +1 -0
- package/dist/commands/keys/archive.js +49 -0
- package/dist/commands/keys/config/branding.d.ts +23 -0
- package/dist/commands/keys/config/branding.d.ts.map +1 -0
- package/dist/commands/keys/config/branding.js +246 -0
- package/dist/commands/keys/config/categories.d.ts +15 -0
- package/dist/commands/keys/config/categories.d.ts.map +1 -0
- package/dist/commands/keys/config/categories.js +67 -0
- package/dist/commands/keys/config/index.d.ts +3 -0
- package/dist/commands/keys/config/index.d.ts.map +1 -0
- package/dist/commands/keys/config/index.js +56 -0
- package/dist/commands/keys/config/ramps.d.ts +18 -0
- package/dist/commands/keys/config/ramps.d.ts.map +1 -0
- package/dist/commands/keys/config/ramps.js +185 -0
- package/dist/commands/keys/config/security.d.ts +15 -0
- package/dist/commands/keys/config/security.d.ts.map +1 -0
- package/dist/commands/keys/config/security.js +212 -0
- package/dist/commands/keys/config/setup.d.ts +16 -0
- package/dist/commands/keys/config/setup.d.ts.map +1 -0
- package/dist/commands/keys/config/setup.js +235 -0
- package/dist/commands/keys/config/webhooks.d.ts +18 -0
- package/dist/commands/keys/config/webhooks.d.ts.map +1 -0
- package/dist/commands/keys/config/webhooks.js +279 -0
- package/dist/commands/keys/create.d.ts +3 -0
- package/dist/commands/keys/create.d.ts.map +1 -0
- package/dist/commands/keys/create.js +64 -0
- package/dist/commands/keys/get.d.ts +3 -0
- package/dist/commands/keys/get.d.ts.map +1 -0
- package/dist/commands/keys/get.js +91 -0
- package/dist/commands/keys/index.d.ts +3 -0
- package/dist/commands/keys/index.d.ts.map +1 -0
- package/dist/commands/keys/index.js +22 -0
- package/dist/commands/keys/list.d.ts +3 -0
- package/dist/commands/keys/list.d.ts.map +1 -0
- package/dist/commands/keys/list.js +66 -0
- package/dist/commands/keys/rotate.d.ts +3 -0
- package/dist/commands/keys/rotate.d.ts.map +1 -0
- package/dist/commands/keys/rotate.js +59 -0
- package/dist/commands/orgs/index.d.ts +3 -0
- package/dist/commands/orgs/index.d.ts.map +1 -0
- package/dist/commands/orgs/index.js +15 -0
- package/dist/commands/orgs/list.d.ts +3 -0
- package/dist/commands/orgs/list.d.ts.map +1 -0
- package/dist/commands/orgs/list.js +53 -0
- package/dist/commands/orgs/switch.d.ts +3 -0
- package/dist/commands/orgs/switch.d.ts.map +1 -0
- package/dist/commands/orgs/switch.js +61 -0
- package/dist/commands/projects/archive.d.ts +3 -0
- package/dist/commands/projects/archive.d.ts.map +1 -0
- package/dist/commands/projects/archive.js +51 -0
- package/dist/commands/projects/create.d.ts +3 -0
- package/dist/commands/projects/create.d.ts.map +1 -0
- package/dist/commands/projects/create.js +48 -0
- package/dist/commands/projects/index.d.ts +3 -0
- package/dist/commands/projects/index.d.ts.map +1 -0
- package/dist/commands/projects/index.js +25 -0
- package/dist/commands/projects/list.d.ts +3 -0
- package/dist/commands/projects/list.d.ts.map +1 -0
- package/dist/commands/projects/list.js +52 -0
- package/dist/commands/projects/restore.d.ts +3 -0
- package/dist/commands/projects/restore.d.ts.map +1 -0
- package/dist/commands/projects/restore.js +36 -0
- package/dist/commands/projects/switch.d.ts +3 -0
- package/dist/commands/projects/switch.d.ts.map +1 -0
- package/dist/commands/projects/switch.js +57 -0
- package/dist/commands/projects/update.d.ts +3 -0
- package/dist/commands/projects/update.d.ts.map +1 -0
- package/dist/commands/projects/update.js +67 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +61 -0
- package/dist/config/config-manager.d.ts +3 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +32 -0
- package/dist/config/config-store.d.ts +10 -0
- package/dist/config/config-store.d.ts.map +1 -0
- package/dist/config/config-store.js +37 -0
- package/dist/config/credential-store.d.ts +12 -0
- package/dist/config/credential-store.d.ts.map +1 -0
- package/dist/config/credential-store.js +94 -0
- package/dist/config/paths.d.ts +5 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +29 -0
- package/dist/config/project-config.d.ts +8 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/config/project-config.js +41 -0
- package/dist/core/constants.d.ts +27 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +60 -0
- package/dist/core/error-handler.d.ts +24 -0
- package/dist/core/error-handler.d.ts.map +1 -0
- package/dist/core/error-handler.js +83 -0
- package/dist/core/types.d.ts +21 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +0 -0
- package/dist/core/update-check.d.ts +6 -0
- package/dist/core/update-check.d.ts.map +1 -0
- package/dist/core/update-check.js +78 -0
- package/dist/diagnostics/checks/chain-dependencies.d.ts +2 -0
- package/dist/diagnostics/checks/chain-dependencies.d.ts.map +1 -0
- package/dist/diagnostics/checks/chain-dependencies.js +130 -0
- package/dist/diagnostics/checks/css-import.d.ts +2 -0
- package/dist/diagnostics/checks/css-import.d.ts.map +1 -0
- package/dist/diagnostics/checks/css-import.js +57 -0
- package/dist/diagnostics/checks/deprecated-packages.d.ts +2 -0
- package/dist/diagnostics/checks/deprecated-packages.d.ts.map +1 -0
- package/dist/diagnostics/checks/deprecated-packages.js +93 -0
- package/dist/diagnostics/checks/env-api-key.d.ts +2 -0
- package/dist/diagnostics/checks/env-api-key.d.ts.map +1 -0
- package/dist/diagnostics/checks/env-api-key.js +75 -0
- package/dist/diagnostics/checks/env-var-prefix.d.ts +2 -0
- package/dist/diagnostics/checks/env-var-prefix.d.ts.map +1 -0
- package/dist/diagnostics/checks/env-var-prefix.js +52 -0
- package/dist/diagnostics/checks/index.d.ts +13 -0
- package/dist/diagnostics/checks/index.d.ts.map +1 -0
- package/dist/diagnostics/checks/index.js +32 -0
- package/dist/diagnostics/checks/para-provider.d.ts +2 -0
- package/dist/diagnostics/checks/para-provider.d.ts.map +1 -0
- package/dist/diagnostics/checks/para-provider.js +42 -0
- package/dist/diagnostics/checks/query-client.d.ts +2 -0
- package/dist/diagnostics/checks/query-client.d.ts.map +1 -0
- package/dist/diagnostics/checks/query-client.js +58 -0
- package/dist/diagnostics/checks/use-client-directive.d.ts +2 -0
- package/dist/diagnostics/checks/use-client-directive.d.ts.map +1 -0
- package/dist/diagnostics/checks/use-client-directive.js +81 -0
- package/dist/diagnostics/checks/version-consistency.d.ts +2 -0
- package/dist/diagnostics/checks/version-consistency.d.ts.map +1 -0
- package/dist/diagnostics/checks/version-consistency.js +93 -0
- package/dist/diagnostics/context.d.ts +3 -0
- package/dist/diagnostics/context.d.ts.map +1 -0
- package/dist/diagnostics/context.js +56 -0
- package/dist/diagnostics/detectors/framework.d.ts +5 -0
- package/dist/diagnostics/detectors/framework.d.ts.map +1 -0
- package/dist/diagnostics/detectors/framework.js +73 -0
- package/dist/diagnostics/detectors/package-manager.d.ts +3 -0
- package/dist/diagnostics/detectors/package-manager.d.ts.map +1 -0
- package/dist/diagnostics/detectors/package-manager.js +17 -0
- package/dist/diagnostics/detectors/sdk.d.ts +7 -0
- package/dist/diagnostics/detectors/sdk.d.ts.map +1 -0
- package/dist/diagnostics/detectors/sdk.js +48 -0
- package/dist/diagnostics/runner.d.ts +3 -0
- package/dist/diagnostics/runner.d.ts.map +1 -0
- package/dist/diagnostics/runner.js +44 -0
- package/dist/diagnostics/types.d.ts +70 -0
- package/dist/diagnostics/types.d.ts.map +1 -0
- package/dist/diagnostics/types.js +14 -0
- package/dist/diagnostics/utils/code-search.d.ts +10 -0
- package/dist/diagnostics/utils/code-search.d.ts.map +1 -0
- package/dist/diagnostics/utils/code-search.js +98 -0
- package/dist/diagnostics/utils/file-system.d.ts +7 -0
- package/dist/diagnostics/utils/file-system.d.ts.map +1 -0
- package/dist/diagnostics/utils/file-system.js +72 -0
- package/dist/diagnostics/utils/package-json.d.ts +12 -0
- package/dist/diagnostics/utils/package-json.d.ts.map +1 -0
- package/dist/diagnostics/utils/package-json.js +51 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/output/formatter.d.ts +25 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +76 -0
- package/dist/output/mask.d.ts +2 -0
- package/dist/output/mask.d.ts.map +1 -0
- package/dist/output/mask.js +15 -0
- package/dist/output/prompts.d.ts +25 -0
- package/dist/output/prompts.d.ts.map +1 -0
- package/dist/output/prompts.js +86 -0
- package/dist/output/spinner.d.ts +6 -0
- package/dist/output/spinner.d.ts.map +1 -0
- package/dist/output/spinner.js +7 -0
- package/dist/output/table.d.ts +9 -0
- package/dist/output/table.d.ts.map +1 -0
- package/dist/output/table.js +21 -0
- package/dist/scaffolding/scaffolder.d.ts +3 -0
- package/dist/scaffolding/scaffolder.d.ts.map +1 -0
- package/dist/scaffolding/scaffolder.js +78 -0
- package/dist/scaffolding/strategies/expo-template.d.ts +16 -0
- package/dist/scaffolding/strategies/expo-template.d.ts.map +1 -0
- package/dist/scaffolding/strategies/expo-template.js +160 -0
- package/dist/scaffolding/strategies/index.d.ts +5 -0
- package/dist/scaffolding/strategies/index.d.ts.map +1 -0
- package/dist/scaffolding/strategies/index.js +25 -0
- package/dist/scaffolding/strategies/nextjs-template.d.ts +12 -0
- package/dist/scaffolding/strategies/nextjs-template.d.ts.map +1 -0
- package/dist/scaffolding/strategies/nextjs-template.js +122 -0
- package/dist/scaffolding/template-renderer.d.ts +11 -0
- package/dist/scaffolding/template-renderer.d.ts.map +1 -0
- package/dist/scaffolding/template-renderer.js +99 -0
- package/dist/scaffolding/types.d.ts +69 -0
- package/dist/scaffolding/types.d.ts.map +1 -0
- package/dist/scaffolding/types.js +21 -0
- package/dist/scaffolding/utils/detect-package-manager.d.ts +23 -0
- package/dist/scaffolding/utils/detect-package-manager.d.ts.map +1 -0
- package/dist/scaffolding/utils/detect-package-manager.js +57 -0
- package/dist/scaffolding/utils/fs.d.ts +11 -0
- package/dist/scaffolding/utils/fs.d.ts.map +1 -0
- package/dist/scaffolding/utils/fs.js +45 -0
- package/dist/scaffolding/utils/resolve-para-version.d.ts +7 -0
- package/dist/scaffolding/utils/resolve-para-version.d.ts.map +1 -0
- package/dist/scaffolding/utils/resolve-para-version.js +21 -0
- package/dist/validation/auth-methods.d.ts +14 -0
- package/dist/validation/auth-methods.d.ts.map +1 -0
- package/dist/validation/auth-methods.js +23 -0
- package/dist/validation/cidr.d.ts +11 -0
- package/dist/validation/cidr.d.ts.map +1 -0
- package/dist/validation/cidr.js +35 -0
- package/dist/validation/hex-color.d.ts +7 -0
- package/dist/validation/hex-color.d.ts.map +1 -0
- package/dist/validation/hex-color.js +10 -0
- package/dist/validation/index.d.ts +9 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +49 -0
- package/dist/validation/native-passkey.d.ts +31 -0
- package/dist/validation/native-passkey.d.ts.map +1 -0
- package/dist/validation/native-passkey.js +45 -0
- package/dist/validation/session-length.d.ts +18 -0
- package/dist/validation/session-length.d.ts.map +1 -0
- package/dist/validation/session-length.js +30 -0
- package/dist/validation/url.d.ts +26 -0
- package/dist/validation/url.d.ts.map +1 -0
- package/dist/validation/url.js +50 -0
- package/dist/validation/wallet-types.d.ts +14 -0
- package/dist/validation/wallet-types.d.ts.map +1 -0
- package/dist/validation/wallet-types.js +22 -0
- package/dist/validation/webhook.d.ts +4 -0
- package/dist/validation/webhook.d.ts.map +1 -0
- package/dist/validation/webhook.js +33 -0
- package/package.json +60 -0
- package/templates/expo/_env.example +3 -0
- package/templates/expo/_gitignore +48 -0
- package/templates/expo/_yarnrc.yml +1 -0
- package/templates/expo/app/(auth)/_layout.tsx +12 -0
- package/templates/expo/app/(auth)/index.tsx.template +86 -0
- package/templates/expo/app/(tabs)/_layout.tsx +16 -0
- package/templates/expo/app/(tabs)/index.tsx +112 -0
- package/templates/expo/app/(tabs)/send.tsx +111 -0
- package/templates/expo/app/_layout.tsx +17 -0
- package/templates/expo/app/index.tsx +22 -0
- package/templates/expo/app.json.template +32 -0
- package/templates/expo/assets/adaptive-icon.png +0 -0
- package/templates/expo/assets/favicon.png +0 -0
- package/templates/expo/assets/icon.png +0 -0
- package/templates/expo/assets/splash.png +0 -0
- package/templates/expo/babel.config.cjs +12 -0
- package/templates/expo/components/features/AuthForm.tsx.template +138 -0
- package/templates/expo/components/features/OAuthButtons.tsx.template +27 -0
- package/templates/expo/components/features/index.ts.template +4 -0
- package/templates/expo/components/ui/Button.tsx +58 -0
- package/templates/expo/components/ui/Card.tsx +11 -0
- package/templates/expo/components/ui/Divider.tsx +19 -0
- package/templates/expo/components/ui/Input.tsx +23 -0
- package/templates/expo/components/ui/WalletCard.tsx +44 -0
- package/templates/expo/components/ui/index.ts +5 -0
- package/templates/expo/eslint.config.cjs +15 -0
- package/templates/expo/global.css +3 -0
- package/templates/expo/hooks/useOneClickLogin.ts.template +161 -0
- package/templates/expo/hooks/useViemClient.ts +118 -0
- package/templates/expo/hooks/useWallets.ts +52 -0
- package/templates/expo/index.js +2 -0
- package/templates/expo/lib/auth.ts +54 -0
- package/templates/expo/lib/constants.ts.template +2 -0
- package/templates/expo/lib/para.ts +14 -0
- package/templates/expo/metro.config.cjs +14 -0
- package/templates/expo/nativewind-env.d.ts +2 -0
- package/templates/expo/prettier.config.cjs +10 -0
- package/templates/expo/providers/ParaProvider.tsx +140 -0
- package/templates/expo/tailwind.config.cjs +23 -0
- package/templates/expo/tsconfig.json +11 -0
- package/templates/expo/types/index.ts +28 -0
- package/templates/nextjs/README.md +69 -0
- package/templates/nextjs/_env.example +8 -0
- package/templates/nextjs/_gitignore +36 -0
- package/templates/nextjs/_yarnrc.yml +1 -0
- package/templates/nextjs/eslint.config.mjs +10 -0
- package/templates/nextjs/next.config.ts +5 -0
- package/templates/nextjs/postcss.config.mjs +7 -0
- package/templates/nextjs/public/para.svg +3 -0
- package/templates/nextjs/src/app/layout.tsx +30 -0
- package/templates/nextjs/src/app/page.tsx +40 -0
- package/templates/nextjs/src/components/ParaProvider.tsx +116 -0
- package/templates/nextjs/src/components/layout/Header.tsx +44 -0
- package/templates/nextjs/src/components/ui/ConnectCard.tsx +24 -0
- package/templates/nextjs/src/components/ui/SignMessage.tsx +53 -0
- package/templates/nextjs/src/components/ui/WalletInfo.tsx +22 -0
- package/templates/nextjs/src/hooks/useSignHelloWorld.ts +23 -0
- package/templates/nextjs/src/styles/globals.css +1 -0
- package/templates/nextjs/tsconfig.json +27 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { getStrategy } from "./strategies/index.js";
|
|
4
|
+
import { ensureDir, writeFile, readFile, readDir, copyFile } from "./utils/fs.js";
|
|
5
|
+
import { resolveParaVersion } from "./utils/resolve-para-version.js";
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = path.dirname(__filename);
|
|
8
|
+
const TEMPLATES_DIR = path.join(__dirname, "..", "..", "templates");
|
|
9
|
+
async function scaffold(config) {
|
|
10
|
+
const targetDir = path.join(process.cwd(), config.appName);
|
|
11
|
+
const templateDir = path.join(TEMPLATES_DIR, config.template);
|
|
12
|
+
const strategy = getStrategy(config.template);
|
|
13
|
+
await ensureDir(targetDir);
|
|
14
|
+
await processDirectory(templateDir, targetDir, config, strategy);
|
|
15
|
+
const packageJson = strategy.buildPackageJson(config);
|
|
16
|
+
const paraVersion = await resolveParaVersion();
|
|
17
|
+
pinParaDependencies(packageJson, paraVersion);
|
|
18
|
+
await writeFile(path.join(targetDir, "package.json"), JSON.stringify(packageJson, null, 2) + "\n");
|
|
19
|
+
}
|
|
20
|
+
async function processDirectory(sourceDir, targetDir, config, strategy) {
|
|
21
|
+
const entries = await readDir(sourceDir);
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
const sourcePath = path.join(sourceDir, entry.name);
|
|
24
|
+
let targetName = entry.name;
|
|
25
|
+
if (entry.name === "_yarnrc.yml" && config.packageManager !== "yarn") {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const dotfileTransforms = {
|
|
29
|
+
"_gitignore": ".gitignore",
|
|
30
|
+
"_env.example": ".env.example",
|
|
31
|
+
"_npmrc": ".npmrc",
|
|
32
|
+
"_eslintrc.json": ".eslintrc.json",
|
|
33
|
+
"_prettierrc": ".prettierrc",
|
|
34
|
+
"_yarnrc.yml": ".yarnrc.yml"
|
|
35
|
+
};
|
|
36
|
+
if (dotfileTransforms[targetName]) {
|
|
37
|
+
targetName = dotfileTransforms[targetName];
|
|
38
|
+
}
|
|
39
|
+
if (targetName.endsWith(".template")) {
|
|
40
|
+
targetName = targetName.replace(".template", "");
|
|
41
|
+
}
|
|
42
|
+
const targetPath = path.join(targetDir, targetName);
|
|
43
|
+
if (entry.isDirectory) {
|
|
44
|
+
await ensureDir(targetPath);
|
|
45
|
+
await processDirectory(sourcePath, targetPath, config, strategy);
|
|
46
|
+
} else {
|
|
47
|
+
await processFile(sourcePath, targetPath, config, strategy);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function processFile(sourcePath, targetPath, config, strategy) {
|
|
52
|
+
const basename = path.basename(sourcePath);
|
|
53
|
+
if (!strategy.shouldProcessFile(sourcePath)) {
|
|
54
|
+
await copyFile(sourcePath, targetPath);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const content = await readFile(sourcePath);
|
|
58
|
+
const isTemplate = basename.endsWith(".template") || sourcePath.endsWith(".tsx") || sourcePath.endsWith(".ts") || sourcePath.endsWith(".json") || sourcePath.endsWith(".css") || sourcePath.endsWith(".md") || sourcePath.endsWith(".js") || sourcePath.endsWith(".mjs") || basename === "_env.example";
|
|
59
|
+
if (isTemplate) {
|
|
60
|
+
const processed = strategy.processFileContent(content, config);
|
|
61
|
+
await writeFile(targetPath, processed);
|
|
62
|
+
} else {
|
|
63
|
+
await writeFile(targetPath, content);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function pinParaDependencies(pkg, version) {
|
|
67
|
+
for (const deps of [pkg.dependencies, pkg.devDependencies]) {
|
|
68
|
+
if (!deps) continue;
|
|
69
|
+
for (const key of Object.keys(deps)) {
|
|
70
|
+
if (key.startsWith("@getpara/")) {
|
|
71
|
+
deps[key] = version;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
scaffold
|
|
78
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ITemplateStrategy, TemplateMetadata, ScaffoldConfig, PackageJson, PostScaffoldCommand, BaseScaffoldConfig } from '../types.js';
|
|
2
|
+
export declare class ExpoTemplate implements ITemplateStrategy {
|
|
3
|
+
getMetadata(): TemplateMetadata;
|
|
4
|
+
collectPrompts(_baseConfig: Partial<BaseScaffoldConfig>): Promise<Record<string, never>>;
|
|
5
|
+
validateConfig(config: ScaffoldConfig): string | undefined;
|
|
6
|
+
buildPackageJson(config: ScaffoldConfig): PackageJson;
|
|
7
|
+
shouldProcessFile(filePath: string): boolean;
|
|
8
|
+
processFileContent(content: string, config: ScaffoldConfig): string;
|
|
9
|
+
getPostScaffoldCommands(config: ScaffoldConfig): PostScaffoldCommand[];
|
|
10
|
+
validateBundleId(value: string): string | undefined;
|
|
11
|
+
private formatAppName;
|
|
12
|
+
private generateSlug;
|
|
13
|
+
private generateScheme;
|
|
14
|
+
private sortObject;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=expo-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expo-template.d.ts","sourceRoot":"","sources":["../../../src/scaffolding/strategies/expo-template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EAEd,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAgErB,qBAAa,YAAa,YAAW,iBAAiB;IACpD,WAAW,IAAI,gBAAgB;IAWzB,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAI9F,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAY1D,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW;IA2BrD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAM5C,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM;IAenE,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,mBAAmB,EAAE;IAWtE,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAcnD,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,UAAU;CAWnB"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { renderTemplate } from "../template-renderer.js";
|
|
2
|
+
const DEPENDENCIES = {
|
|
3
|
+
// Core Expo
|
|
4
|
+
"expo": "^54.0.0",
|
|
5
|
+
"expo-router": "~6.0.10",
|
|
6
|
+
"expo-status-bar": "~3.0.8",
|
|
7
|
+
"expo-system-ui": "~6.0.7",
|
|
8
|
+
"expo-constants": "~18.0.9",
|
|
9
|
+
"expo-linking": "~8.0.8",
|
|
10
|
+
"expo-web-browser": "~15.0.7",
|
|
11
|
+
"expo-clipboard": "~8.0.1",
|
|
12
|
+
// React
|
|
13
|
+
"react": "19.1.0",
|
|
14
|
+
"react-native": "0.81.5",
|
|
15
|
+
"react-dom": "19.1.0",
|
|
16
|
+
"react-native-web": "^0.21.0",
|
|
17
|
+
// Navigation
|
|
18
|
+
"@react-navigation/native": "^7.1.6",
|
|
19
|
+
"react-native-safe-area-context": "~5.6.0",
|
|
20
|
+
"react-native-screens": "~4.16.0",
|
|
21
|
+
"react-native-gesture-handler": "~2.28.0",
|
|
22
|
+
"react-native-reanimated": "~4.1.1",
|
|
23
|
+
// Para SDK
|
|
24
|
+
"@getpara/react-native-wallet": "2.8.0",
|
|
25
|
+
"@getpara/viem-v2-integration": "2.8.0",
|
|
26
|
+
// Viem (for EVM transactions)
|
|
27
|
+
"viem": "^2.41.2",
|
|
28
|
+
// Styling
|
|
29
|
+
"nativewind": "4.2.1",
|
|
30
|
+
"@expo/vector-icons": "^15.0.2",
|
|
31
|
+
// Crypto polyfills (required for React Native)
|
|
32
|
+
"@craftzdog/react-native-buffer": "^6.1.0",
|
|
33
|
+
"@peculiar/webcrypto": "^1.5.0",
|
|
34
|
+
"@react-native-async-storage/async-storage": "^2.2.0",
|
|
35
|
+
"react-native-keychain": "^10.0.0",
|
|
36
|
+
"react-native-quick-crypto": "^0.7.14",
|
|
37
|
+
"react-native-quick-base64": "^2.2.0",
|
|
38
|
+
"react-native-modpow": "^1.1.0",
|
|
39
|
+
"react-native-passkey": "^3.3.2",
|
|
40
|
+
"react-native-worklets": "0.5.1",
|
|
41
|
+
"elliptic": "^6.6.1",
|
|
42
|
+
"readable-stream": "^4.5.2"
|
|
43
|
+
};
|
|
44
|
+
const DEV_DEPENDENCIES = {
|
|
45
|
+
"@babel/core": "^7.20.0",
|
|
46
|
+
"@types/react": "~19.1.10",
|
|
47
|
+
"eslint": "^9.25.1",
|
|
48
|
+
"eslint-config-expo": "~10.0.0",
|
|
49
|
+
"eslint-config-prettier": "^10.1.2",
|
|
50
|
+
"prettier": "^3.2.5",
|
|
51
|
+
"prettier-plugin-tailwindcss": "^0.5.11",
|
|
52
|
+
"tailwindcss": "^3.4.0",
|
|
53
|
+
"typescript": "~5.9.2"
|
|
54
|
+
};
|
|
55
|
+
class ExpoTemplate {
|
|
56
|
+
getMetadata() {
|
|
57
|
+
return {
|
|
58
|
+
id: "expo",
|
|
59
|
+
name: "Expo",
|
|
60
|
+
description: "React Native with Expo Router",
|
|
61
|
+
hint: "iOS & Android"
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// Decoupled from @clack/prompts: prompting is handled in commands/create.ts.
|
|
65
|
+
// This returns an empty object; bundleId is collected externally and merged into config.
|
|
66
|
+
async collectPrompts(_baseConfig) {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
validateConfig(config) {
|
|
70
|
+
if (config.template !== "expo") {
|
|
71
|
+
return "Not an Expo config";
|
|
72
|
+
}
|
|
73
|
+
const expoConfig = config;
|
|
74
|
+
const bundleIdError = this.validateBundleId(expoConfig.bundleId);
|
|
75
|
+
if (bundleIdError) {
|
|
76
|
+
return bundleIdError;
|
|
77
|
+
}
|
|
78
|
+
return void 0;
|
|
79
|
+
}
|
|
80
|
+
buildPackageJson(config) {
|
|
81
|
+
const pkg = {
|
|
82
|
+
name: config.appName,
|
|
83
|
+
version: "1.0.0",
|
|
84
|
+
private: true,
|
|
85
|
+
main: "index.js",
|
|
86
|
+
scripts: {
|
|
87
|
+
start: "expo start",
|
|
88
|
+
android: "expo run:android",
|
|
89
|
+
ios: "expo run:ios",
|
|
90
|
+
web: "expo start --web",
|
|
91
|
+
prebuild: "expo prebuild",
|
|
92
|
+
lint: "eslint . --ignore-pattern node_modules",
|
|
93
|
+
typecheck: "tsc --noEmit"
|
|
94
|
+
},
|
|
95
|
+
dependencies: this.sortObject(DEPENDENCIES),
|
|
96
|
+
devDependencies: this.sortObject(DEV_DEPENDENCIES)
|
|
97
|
+
};
|
|
98
|
+
if (config.packageManager === "yarn") {
|
|
99
|
+
pkg.packageManager = "yarn@4.12.0";
|
|
100
|
+
}
|
|
101
|
+
return pkg;
|
|
102
|
+
}
|
|
103
|
+
shouldProcessFile(filePath) {
|
|
104
|
+
const binaryExtensions = [".png", ".jpg", ".jpeg", ".gif", ".ico", ".svg"];
|
|
105
|
+
const ext = filePath.substring(filePath.lastIndexOf("."));
|
|
106
|
+
return !binaryExtensions.includes(ext);
|
|
107
|
+
}
|
|
108
|
+
processFileContent(content, config) {
|
|
109
|
+
const expoConfig = config;
|
|
110
|
+
let result = renderTemplate(content, config);
|
|
111
|
+
result = result.replace(/\{\{bundleId\}\}/g, expoConfig.bundleId);
|
|
112
|
+
result = result.replace(/\{\{expoAppName\}\}/g, this.formatAppName(expoConfig.appName));
|
|
113
|
+
result = result.replace(/\{\{expoSlug\}\}/g, this.generateSlug(expoConfig.appName));
|
|
114
|
+
result = result.replace(/\{\{expoScheme\}\}/g, this.generateScheme(expoConfig.appName));
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
getPostScaffoldCommands(config) {
|
|
118
|
+
return [
|
|
119
|
+
{
|
|
120
|
+
name: "install",
|
|
121
|
+
command: config.packageManager,
|
|
122
|
+
args: ["install"],
|
|
123
|
+
description: "Installing dependencies"
|
|
124
|
+
}
|
|
125
|
+
];
|
|
126
|
+
}
|
|
127
|
+
validateBundleId(value) {
|
|
128
|
+
if (!value) {
|
|
129
|
+
return "Bundle ID is required";
|
|
130
|
+
}
|
|
131
|
+
if (!/^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/.test(value)) {
|
|
132
|
+
return "Invalid format. Use lowercase reverse domain notation (e.g., com.company.app)";
|
|
133
|
+
}
|
|
134
|
+
if (value.split(".").length < 2) {
|
|
135
|
+
return "Bundle ID must have at least 2 segments (e.g., com.myapp)";
|
|
136
|
+
}
|
|
137
|
+
return void 0;
|
|
138
|
+
}
|
|
139
|
+
formatAppName(appName) {
|
|
140
|
+
return appName.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
141
|
+
}
|
|
142
|
+
generateSlug(appName) {
|
|
143
|
+
return appName.toLowerCase().replace(/[^a-z0-9-]/g, "-");
|
|
144
|
+
}
|
|
145
|
+
generateScheme(appName) {
|
|
146
|
+
return appName.toLowerCase().replace(/[^a-z0-9-]/g, "-");
|
|
147
|
+
}
|
|
148
|
+
sortObject(obj) {
|
|
149
|
+
return Object.keys(obj).sort().reduce(
|
|
150
|
+
(acc, key) => {
|
|
151
|
+
acc[key] = obj[key];
|
|
152
|
+
return acc;
|
|
153
|
+
},
|
|
154
|
+
{}
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
ExpoTemplate
|
|
160
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ITemplateStrategy, TemplateType, TemplateMetadata } from '../types.js';
|
|
2
|
+
export declare function getStrategy(templateId: TemplateType): ITemplateStrategy;
|
|
3
|
+
export declare function getAvailableTemplates(): TemplateMetadata[];
|
|
4
|
+
export declare function hasTemplate(templateId: string): templateId is TemplateType;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scaffolding/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AASrF,wBAAgB,WAAW,CAAC,UAAU,EAAE,YAAY,GAAG,iBAAiB,CAOvE;AAED,wBAAgB,qBAAqB,IAAI,gBAAgB,EAAE,CAE1D;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,IAAI,YAAY,CAE1E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { NextjsTemplate } from "./nextjs-template.js";
|
|
2
|
+
import { ExpoTemplate } from "./expo-template.js";
|
|
3
|
+
const strategies = {
|
|
4
|
+
nextjs: new NextjsTemplate(),
|
|
5
|
+
expo: new ExpoTemplate()
|
|
6
|
+
};
|
|
7
|
+
function getStrategy(templateId) {
|
|
8
|
+
const strategy = strategies[templateId];
|
|
9
|
+
if (!strategy) {
|
|
10
|
+
const available = Object.keys(strategies).join(", ");
|
|
11
|
+
throw new Error(`Unknown template: "${templateId}". Available templates: ${available}`);
|
|
12
|
+
}
|
|
13
|
+
return strategy;
|
|
14
|
+
}
|
|
15
|
+
function getAvailableTemplates() {
|
|
16
|
+
return Object.values(strategies).map((s) => s.getMetadata());
|
|
17
|
+
}
|
|
18
|
+
function hasTemplate(templateId) {
|
|
19
|
+
return templateId in strategies;
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
getAvailableTemplates,
|
|
23
|
+
getStrategy,
|
|
24
|
+
hasTemplate
|
|
25
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ITemplateStrategy, TemplateMetadata, ScaffoldConfig, PackageJson, PostScaffoldCommand, BaseScaffoldConfig } from '../types.js';
|
|
2
|
+
export declare class NextjsTemplate implements ITemplateStrategy {
|
|
3
|
+
getMetadata(): TemplateMetadata;
|
|
4
|
+
collectPrompts(_baseConfig: Partial<BaseScaffoldConfig>): Promise<Record<string, never>>;
|
|
5
|
+
validateConfig(config: ScaffoldConfig): string | undefined;
|
|
6
|
+
buildPackageJson(config: ScaffoldConfig): PackageJson;
|
|
7
|
+
shouldProcessFile(filePath: string): boolean;
|
|
8
|
+
processFileContent(content: string, config: ScaffoldConfig): string;
|
|
9
|
+
getPostScaffoldCommands(config: ScaffoldConfig): PostScaffoldCommand[];
|
|
10
|
+
private sortObject;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=nextjs-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-template.d.ts","sourceRoot":"","sources":["../../../src/scaffolding/strategies/nextjs-template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AA0DrB,qBAAa,cAAe,YAAW,iBAAiB;IACtD,WAAW,IAAI,gBAAgB;IASzB,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAK9F,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAO1D,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW;IAyBrD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAM5C,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM;IAInE,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,mBAAmB,EAAE;IAWtE,OAAO,CAAC,UAAU;CAWnB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { renderTemplate } from "../template-renderer.js";
|
|
2
|
+
const DEPENDENCIES = {
|
|
3
|
+
// EVM + wagmi peer deps
|
|
4
|
+
"@base-org/account": "^2.5.0",
|
|
5
|
+
"@gemini-wallet/core": "^0.3.2",
|
|
6
|
+
"@metamask/sdk": "^0.34.0",
|
|
7
|
+
"@safe-global/safe-apps-provider": "^0.18.6",
|
|
8
|
+
"@safe-global/safe-apps-sdk": "^9.1.0",
|
|
9
|
+
"porto": "^0.2.37",
|
|
10
|
+
"viem": "2.42.1",
|
|
11
|
+
"wagmi": "3.1.0",
|
|
12
|
+
// Cosmos
|
|
13
|
+
"@cosmjs/amino": "0.37.0",
|
|
14
|
+
"@cosmjs/cosmwasm-stargate": "0.37.0",
|
|
15
|
+
"@cosmjs/encoding": "0.37.0",
|
|
16
|
+
"@cosmjs/launchpad": "0.27.1",
|
|
17
|
+
"@cosmjs/proto-signing": "0.37.0",
|
|
18
|
+
"@cosmjs/stargate": "0.37.0",
|
|
19
|
+
"@cosmjs/tendermint-rpc": "0.37.0",
|
|
20
|
+
"graz": "0.4.2",
|
|
21
|
+
// Solana
|
|
22
|
+
"@solana-mobile/wallet-adapter-mobile": "2.2.5",
|
|
23
|
+
"@solana/wallet-adapter-base": "0.9.27",
|
|
24
|
+
"@solana/wallet-adapter-react": "0.15.39",
|
|
25
|
+
"@solana/wallet-adapter-walletconnect": "0.1.21",
|
|
26
|
+
"@solana/web3.js": "1.98.4",
|
|
27
|
+
// Farcaster (peer deps of Para SDK)
|
|
28
|
+
"@farcaster/mini-app-solana": "1.1.1",
|
|
29
|
+
"@farcaster/miniapp-sdk": "0.2.1",
|
|
30
|
+
"@farcaster/miniapp-wagmi-connector": "1.1.0",
|
|
31
|
+
// Core
|
|
32
|
+
"@getpara/react-sdk": "2.8.0",
|
|
33
|
+
"@tanstack/react-query": "5.90.12",
|
|
34
|
+
"arg": "^5.0.2",
|
|
35
|
+
"next": "15.1.5",
|
|
36
|
+
"react": "^19.0.0",
|
|
37
|
+
"react-dom": "^19.0.0",
|
|
38
|
+
"starknet": "^9.2.1"
|
|
39
|
+
};
|
|
40
|
+
const DEV_DEPENDENCIES = {
|
|
41
|
+
"@eslint/js": "^9.29.0",
|
|
42
|
+
"@tailwindcss/postcss": "^4.1.10",
|
|
43
|
+
"@types/node": "^20",
|
|
44
|
+
"@types/react": "^19",
|
|
45
|
+
"@types/react-dom": "^19",
|
|
46
|
+
"eslint": "^9.29.0",
|
|
47
|
+
"pino-pretty": "13.0.0",
|
|
48
|
+
"postcss": "^8",
|
|
49
|
+
"tailwindcss": "^4.1.10",
|
|
50
|
+
"typescript": "^5",
|
|
51
|
+
"typescript-eslint": "^8.22.0"
|
|
52
|
+
};
|
|
53
|
+
class NextjsTemplate {
|
|
54
|
+
getMetadata() {
|
|
55
|
+
return {
|
|
56
|
+
id: "nextjs",
|
|
57
|
+
name: "Next.js",
|
|
58
|
+
description: "React framework with App Router",
|
|
59
|
+
hint: "recommended for web"
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async collectPrompts(_baseConfig) {
|
|
63
|
+
return {};
|
|
64
|
+
}
|
|
65
|
+
validateConfig(config) {
|
|
66
|
+
if (config.template !== "nextjs") {
|
|
67
|
+
return "Not a Next.js config";
|
|
68
|
+
}
|
|
69
|
+
return void 0;
|
|
70
|
+
}
|
|
71
|
+
buildPackageJson(config) {
|
|
72
|
+
const scripts = {
|
|
73
|
+
dev: "next dev",
|
|
74
|
+
build: "next build",
|
|
75
|
+
start: "next start",
|
|
76
|
+
lint: "eslint .",
|
|
77
|
+
typecheck: "tsc --noEmit"
|
|
78
|
+
};
|
|
79
|
+
if (config.networks.includes("cosmos")) {
|
|
80
|
+
scripts.postinstall = "npx graz --generate";
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
name: config.appName,
|
|
84
|
+
version: "0.1.0",
|
|
85
|
+
private: true,
|
|
86
|
+
type: "module",
|
|
87
|
+
scripts,
|
|
88
|
+
dependencies: this.sortObject(DEPENDENCIES),
|
|
89
|
+
devDependencies: this.sortObject(DEV_DEPENDENCIES)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
shouldProcessFile(filePath) {
|
|
93
|
+
const binaryExtensions = [".svg", ".png", ".jpg", ".jpeg", ".gif", ".ico", ".woff", ".woff2", ".ttf", ".eot"];
|
|
94
|
+
const ext = filePath.substring(filePath.lastIndexOf("."));
|
|
95
|
+
return !binaryExtensions.includes(ext);
|
|
96
|
+
}
|
|
97
|
+
processFileContent(content, config) {
|
|
98
|
+
return renderTemplate(content, config);
|
|
99
|
+
}
|
|
100
|
+
getPostScaffoldCommands(config) {
|
|
101
|
+
return [
|
|
102
|
+
{
|
|
103
|
+
name: "install",
|
|
104
|
+
command: config.packageManager,
|
|
105
|
+
args: ["install"],
|
|
106
|
+
description: "Installing dependencies"
|
|
107
|
+
}
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
sortObject(obj) {
|
|
111
|
+
return Object.keys(obj).sort().reduce(
|
|
112
|
+
(acc, key) => {
|
|
113
|
+
acc[key] = obj[key];
|
|
114
|
+
return acc;
|
|
115
|
+
},
|
|
116
|
+
{}
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export {
|
|
121
|
+
NextjsTemplate
|
|
122
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ScaffoldConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Renders a template string by processing conditionals and replacing placeholders.
|
|
4
|
+
*
|
|
5
|
+
* Supports:
|
|
6
|
+
* - Conditional blocks: // @if:evm ... // @endif
|
|
7
|
+
* - Placeholder replacement: {{appName}}, {{oauthMethods}}, etc.
|
|
8
|
+
* - Array injection: // @inject:wallets
|
|
9
|
+
*/
|
|
10
|
+
export declare function renderTemplate(content: string, config: ScaffoldConfig): string;
|
|
11
|
+
//# sourceMappingURL=template-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-renderer.d.ts","sourceRoot":"","sources":["../../src/scaffolding/template-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAgB9E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
function renderTemplate(content, config) {
|
|
2
|
+
let result = content;
|
|
3
|
+
result = processConditionals(result, config);
|
|
4
|
+
result = replacePlaceholders(result, config);
|
|
5
|
+
result = injectSnippets(result, config);
|
|
6
|
+
result = cleanupEmptyLines(result);
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
function processConditionals(content, config) {
|
|
10
|
+
let result = content;
|
|
11
|
+
let previousResult = "";
|
|
12
|
+
while (result !== previousResult) {
|
|
13
|
+
previousResult = result;
|
|
14
|
+
const ifPattern = /\/\/\s*@if:([^\n]+?)\s*\n((?:(?!\/\/\s*@if:)[\s\S])*?)\/\/\s*@endif/g;
|
|
15
|
+
result = result.replace(ifPattern, (_match, condition, block) => {
|
|
16
|
+
const shouldInclude = evaluateCondition(condition, config);
|
|
17
|
+
return shouldInclude ? block : "";
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
function evaluateCondition(condition, config) {
|
|
23
|
+
if (condition.includes("&&")) {
|
|
24
|
+
const parts = condition.split("&&").map((p) => p.trim());
|
|
25
|
+
return parts.every((part) => evaluateSingleCondition(part, config));
|
|
26
|
+
}
|
|
27
|
+
if (condition.includes("||")) {
|
|
28
|
+
const parts = condition.split("||").map((p) => p.trim());
|
|
29
|
+
return parts.some((part) => evaluateSingleCondition(part, config));
|
|
30
|
+
}
|
|
31
|
+
return evaluateSingleCondition(condition, config);
|
|
32
|
+
}
|
|
33
|
+
function evaluateSingleCondition(condition, config) {
|
|
34
|
+
if (condition.startsWith("!")) {
|
|
35
|
+
return !evaluateSingleCondition(condition.slice(1), config);
|
|
36
|
+
}
|
|
37
|
+
switch (condition) {
|
|
38
|
+
case "evm":
|
|
39
|
+
case "hasEvm":
|
|
40
|
+
return config.networks.includes("evm");
|
|
41
|
+
case "solana":
|
|
42
|
+
case "hasSolana":
|
|
43
|
+
return config.networks.includes("solana");
|
|
44
|
+
case "cosmos":
|
|
45
|
+
case "hasCosmos":
|
|
46
|
+
return config.networks.includes("cosmos");
|
|
47
|
+
case "hasExternalWallets":
|
|
48
|
+
return config.externalWallets.length > 0;
|
|
49
|
+
case "hasOAuth":
|
|
50
|
+
return config.authMethods.oauth && config.authMethods.oauthProviders.length > 0;
|
|
51
|
+
case "hasEmail":
|
|
52
|
+
return config.authMethods.email;
|
|
53
|
+
case "hasPhone":
|
|
54
|
+
return config.authMethods.phone;
|
|
55
|
+
default:
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function replacePlaceholders(content, config) {
|
|
60
|
+
const replacements = {
|
|
61
|
+
"{{appName}}": config.appName,
|
|
62
|
+
"{{disableEmail}}": String(!config.authMethods.email),
|
|
63
|
+
"{{disablePhone}}": String(!config.authMethods.phone),
|
|
64
|
+
"{{oauthMethods}}": config.authMethods.oauthProviders.map((p) => `"${p}"`).join(", ")
|
|
65
|
+
};
|
|
66
|
+
let result = content;
|
|
67
|
+
for (const [placeholder, value] of Object.entries(replacements)) {
|
|
68
|
+
result = result.replace(new RegExp(escapeRegExp(placeholder), "g"), value);
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
function injectSnippets(content, config) {
|
|
73
|
+
const injectPattern = /\/\/\s*@inject:(\w+)/g;
|
|
74
|
+
return content.replace(injectPattern, (_match, snippet) => {
|
|
75
|
+
switch (snippet) {
|
|
76
|
+
case "wallets":
|
|
77
|
+
if (config.externalWallets.length === 0) {
|
|
78
|
+
return "";
|
|
79
|
+
}
|
|
80
|
+
return config.externalWallets.map((w) => `"${w}"`).join(",\n ");
|
|
81
|
+
case "oauthMethods":
|
|
82
|
+
if (config.authMethods.oauthProviders.length === 0) {
|
|
83
|
+
return "[]";
|
|
84
|
+
}
|
|
85
|
+
return `[${config.authMethods.oauthProviders.map((p) => `"${p}"`).join(", ")}]`;
|
|
86
|
+
default:
|
|
87
|
+
return _match;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function cleanupEmptyLines(content) {
|
|
92
|
+
return content.replace(/\n{3,}/g, "\n\n");
|
|
93
|
+
}
|
|
94
|
+
function escapeRegExp(string) {
|
|
95
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
renderTemplate
|
|
99
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';
|
|
2
|
+
export type NetworkType = 'evm' | 'solana' | 'cosmos';
|
|
3
|
+
export type AuthMethod = 'email' | 'phone' | 'oauth';
|
|
4
|
+
export type OAuthProvider = 'GOOGLE' | 'APPLE' | 'TWITTER' | 'DISCORD' | 'FACEBOOK' | 'FARCASTER';
|
|
5
|
+
export type ExternalWallet = 'METAMASK' | 'COINBASE' | 'WALLETCONNECT' | 'RAINBOW' | 'ZERION' | 'RABBY' | 'PHANTOM' | 'BACKPACK' | 'SOLFLARE' | 'GLOW' | 'KEPLR' | 'LEAP';
|
|
6
|
+
export type TemplateType = 'nextjs' | 'expo';
|
|
7
|
+
export interface BaseScaffoldConfig {
|
|
8
|
+
appName: string;
|
|
9
|
+
template: TemplateType;
|
|
10
|
+
networks: NetworkType[];
|
|
11
|
+
authMethods: {
|
|
12
|
+
email: boolean;
|
|
13
|
+
phone: boolean;
|
|
14
|
+
oauth: boolean;
|
|
15
|
+
oauthProviders: OAuthProvider[];
|
|
16
|
+
};
|
|
17
|
+
externalWallets: ExternalWallet[];
|
|
18
|
+
packageManager: PackageManager;
|
|
19
|
+
}
|
|
20
|
+
export interface NextjsConfig extends BaseScaffoldConfig {
|
|
21
|
+
template: 'nextjs';
|
|
22
|
+
}
|
|
23
|
+
export interface ExpoConfig extends BaseScaffoldConfig {
|
|
24
|
+
template: 'expo';
|
|
25
|
+
bundleId: string;
|
|
26
|
+
}
|
|
27
|
+
export type ScaffoldConfig = NextjsConfig | ExpoConfig;
|
|
28
|
+
export interface TemplateMetadata {
|
|
29
|
+
id: TemplateType;
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
hint?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface PackageJson {
|
|
35
|
+
name: string;
|
|
36
|
+
version: string;
|
|
37
|
+
private: boolean;
|
|
38
|
+
type?: string;
|
|
39
|
+
main?: string;
|
|
40
|
+
scripts: Record<string, string>;
|
|
41
|
+
dependencies: Record<string, string>;
|
|
42
|
+
devDependencies: Record<string, string>;
|
|
43
|
+
packageManager?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface PostScaffoldCommand {
|
|
46
|
+
name: string;
|
|
47
|
+
command: string;
|
|
48
|
+
args: string[];
|
|
49
|
+
description: string;
|
|
50
|
+
optional?: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface ITemplateStrategy {
|
|
53
|
+
getMetadata(): TemplateMetadata;
|
|
54
|
+
collectPrompts(baseConfig: Partial<BaseScaffoldConfig>): Promise<Record<string, unknown>>;
|
|
55
|
+
validateConfig(config: ScaffoldConfig): string | undefined;
|
|
56
|
+
buildPackageJson(config: ScaffoldConfig): PackageJson;
|
|
57
|
+
shouldProcessFile(filePath: string): boolean;
|
|
58
|
+
processFileContent(content: string, config: ScaffoldConfig): string;
|
|
59
|
+
getPostScaffoldCommands(config: ScaffoldConfig): PostScaffoldCommand[];
|
|
60
|
+
}
|
|
61
|
+
export interface GeneratedFile {
|
|
62
|
+
path: string;
|
|
63
|
+
content: string;
|
|
64
|
+
}
|
|
65
|
+
export declare const EVM_WALLETS: ExternalWallet[];
|
|
66
|
+
export declare const SOLANA_WALLETS: ExternalWallet[];
|
|
67
|
+
export declare const COSMOS_WALLETS: ExternalWallet[];
|
|
68
|
+
export declare function getWalletsForNetwork(network: NetworkType): ExternalWallet[];
|
|
69
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scaffolding/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const EVM_WALLETS = ["METAMASK", "COINBASE", "WALLETCONNECT", "RAINBOW", "ZERION", "RABBY"];
|
|
2
|
+
const SOLANA_WALLETS = ["PHANTOM", "BACKPACK", "SOLFLARE", "GLOW"];
|
|
3
|
+
const COSMOS_WALLETS = ["KEPLR", "LEAP"];
|
|
4
|
+
function getWalletsForNetwork(network) {
|
|
5
|
+
switch (network) {
|
|
6
|
+
case "evm":
|
|
7
|
+
return EVM_WALLETS;
|
|
8
|
+
case "solana":
|
|
9
|
+
return SOLANA_WALLETS;
|
|
10
|
+
case "cosmos":
|
|
11
|
+
return COSMOS_WALLETS;
|
|
12
|
+
default:
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
COSMOS_WALLETS,
|
|
18
|
+
EVM_WALLETS,
|
|
19
|
+
SOLANA_WALLETS,
|
|
20
|
+
getWalletsForNetwork
|
|
21
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PackageManager } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validates and narrows a string to a PackageManager type.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isValidPackageManager(value: string): value is PackageManager;
|
|
6
|
+
/**
|
|
7
|
+
* Detects the user's package manager using the following priority:
|
|
8
|
+
* 1. Explicit override (from --package-manager flag)
|
|
9
|
+
* 2. npm_config_user_agent environment variable
|
|
10
|
+
* 3. Lockfile in the current working directory
|
|
11
|
+
* 4. Default: npm
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectPackageManager(explicit?: string): PackageManager;
|
|
14
|
+
/**
|
|
15
|
+
* Returns the install command for the given package manager.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getInstallCommand(pm: PackageManager): [command: string, args: string[]];
|
|
18
|
+
/**
|
|
19
|
+
* Returns the run command for a script (e.g., "dev", "start", "ios").
|
|
20
|
+
* npm requires `run` for custom scripts; yarn, pnpm, and bun do not.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getRunCommand(pm: PackageManager, script: string): string;
|
|
23
|
+
//# sourceMappingURL=detect-package-manager.d.ts.map
|