create-0g-app 1.0.0 → 1.0.2
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.js +36 -39
- package/dist/index.js.map +1 -1
- package/dist/scaffold.d.ts +8 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +229 -0
- package/dist/scaffold.js.map +1 -0
- package/package.json +9 -2
- package/templates/{storage → base}/_gitignore +0 -9
- package/templates/base/packages/web/app/layout.tsx +42 -0
- package/templates/{storage → base}/packages/web/components/Navbar.module.css +2 -34
- package/templates/{storage → base}/packages/web/components/Navbar.tsx +3 -15
- package/templates/{storage → base}/packages/web/lib/wagmi.ts +2 -2
- package/templates/{storage → base}/packages/web/next.config.ts +1 -12
- package/templates/compute/packages/web/app/api/compute/route.ts +91 -0
- package/templates/compute/packages/web/components/ComputeSection.module.css +84 -0
- package/templates/compute/packages/web/components/ComputeSection.tsx +102 -0
- package/templates/compute/packages/web/lib/0g-compute.ts +38 -0
- package/templates/contracts/packages/contracts/contracts/MyContract.sol +21 -0
- package/templates/{storage → contracts}/packages/contracts/hardhat.config.ts +11 -21
- package/templates/contracts/packages/contracts/scripts/deploy.ts +33 -0
- package/templates/storage/packages/web/app/api/download/[rootHash]/route.ts +34 -0
- package/templates/storage/packages/web/app/api/upload/route.ts +51 -0
- package/templates/storage/packages/web/components/StorageSection.module.css +80 -0
- package/templates/storage/packages/web/components/StorageSection.tsx +92 -0
- package/templates/storage/packages/web/lib/0g-storage.ts +16 -37
- package/templates/storage/scripts/patch-0g-sdk.js +139 -0
- package/templates/storage/README.md +0 -106
- package/templates/storage/package-lock.json +0 -15358
- package/templates/storage/package.json +0 -15
- package/templates/storage/packages/contracts/contracts/FileRegistry.sol +0 -49
- package/templates/storage/packages/contracts/scripts/deploy.ts +0 -43
- package/templates/storage/packages/web/.env.example +0 -12
- package/templates/storage/packages/web/app/layout.tsx +0 -25
- package/templates/storage/packages/web/app/page.module.css +0 -74
- package/templates/storage/packages/web/app/page.tsx +0 -29
- package/templates/storage/packages/web/app/storage/page.module.css +0 -110
- package/templates/storage/packages/web/app/storage/page.tsx +0 -167
- package/templates/storage/packages/web/lib/abi.ts +0 -48
- package/templates/storage/packages/web/next-env.d.ts +0 -6
- package/templates/storage/packages/web/package.json +0 -26
- /package/templates/{storage → base}/packages/web/app/globals.css +0 -0
- /package/templates/{storage → base}/packages/web/app/providers.tsx +0 -0
- /package/templates/{storage → base}/packages/web/tsconfig.json +0 -0
- /package/templates/{storage → contracts}/packages/contracts/package.json +0 -0
package/dist/index.js
CHANGED
|
@@ -42,21 +42,17 @@ const picocolors_1 = __importDefault(require("picocolors"));
|
|
|
42
42
|
const path_1 = __importDefault(require("path"));
|
|
43
43
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
44
44
|
const child_process_1 = require("child_process");
|
|
45
|
-
const
|
|
46
|
-
storage: "File registry (storage SDK + on-chain provenance)",
|
|
47
|
-
compute: "Decentralized chat (inference SDK + on-chain logging) — coming soon",
|
|
48
|
-
agent: "Autonomous agent (storage + compute + task contract) — coming soon",
|
|
49
|
-
};
|
|
45
|
+
const scaffold_1 = require("./scaffold");
|
|
50
46
|
async function main() {
|
|
51
47
|
console.log();
|
|
52
48
|
console.log(picocolors_1.default.cyan([
|
|
53
49
|
" ╔═══════════════════════════════════╗",
|
|
54
|
-
" ║ " + picocolors_1.default.bold("create-0g-app") + " v1.
|
|
50
|
+
" ║ " + picocolors_1.default.bold("create-0g-app") + " v1.1.0 ║",
|
|
55
51
|
" ╚═══════════════════════════════════╝",
|
|
56
52
|
].join("\n")));
|
|
57
53
|
console.log();
|
|
58
54
|
p.intro(picocolors_1.default.bgCyan(picocolors_1.default.black(" 0G App Scaffolder ")));
|
|
59
|
-
// Project name
|
|
55
|
+
// Project name
|
|
60
56
|
let projectName = process.argv[2];
|
|
61
57
|
if (!projectName) {
|
|
62
58
|
const name = await p.text({
|
|
@@ -75,11 +71,19 @@ async function main() {
|
|
|
75
71
|
}
|
|
76
72
|
projectName = name;
|
|
77
73
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
74
|
+
// Feature selection
|
|
75
|
+
const contracts = await p.confirm({ message: "Include on-chain contracts? (Hardhat + 0G Galileo)", initialValue: false });
|
|
76
|
+
if (p.isCancel(contracts)) {
|
|
77
|
+
p.cancel("Cancelled.");
|
|
78
|
+
process.exit(0);
|
|
79
|
+
}
|
|
80
|
+
const storage = await p.confirm({ message: "Use 0G Storage?", initialValue: false });
|
|
81
|
+
if (p.isCancel(storage)) {
|
|
82
|
+
p.cancel("Cancelled.");
|
|
83
|
+
process.exit(0);
|
|
84
|
+
}
|
|
85
|
+
const compute = await p.confirm({ message: "Use 0G Compute? (AI inference)", initialValue: false });
|
|
86
|
+
if (p.isCancel(compute)) {
|
|
83
87
|
p.cancel("Cancelled.");
|
|
84
88
|
process.exit(0);
|
|
85
89
|
}
|
|
@@ -96,29 +100,10 @@ async function main() {
|
|
|
96
100
|
fs_extra_1.default.removeSync(targetDir);
|
|
97
101
|
}
|
|
98
102
|
const s = p.spinner();
|
|
99
|
-
// Copy template
|
|
100
103
|
s.start("Scaffolding project");
|
|
101
|
-
|
|
102
|
-
if (!fs_extra_1.default.existsSync(templateDir)) {
|
|
103
|
-
s.stop(picocolors_1.default.yellow(`The "${template}" template is coming soon! Only "storage" is available right now.`));
|
|
104
|
-
process.exit(0);
|
|
105
|
-
}
|
|
106
|
-
fs_extra_1.default.copySync(templateDir, targetDir, {
|
|
107
|
-
filter: (src) => !src.includes("node_modules") && !src.includes(".next"),
|
|
108
|
-
});
|
|
109
|
-
// Rename gitignore (npm strips .gitignore on publish)
|
|
110
|
-
const gitignoreSrc = path_1.default.join(targetDir, "_gitignore");
|
|
111
|
-
const gitignoreDest = path_1.default.join(targetDir, ".gitignore");
|
|
112
|
-
if (fs_extra_1.default.existsSync(gitignoreSrc))
|
|
113
|
-
fs_extra_1.default.moveSync(gitignoreSrc, gitignoreDest);
|
|
114
|
-
// Write .env from .env.example in web package
|
|
115
|
-
const envExample = path_1.default.join(targetDir, "packages", "web", ".env.example");
|
|
116
|
-
const envDest = path_1.default.join(targetDir, "packages", "web", ".env.local");
|
|
117
|
-
if (fs_extra_1.default.existsSync(envExample) && !fs_extra_1.default.existsSync(envDest)) {
|
|
118
|
-
fs_extra_1.default.copySync(envExample, envDest);
|
|
119
|
-
}
|
|
104
|
+
(0, scaffold_1.scaffold)({ projectName: projectName, contracts: !!contracts, storage: !!storage, compute: !!compute }, targetDir);
|
|
120
105
|
s.stop(`Scaffolded project in ${picocolors_1.default.green(`./${projectName}`)}`);
|
|
121
|
-
// Install
|
|
106
|
+
// Install
|
|
122
107
|
console.log(picocolors_1.default.dim("\n Installing dependencies... (this may take a minute, hang tight)\n"));
|
|
123
108
|
try {
|
|
124
109
|
(0, child_process_1.execSync)("npm install", { cwd: targetDir, stdio: "inherit" });
|
|
@@ -126,21 +111,33 @@ async function main() {
|
|
|
126
111
|
p.log.success("Dependencies installed");
|
|
127
112
|
}
|
|
128
113
|
catch {
|
|
129
|
-
p.log.warn("Dependency install failed — run `npm install` manually
|
|
114
|
+
p.log.warn("Dependency install failed — run `npm install` manually");
|
|
130
115
|
}
|
|
116
|
+
const selectedFeatures = [
|
|
117
|
+
contracts && "contracts",
|
|
118
|
+
storage && "storage",
|
|
119
|
+
compute && "compute",
|
|
120
|
+
].filter(Boolean);
|
|
121
|
+
const needsPrivateKey = !!(contracts || storage || compute);
|
|
131
122
|
p.outro([
|
|
132
123
|
picocolors_1.default.green("Your 0G app is ready!"),
|
|
124
|
+
selectedFeatures.length > 0
|
|
125
|
+
? ` ${picocolors_1.default.dim("Features:")} ${selectedFeatures.map((f) => picocolors_1.default.cyan(f)).join(", ")}`
|
|
126
|
+
: "",
|
|
133
127
|
"",
|
|
134
128
|
" " + picocolors_1.default.dim("Next steps:"),
|
|
135
129
|
"",
|
|
136
130
|
` ${picocolors_1.default.cyan(`cd ${projectName}`)}`,
|
|
137
|
-
` ${picocolors_1.default.
|
|
138
|
-
`
|
|
139
|
-
|
|
140
|
-
` ${picocolors_1.default.cyan("npm run
|
|
131
|
+
needsPrivateKey ? ` ${picocolors_1.default.yellow("⚠")} Add your ${picocolors_1.default.bold("PRIVATE_KEY")} to ${picocolors_1.default.cyan(`${projectName}/packages/web/.env.local`)}` : "",
|
|
132
|
+
needsPrivateKey ? ` ${picocolors_1.default.dim("Get testnet OG at https://faucet.0g.ai")}` : "",
|
|
133
|
+
"",
|
|
134
|
+
contracts ? ` ${picocolors_1.default.cyan("npm run deploy")} ${picocolors_1.default.dim("→ deploy contract to Galileo testnet")}` : "",
|
|
135
|
+
` ${picocolors_1.default.cyan("npm run dev")} ${picocolors_1.default.dim("→ start local dev server")}`,
|
|
141
136
|
"",
|
|
142
137
|
` ${picocolors_1.default.dim("Docs: https://docs.0g.ai")}`,
|
|
143
|
-
]
|
|
138
|
+
]
|
|
139
|
+
.filter((l) => l !== "")
|
|
140
|
+
.join("\n"));
|
|
144
141
|
}
|
|
145
142
|
main().catch((e) => {
|
|
146
143
|
console.error(e);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,kDAAoC;AACpC,4DAA4B;AAC5B,gDAAwB;AACxB,wDAA0B;AAC1B,iDAAyC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAID,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,QAoC7D"}
|
package/dist/scaffold.js
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.scaffold = scaffold;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const TEMPLATES_DIR = path_1.default.join(__dirname, "..", "templates");
|
|
10
|
+
function scaffold(features, targetDir) {
|
|
11
|
+
const { contracts, storage, compute } = features;
|
|
12
|
+
// 0. Ensure target directory exists
|
|
13
|
+
fs_extra_1.default.ensureDirSync(targetDir);
|
|
14
|
+
// 1. Always copy base
|
|
15
|
+
fs_extra_1.default.copySync(path_1.default.join(TEMPLATES_DIR, "base"), targetDir, { filter: noDeps });
|
|
16
|
+
// 2. Conditionally copy feature files (lib + components only — no package.json overlap)
|
|
17
|
+
if (contracts) {
|
|
18
|
+
fs_extra_1.default.copySync(path_1.default.join(TEMPLATES_DIR, "contracts"), targetDir, { filter: noDeps });
|
|
19
|
+
}
|
|
20
|
+
if (storage) {
|
|
21
|
+
fs_extra_1.default.copySync(path_1.default.join(TEMPLATES_DIR, "storage"), targetDir, { filter: noDeps });
|
|
22
|
+
}
|
|
23
|
+
if (compute) {
|
|
24
|
+
fs_extra_1.default.copySync(path_1.default.join(TEMPLATES_DIR, "compute"), targetDir, { filter: noDeps });
|
|
25
|
+
}
|
|
26
|
+
// 3. Generate dynamic files
|
|
27
|
+
writeRootPackageJson(targetDir, features);
|
|
28
|
+
writeWebPackageJson(targetDir, features);
|
|
29
|
+
writeEnvExample(targetDir, features);
|
|
30
|
+
writePageTsx(targetDir, features);
|
|
31
|
+
writePageCss(targetDir);
|
|
32
|
+
writeReadme(targetDir, features);
|
|
33
|
+
// 4. Rename _gitignore → .gitignore
|
|
34
|
+
const gi = path_1.default.join(targetDir, "_gitignore");
|
|
35
|
+
if (fs_extra_1.default.existsSync(gi))
|
|
36
|
+
fs_extra_1.default.moveSync(gi, path_1.default.join(targetDir, ".gitignore"));
|
|
37
|
+
// 5. Copy .env.example → .env.local
|
|
38
|
+
const envEx = path_1.default.join(targetDir, "packages", "web", ".env.example");
|
|
39
|
+
const envLocal = path_1.default.join(targetDir, "packages", "web", ".env.local");
|
|
40
|
+
if (fs_extra_1.default.existsSync(envEx) && !fs_extra_1.default.existsSync(envLocal))
|
|
41
|
+
fs_extra_1.default.copySync(envEx, envLocal);
|
|
42
|
+
}
|
|
43
|
+
function noDeps(src) {
|
|
44
|
+
return !src.includes("node_modules") && !src.includes(".next");
|
|
45
|
+
}
|
|
46
|
+
function writeRootPackageJson(targetDir, { projectName, contracts, storage }) {
|
|
47
|
+
const workspaces = ["packages/web"];
|
|
48
|
+
if (contracts)
|
|
49
|
+
workspaces.push("packages/contracts");
|
|
50
|
+
const scripts = {
|
|
51
|
+
dev: "npm run dev --workspace=packages/web",
|
|
52
|
+
build: "npm run build --workspace=packages/web",
|
|
53
|
+
};
|
|
54
|
+
if (storage) {
|
|
55
|
+
scripts.postinstall = "node scripts/patch-0g-sdk.js";
|
|
56
|
+
}
|
|
57
|
+
if (contracts) {
|
|
58
|
+
scripts.deploy = "npm run compile --workspace=packages/contracts && npm run deploy --workspace=packages/contracts";
|
|
59
|
+
scripts.verify = "npm run verify --workspace=packages/contracts";
|
|
60
|
+
}
|
|
61
|
+
fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "package.json"), JSON.stringify({ name: projectName, version: "0.1.0", private: true, workspaces, scripts }, null, 2));
|
|
62
|
+
}
|
|
63
|
+
function writeWebPackageJson(targetDir, { storage, compute }) {
|
|
64
|
+
const deps = {
|
|
65
|
+
"@tanstack/react-query": "^5.62.0",
|
|
66
|
+
next: "^15.0.0",
|
|
67
|
+
react: "^19.0.0",
|
|
68
|
+
"react-dom": "^19.0.0",
|
|
69
|
+
viem: "^2.21.0",
|
|
70
|
+
wagmi: "^2.13.0",
|
|
71
|
+
};
|
|
72
|
+
if (storage) {
|
|
73
|
+
deps["@0glabs/0g-ts-sdk"] = "^0.3.3";
|
|
74
|
+
deps["ethers"] = "^6.13.0";
|
|
75
|
+
}
|
|
76
|
+
if (compute) {
|
|
77
|
+
deps["@0glabs/0g-serving-broker"] = "0.6.2";
|
|
78
|
+
deps["openai"] = "^4.28.0";
|
|
79
|
+
if (!deps["ethers"])
|
|
80
|
+
deps["ethers"] = "^6.13.0";
|
|
81
|
+
}
|
|
82
|
+
const pkg = {
|
|
83
|
+
name: "web",
|
|
84
|
+
version: "0.1.0",
|
|
85
|
+
private: true,
|
|
86
|
+
scripts: { dev: "next dev", build: "next build", start: "next start", lint: "next lint" },
|
|
87
|
+
dependencies: deps,
|
|
88
|
+
devDependencies: {
|
|
89
|
+
"@types/node": "^22.0.0",
|
|
90
|
+
"@types/react": "^19.0.0",
|
|
91
|
+
"@types/react-dom": "^19.0.0",
|
|
92
|
+
typescript: "^5.7.0",
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "packages", "web", "package.json"), JSON.stringify(pkg, null, 2));
|
|
96
|
+
}
|
|
97
|
+
function writeEnvExample(targetDir, { contracts, storage, compute }) {
|
|
98
|
+
const lines = [
|
|
99
|
+
"# 0G Galileo Testnet",
|
|
100
|
+
"NEXT_PUBLIC_CHAIN_ID=16602",
|
|
101
|
+
"NEXT_PUBLIC_RPC_URL=https://evmrpc-testnet.0g.ai",
|
|
102
|
+
];
|
|
103
|
+
if (storage) {
|
|
104
|
+
lines.push("STORAGE_INDEXER_RPC=https://indexer-storage-testnet-turbo.0g.ai");
|
|
105
|
+
}
|
|
106
|
+
if (compute || contracts) {
|
|
107
|
+
lines.push("");
|
|
108
|
+
lines.push("# Private key — used server-side for compute inference payments and/or Hardhat deploy");
|
|
109
|
+
lines.push("# Never committed or exposed to the browser. Get testnet OG at https://faucet.0g.ai");
|
|
110
|
+
lines.push("PRIVATE_KEY=");
|
|
111
|
+
}
|
|
112
|
+
if (storage && !contracts) {
|
|
113
|
+
lines.push("");
|
|
114
|
+
lines.push("# Private key for signing storage transactions — never commit this");
|
|
115
|
+
lines.push("# Get testnet OG at https://faucet.0g.ai");
|
|
116
|
+
lines.push("PRIVATE_KEY=");
|
|
117
|
+
}
|
|
118
|
+
if (contracts) {
|
|
119
|
+
lines.push("");
|
|
120
|
+
lines.push("# Populated automatically after `npm run deploy`");
|
|
121
|
+
lines.push("NEXT_PUBLIC_CONTRACT_ADDRESS=");
|
|
122
|
+
}
|
|
123
|
+
fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "packages", "web", ".env.example"), lines.join("\n") + "\n");
|
|
124
|
+
}
|
|
125
|
+
function writePageTsx(targetDir, { storage, compute }) {
|
|
126
|
+
const hasFeatures = storage || compute;
|
|
127
|
+
const imports = [
|
|
128
|
+
...(storage ? [`import { StorageSection } from "@/components/StorageSection";`] : []),
|
|
129
|
+
...(compute ? [`import { ComputeSection } from "@/components/ComputeSection";`] : []),
|
|
130
|
+
];
|
|
131
|
+
const body = hasFeatures
|
|
132
|
+
? `
|
|
133
|
+
return (
|
|
134
|
+
<main className={styles.main}>
|
|
135
|
+
${storage ? "<StorageSection />" : ""}
|
|
136
|
+
${compute ? "<ComputeSection />" : ""}
|
|
137
|
+
</main>
|
|
138
|
+
);`
|
|
139
|
+
: `
|
|
140
|
+
return (
|
|
141
|
+
<main className={styles.landing}>
|
|
142
|
+
<div className={styles.card}>
|
|
143
|
+
<h1 className={styles.title}><span className={styles.accent}>create</span>-0g-app</h1>
|
|
144
|
+
<p className={styles.subtitle}>Your 0G app is ready. Start editing:</p>
|
|
145
|
+
<ul className={styles.steps}>
|
|
146
|
+
<li>
|
|
147
|
+
<span className={styles.label}>Frontend</span>
|
|
148
|
+
<code className={styles.path}>packages/web/app/page.tsx</code>
|
|
149
|
+
</li>
|
|
150
|
+
</ul>
|
|
151
|
+
<div className={styles.links}>
|
|
152
|
+
<a href="https://docs.0g.ai" target="_blank" rel="noopener noreferrer">Docs ↗</a>
|
|
153
|
+
<a href="https://faucet.0g.ai" target="_blank" rel="noopener noreferrer">Faucet ↗</a>
|
|
154
|
+
<a href="https://chainscan-galileo.0g.ai" target="_blank" rel="noopener noreferrer">Explorer ↗</a>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</main>
|
|
158
|
+
);`;
|
|
159
|
+
const content = `"use client";
|
|
160
|
+
import styles from "./page.module.css";
|
|
161
|
+
${imports.join("\n")}
|
|
162
|
+
|
|
163
|
+
export default function Home() {${body}
|
|
164
|
+
}
|
|
165
|
+
`;
|
|
166
|
+
fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "packages", "web", "app", "page.tsx"), content);
|
|
167
|
+
}
|
|
168
|
+
function writePageCss(targetDir) {
|
|
169
|
+
const css = `
|
|
170
|
+
.main {
|
|
171
|
+
max-width: 800px;
|
|
172
|
+
margin: 0 auto;
|
|
173
|
+
padding: 32px 24px 80px;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Landing (no features selected) */
|
|
177
|
+
.landing {
|
|
178
|
+
min-height: calc(100vh - 56px);
|
|
179
|
+
display: flex;
|
|
180
|
+
align-items: center;
|
|
181
|
+
justify-content: center;
|
|
182
|
+
padding: 24px;
|
|
183
|
+
}
|
|
184
|
+
.card { display: flex; flex-direction: column; gap: 28px; max-width: 480px; width: 100%; }
|
|
185
|
+
.title { font-size: 2.2rem; font-weight: 700; letter-spacing: -0.04em; }
|
|
186
|
+
.accent { color: var(--accent); }
|
|
187
|
+
.subtitle { color: var(--muted); font-size: 0.95rem; margin-top: -16px; }
|
|
188
|
+
.steps { list-style: none; display: flex; flex-direction: column; gap: 12px; }
|
|
189
|
+
.steps li {
|
|
190
|
+
display: flex; flex-direction: column; gap: 6px;
|
|
191
|
+
background: var(--surface); border: 1px solid var(--border);
|
|
192
|
+
border-radius: 10px; padding: 14px 16px;
|
|
193
|
+
}
|
|
194
|
+
.label { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--accent); }
|
|
195
|
+
.path { font-family: monospace; font-size: 0.9rem; }
|
|
196
|
+
.links { display: flex; gap: 20px; }
|
|
197
|
+
.links a { font-size: 0.85rem; color: var(--muted); text-decoration: none; transition: color 0.15s; }
|
|
198
|
+
.links a:hover { color: var(--accent); }
|
|
199
|
+
`.trimStart();
|
|
200
|
+
fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "packages", "web", "app", "page.module.css"), css);
|
|
201
|
+
}
|
|
202
|
+
function writeReadme(targetDir, { projectName, contracts, storage, compute }) {
|
|
203
|
+
const lines = [
|
|
204
|
+
`# ${projectName}`,
|
|
205
|
+
"",
|
|
206
|
+
"Built with [create-0g-app](https://www.npmjs.com/package/create-0g-app) on the [0G network](https://0g.ai).",
|
|
207
|
+
"",
|
|
208
|
+
"## Quick Start",
|
|
209
|
+
"",
|
|
210
|
+
"```bash",
|
|
211
|
+
"npm install",
|
|
212
|
+
"cp packages/web/.env.example packages/web/.env.local",
|
|
213
|
+
"# Edit .env.local with your config",
|
|
214
|
+
"npm run dev",
|
|
215
|
+
"```",
|
|
216
|
+
];
|
|
217
|
+
if (contracts) {
|
|
218
|
+
lines.push("", "## Deploy Contract", "", "```bash", "npm run deploy", "npm run verify", "```");
|
|
219
|
+
}
|
|
220
|
+
if (storage) {
|
|
221
|
+
lines.push("", "## Storage", "", "Files are uploaded to 0G decentralized storage via `@0glabs/0g-ts-sdk`.", "Edit `packages/web/components/StorageSection.tsx` to customize.");
|
|
222
|
+
}
|
|
223
|
+
if (compute) {
|
|
224
|
+
lines.push("", "## Compute", "", "AI inference is routed through the 0G compute network via `@0glabs/0g-serving-broker`.", "Edit `packages/web/components/ComputeSection.tsx` to customize.");
|
|
225
|
+
}
|
|
226
|
+
lines.push("", "## Resources", "", "- [0G Docs](https://docs.0g.ai)", "- [Faucet](https://faucet.0g.ai)", "- [Explorer](https://chainscan-galileo.0g.ai)");
|
|
227
|
+
fs_extra_1.default.writeFileSync(path_1.default.join(targetDir, "README.md"), lines.join("\n") + "\n");
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-0g-app",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Zero-config scaffold CLI for building on the 0G decentralized AI network",
|
|
5
5
|
"bin": {
|
|
6
6
|
"create-0g-app": "./dist/index.js"
|
|
@@ -15,7 +15,14 @@
|
|
|
15
15
|
"start": "node dist/index.js",
|
|
16
16
|
"prepare": "npm run build"
|
|
17
17
|
},
|
|
18
|
-
"keywords": [
|
|
18
|
+
"keywords": [
|
|
19
|
+
"0g",
|
|
20
|
+
"scaffold",
|
|
21
|
+
"cli",
|
|
22
|
+
"web3",
|
|
23
|
+
"ai",
|
|
24
|
+
"decentralized"
|
|
25
|
+
],
|
|
19
26
|
"license": "MIT",
|
|
20
27
|
"dependencies": {
|
|
21
28
|
"@clack/prompts": "^0.9.1",
|
|
@@ -1,20 +1,11 @@
|
|
|
1
|
-
# deps
|
|
2
1
|
node_modules/
|
|
3
|
-
|
|
4
|
-
# Next.js
|
|
5
2
|
packages/web/.next/
|
|
6
3
|
packages/web/out/
|
|
7
|
-
|
|
8
|
-
# Hardhat
|
|
9
4
|
packages/contracts/artifacts/
|
|
10
5
|
packages/contracts/cache/
|
|
11
6
|
packages/contracts/typechain-types/
|
|
12
7
|
packages/contracts/.deployed-address
|
|
13
|
-
|
|
14
|
-
# env — never commit private keys
|
|
15
8
|
packages/web/.env.local
|
|
16
9
|
packages/web/.env
|
|
17
|
-
|
|
18
|
-
# misc
|
|
19
10
|
.DS_Store
|
|
20
11
|
*.log
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import { Geist } from "next/font/google";
|
|
3
|
+
import { Providers } from "./providers";
|
|
4
|
+
import { Navbar } from "@/components/Navbar";
|
|
5
|
+
import "./globals.css";
|
|
6
|
+
|
|
7
|
+
const geist = Geist({ subsets: ["latin"] });
|
|
8
|
+
|
|
9
|
+
export const metadata: Metadata = {
|
|
10
|
+
title: "create-0g-app",
|
|
11
|
+
description: "Decentralized app powered by 0G",
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
15
|
+
const missingKey = !process.env.PRIVATE_KEY;
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<html lang="en">
|
|
19
|
+
<body className={geist.className}>
|
|
20
|
+
<Providers>
|
|
21
|
+
<Navbar />
|
|
22
|
+
{missingKey && (
|
|
23
|
+
<div style={{
|
|
24
|
+
background: "#fef3c7",
|
|
25
|
+
borderBottom: "1px solid #f59e0b",
|
|
26
|
+
color: "#92400e",
|
|
27
|
+
fontSize: "0.85rem",
|
|
28
|
+
padding: "10px 24px",
|
|
29
|
+
}}>
|
|
30
|
+
⚠ <strong>PRIVATE_KEY</strong> is not set.
|
|
31
|
+
Add it to <code>packages/web/.env.local</code> to enable storage and compute.{" "}
|
|
32
|
+
<a href="https://faucet.0g.ai" target="_blank" rel="noopener noreferrer" style={{ color: "#92400e", fontWeight: 600 }}>
|
|
33
|
+
Get testnet OG ↗
|
|
34
|
+
</a>
|
|
35
|
+
</div>
|
|
36
|
+
)}
|
|
37
|
+
{children}
|
|
38
|
+
</Providers>
|
|
39
|
+
</body>
|
|
40
|
+
</html>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
@@ -11,12 +11,6 @@
|
|
|
11
11
|
z-index: 10;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
.left {
|
|
15
|
-
display: flex;
|
|
16
|
-
align-items: center;
|
|
17
|
-
gap: 24px;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
14
|
.logo {
|
|
21
15
|
font-size: 1rem;
|
|
22
16
|
font-weight: 700;
|
|
@@ -24,35 +18,9 @@
|
|
|
24
18
|
color: var(--text);
|
|
25
19
|
text-decoration: none;
|
|
26
20
|
}
|
|
21
|
+
.logo:hover { text-decoration: none; }
|
|
27
22
|
|
|
28
|
-
.accent {
|
|
29
|
-
color: var(--accent);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
.tabs {
|
|
33
|
-
display: flex;
|
|
34
|
-
gap: 4px;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.tab {
|
|
38
|
-
padding: 5px 12px;
|
|
39
|
-
border-radius: 6px;
|
|
40
|
-
font-size: 0.875rem;
|
|
41
|
-
color: var(--muted);
|
|
42
|
-
text-decoration: none;
|
|
43
|
-
transition: color 0.15s, background 0.15s;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.tab:hover {
|
|
47
|
-
color: var(--text);
|
|
48
|
-
background: var(--surface);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
.active {
|
|
52
|
-
color: var(--text);
|
|
53
|
-
background: var(--surface);
|
|
54
|
-
border: 1px solid var(--border);
|
|
55
|
-
}
|
|
23
|
+
.accent { color: var(--accent); }
|
|
56
24
|
|
|
57
25
|
.right {
|
|
58
26
|
display: flex;
|
|
@@ -1,30 +1,18 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import Link from "next/link";
|
|
3
|
-
import { usePathname } from "next/navigation";
|
|
4
3
|
import { useAccount, useConnect, useDisconnect } from "wagmi";
|
|
5
4
|
import styles from "./Navbar.module.css";
|
|
6
5
|
|
|
7
6
|
export function Navbar() {
|
|
8
|
-
const pathname = usePathname();
|
|
9
7
|
const { address, isConnected } = useAccount();
|
|
10
8
|
const { connect, connectors } = useConnect();
|
|
11
9
|
const { disconnect } = useDisconnect();
|
|
12
10
|
|
|
13
11
|
return (
|
|
14
12
|
<nav className={styles.nav}>
|
|
15
|
-
<
|
|
16
|
-
<
|
|
17
|
-
|
|
18
|
-
</Link>
|
|
19
|
-
<div className={styles.tabs}>
|
|
20
|
-
<Link
|
|
21
|
-
href="/storage"
|
|
22
|
-
className={`${styles.tab} ${pathname === "/storage" ? styles.active : ""}`}
|
|
23
|
-
>
|
|
24
|
-
Storage
|
|
25
|
-
</Link>
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
13
|
+
<Link href="/" className={styles.logo}>
|
|
14
|
+
<span className={styles.accent}>create</span>-0g-app
|
|
15
|
+
</Link>
|
|
28
16
|
<div className={styles.right}>
|
|
29
17
|
{isConnected ? (
|
|
30
18
|
<>
|
|
@@ -3,11 +3,11 @@ import { defineChain } from "viem";
|
|
|
3
3
|
import { injected, metaMask } from "wagmi/connectors";
|
|
4
4
|
|
|
5
5
|
export const galileo = defineChain({
|
|
6
|
-
id:
|
|
6
|
+
id: 16602,
|
|
7
7
|
name: "0G Galileo Testnet",
|
|
8
8
|
nativeCurrency: { name: "OG", symbol: "OG", decimals: 18 },
|
|
9
9
|
rpcUrls: {
|
|
10
|
-
default: { http: [process.env.NEXT_PUBLIC_RPC_URL ?? "https://evmrpc-
|
|
10
|
+
default: { http: [process.env.NEXT_PUBLIC_RPC_URL ?? "https://evmrpc-testnet.0g.ai"] },
|
|
11
11
|
},
|
|
12
12
|
blockExplorers: {
|
|
13
13
|
default: { name: "0G Chainscan", url: "https://chainscan-galileo.0g.ai" },
|
|
@@ -3,23 +3,12 @@ import webpack from "webpack";
|
|
|
3
3
|
|
|
4
4
|
const nextConfig: NextConfig = {
|
|
5
5
|
webpack: (config) => {
|
|
6
|
-
// Strip the `node:` URI scheme — webpack 5 doesn't handle it by default
|
|
7
|
-
// but already knows how to resolve `crypto`, `stream`, etc. without it.
|
|
8
6
|
config.plugins.push(
|
|
9
7
|
new webpack.NormalModuleReplacementPlugin(/^node:/, (resource: { request: string }) => {
|
|
10
8
|
resource.request = resource.request.replace(/^node:/, "");
|
|
11
9
|
})
|
|
12
10
|
);
|
|
13
|
-
|
|
14
|
-
// Prevent bundling of Node-only modules in the browser
|
|
15
|
-
config.resolve.fallback = {
|
|
16
|
-
fs: false,
|
|
17
|
-
net: false,
|
|
18
|
-
tls: false,
|
|
19
|
-
dns: false,
|
|
20
|
-
child_process: false,
|
|
21
|
-
};
|
|
22
|
-
|
|
11
|
+
config.resolve.fallback = { fs: false, net: false, tls: false, dns: false, child_process: false };
|
|
23
12
|
return config;
|
|
24
13
|
},
|
|
25
14
|
};
|