create-skybridge 0.0.0-dev.c7e90f9 → 0.0.0-dev.c884459

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 CHANGED
@@ -3,6 +3,7 @@ import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import * as prompts from "@clack/prompts";
6
+ import { downloadTemplate } from "giget";
6
7
  import mri from "mri";
7
8
  const defaultProjectName = "skybridge-project";
8
9
  // prettier-ignore
@@ -13,21 +14,30 @@ Create a new Skybridge project by copying the starter template.
13
14
 
14
15
  Options:
15
16
  -h, --help show this help message
17
+ --repo <uri> use a git repository instead of the built-in template
16
18
  --overwrite remove existing files in target directory
17
19
  --immediate install dependencies and start development server
18
20
 
21
+ Repository URI formats:
22
+ github:user/repo
23
+ gitlab:user/repo/subdirectory
24
+ bitbucket:user/repo#branch
25
+
19
26
  Examples:
20
27
  create-skybridge my-app
28
+ create-skybridge my-app --repo github:alpic-ai/skybridge/examples/ecom-carousel
21
29
  create-skybridge . --overwrite --immediate
22
30
  `;
23
31
  export async function init(args = process.argv.slice(2)) {
24
32
  const argv = mri(args, {
25
33
  boolean: ["help", "overwrite", "immediate"],
34
+ string: ["repo"],
26
35
  alias: { h: "help" },
27
36
  });
28
37
  const argTargetDir = argv._[0]
29
38
  ? sanitizeTargetDir(String(argv._[0]))
30
39
  : undefined;
40
+ const argRepo = argv.repo;
31
41
  const argOverwrite = argv.overwrite;
32
42
  const argImmediate = argv.immediate;
33
43
  const help = argv.help;
@@ -100,27 +110,44 @@ export async function init(args = process.argv.slice(2)) {
100
110
  }
101
111
  }
102
112
  const root = path.join(process.cwd(), targetDir);
103
- // 3. Copy the repository
104
- prompts.log.step(`Copying template...`);
113
+ // 3. Download from repo or copy template
114
+ try {
115
+ if (argRepo) {
116
+ prompts.log.step(`Downloading ${argRepo}...`);
117
+ await downloadTemplate(argRepo, { dir: root });
118
+ prompts.log.success(`Project created in ${root}`);
119
+ }
120
+ else {
121
+ prompts.log.step(`Copying template...`);
122
+ const templateDir = fileURLToPath(new URL("../template", import.meta.url));
123
+ // Copy template to target directory
124
+ fs.cpSync(templateDir, root, {
125
+ recursive: true,
126
+ filter: (src) => [".npmrc"].every((file) => !src.endsWith(file)),
127
+ });
128
+ // Rename _gitignore to .gitignore
129
+ fs.renameSync(path.join(root, "_gitignore"), path.join(root, ".gitignore"));
130
+ prompts.log.success(`Project created in ${root}`);
131
+ }
132
+ }
133
+ catch (error) {
134
+ prompts.log.error("Failed to create project from template");
135
+ console.error(error);
136
+ process.exit(1);
137
+ }
138
+ // Update project name in package.json
139
+ const pkgPath = path.join(root, "package.json");
140
+ if (!fs.existsSync(pkgPath)) {
141
+ prompts.log.error("No package.json found in project");
142
+ process.exit(1);
143
+ }
105
144
  try {
106
- const templateDir = fileURLToPath(new URL("../template", import.meta.url));
107
- // Copy template to target directory
108
- fs.cpSync(templateDir, root, {
109
- recursive: true,
110
- filter: (src) => [".npmrc"].every((file) => !src.endsWith(file)),
111
- });
112
- // Rename _gitignore to .gitignore
113
- fs.renameSync(path.join(root, "_gitignore"), path.join(root, ".gitignore"));
114
- // Update project name in package.json
115
- const name = path.basename(root);
116
- const pkgPath = path.join(root, "package.json");
117
- const pkg = fs.readFileSync(pkgPath, "utf-8");
118
- const fixed = pkg.replace(/apps-sdk-template/g, name);
119
- fs.writeFileSync(pkgPath, fixed);
120
- prompts.log.success(`Project created in ${root}`);
145
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
146
+ pkg.name = path.basename(root);
147
+ fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
121
148
  }
122
149
  catch (error) {
123
- prompts.log.error("Failed to copy repository");
150
+ prompts.log.error("Failed to update project name in package.json");
124
151
  console.error(error);
125
152
  process.exit(1);
126
153
  }
@@ -14,10 +14,20 @@ describe("create-skybridge", () => {
14
14
  force: true,
15
15
  });
16
16
  });
17
- it("should scaffold a new project", async () => {
17
+ it("should copy the template", async () => {
18
18
  const name = `../../${tempDirName}//project$`;
19
19
  await init([name]);
20
20
  await fs.access(path.join(process.cwd(), tempDirName, "project", ".gitignore"));
21
21
  expect(fs.access(path.join(process.cwd(), tempDirName, "project", ".npmrc"))).rejects.toThrowError();
22
22
  });
23
+ it("should download template from repo", async () => {
24
+ const name = `../../${tempDirName}//project$`;
25
+ await init([
26
+ name,
27
+ "--repo",
28
+ "github:alpic-ai/skybridge/examples/ecom-carousel",
29
+ ]);
30
+ await fs.access(path.join(process.cwd(), tempDirName, "project", ".gitignore"));
31
+ expect(fs.access(path.join(process.cwd(), tempDirName, "project", ".npmrc"))).rejects.toThrowError();
32
+ });
23
33
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-skybridge",
3
- "version": "0.0.0-dev.c7e90f9",
3
+ "version": "0.0.0-dev.c884459",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "Alpic",
@@ -18,6 +18,7 @@
18
18
  ],
19
19
  "dependencies": {
20
20
  "@clack/prompts": "^0.11.0",
21
+ "giget": "^2.0.0",
21
22
  "mri": "^1.2.0"
22
23
  },
23
24
  "devDependencies": {