@bagelink/workspace 1.10.25 → 1.10.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin/bgl.cjs CHANGED
@@ -4,7 +4,7 @@
4
4
  const node_path = require('node:path');
5
5
  const process = require('node:process');
6
6
  const node_child_process = require('node:child_process');
7
- const netlify = require('../shared/workspace.DRlDHdPw.cjs');
7
+ const netlify = require('../shared/workspace.CbSngeyq.cjs');
8
8
  const node_fs = require('node:fs');
9
9
  const prompts = require('prompts');
10
10
 
package/dist/bin/bgl.mjs CHANGED
@@ -2,7 +2,7 @@
2
2
  import { resolve } from 'node:path';
3
3
  import process from 'node:process';
4
4
  import { spawn } from 'node:child_process';
5
- import { l as listProjects, w as writeNetlifyConfig, i as initWorkspace, a as addProject } from '../shared/workspace.Bc_dpzhA.mjs';
5
+ import { l as listProjects, w as writeNetlifyConfig, i as initWorkspace, a as addProject } from '../shared/workspace.Hoo0tj7x.mjs';
6
6
  import { existsSync, readFileSync, readdirSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';
7
7
  import prompts from 'prompts';
8
8
 
@@ -10,6 +10,16 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
10
10
  const process__default = /*#__PURE__*/_interopDefaultCompat(process);
11
11
  const prompts__default = /*#__PURE__*/_interopDefaultCompat(prompts);
12
12
 
13
+ async function resolveLatestVersion(pkg) {
14
+ try {
15
+ const res = await fetch(`https://registry.npmjs.org/${pkg}/latest`);
16
+ if (!res.ok) return "latest";
17
+ const data = await res.json();
18
+ return `^${data.version}`;
19
+ } catch {
20
+ return "latest";
21
+ }
22
+ }
13
23
  async function initWorkspace(root = process__default.cwd()) {
14
24
  console.log("\n\u{1F680} Creating Bagel workspace...\n");
15
25
  const response = await prompts__default([
@@ -44,7 +54,24 @@ async function initWorkspace(root = process__default.cwd()) {
44
54
  }
45
55
  const { workspaceName, projectId, createFirstProject, firstProjectName } = response;
46
56
  const workspaceDir = node_path.resolve(root, workspaceName);
47
- createWorkspaceRoot(root, workspaceName, projectId);
57
+ console.log("Resolving package versions...");
58
+ const allPkgs = [
59
+ "@bagelink/auth",
60
+ "@bagelink/sdk",
61
+ "@bagelink/vue",
62
+ "pinia",
63
+ "vue",
64
+ "vue-router",
65
+ "@bagelink/lint-config",
66
+ "@bagelink/workspace",
67
+ "@vitejs/plugin-vue",
68
+ "eslint",
69
+ "vite"
70
+ ];
71
+ const versions = Object.fromEntries(
72
+ await Promise.all(allPkgs.map(async (pkg) => [pkg, await resolveLatestVersion(pkg)]))
73
+ );
74
+ createWorkspaceRoot(root, workspaceName, projectId, versions);
48
75
  createSharedPackage(workspaceDir);
49
76
  if (createFirstProject && firstProjectName) {
50
77
  await addProject(firstProjectName, workspaceDir);
@@ -60,7 +87,7 @@ async function initWorkspace(root = process__default.cwd()) {
60
87
  }
61
88
  console.log("");
62
89
  }
63
- function createWorkspaceRoot(root, name, projectId) {
90
+ function createWorkspaceRoot(root, name, projectId, versions) {
64
91
  const workspaceDir = node_path.resolve(root, name);
65
92
  if (node_fs.existsSync(workspaceDir)) {
66
93
  console.error(`\u274C Directory ${name} already exists`);
@@ -81,20 +108,20 @@ function createWorkspaceRoot(root, name, projectId) {
81
108
  "lint:fix": "eslint . --cache --fix"
82
109
  },
83
110
  dependencies: {
84
- "@bagelink/auth": "latest",
85
- "@bagelink/sdk": "latest",
86
- "@bagelink/vue": "latest",
87
- "pinia": "latest",
88
- "vue": "latest",
89
- "vue-router": "latest"
111
+ "@bagelink/auth": versions["@bagelink/auth"],
112
+ "@bagelink/sdk": versions["@bagelink/sdk"],
113
+ "@bagelink/vue": versions["@bagelink/vue"],
114
+ "pinia": versions.pinia,
115
+ "vue": versions.vue,
116
+ "vue-router": versions["vue-router"]
90
117
  },
91
118
  devDependencies: {
92
- "@bagelink/lint-config": "latest",
93
- "@bagelink/workspace": "latest",
94
- "@vitejs/plugin-vue": "latest",
95
- "eslint": "latest",
119
+ "@bagelink/lint-config": versions["@bagelink/lint-config"],
120
+ "@bagelink/workspace": versions["@bagelink/workspace"],
121
+ "@vitejs/plugin-vue": versions["@vitejs/plugin-vue"],
122
+ "eslint": versions.eslint,
96
123
  "typescript": "^5.0.0",
97
- "vite": "latest"
124
+ "vite": versions.vite
98
125
  }
99
126
  };
100
127
  node_fs.writeFileSync(
@@ -275,6 +302,11 @@ async function addProject(name, root = process__default.cwd()) {
275
302
  console.log(`
276
303
  \u{1F4E6} Creating project: ${name}
277
304
  `);
305
+ console.log("Resolving package versions...");
306
+ const projectPkgs = ["@vitejs/plugin-vue", "vite", "vue", "pinia", "vue-router"];
307
+ const versions = Object.fromEntries(
308
+ await Promise.all(projectPkgs.map(async (pkg) => [pkg, await resolveLatestVersion(pkg)]))
309
+ );
278
310
  node_fs.mkdirSync(projectDir, { recursive: true });
279
311
  const isWorkspace = node_fs.existsSync(node_path.resolve(root, "bgl.config.ts"));
280
312
  const packageJson = {
@@ -285,11 +317,14 @@ async function addProject(name, root = process__default.cwd()) {
285
317
  build: "vite build",
286
318
  preview: "vite preview"
287
319
  },
288
- dependencies: {},
320
+ dependencies: {
321
+ "pinia": versions.pinia,
322
+ "vue": versions.vue,
323
+ "vue-router": versions["vue-router"]
324
+ },
289
325
  devDependencies: {
290
- "@vitejs/plugin-vue": "latest",
291
- "vite": "latest",
292
- "vue": "latest"
326
+ "@vitejs/plugin-vue": versions["@vitejs/plugin-vue"],
327
+ "vite": versions.vite
293
328
  }
294
329
  };
295
330
  if (isWorkspace) {
@@ -326,12 +361,18 @@ export default defineWorkspace({
326
361
  })
327
362
  `;
328
363
  node_fs.writeFileSync(node_path.resolve(projectDir, "bgl.config.ts"), bglConfigContent);
329
- const viteConfig = `import { defineConfig } from 'vite'
364
+ const viteConfig = `import { resolve } from 'node:path'
365
+ import { defineConfig } from 'vite'
330
366
  import vue from '@vitejs/plugin-vue'
331
367
  import { bagelink } from '@bagelink/workspace/vite'
332
368
  import workspace from './bgl.config'
333
369
 
334
370
  export default defineConfig({
371
+ resolve: {
372
+ alias: {
373
+ '@': resolve(__dirname, 'src'),
374
+ },
375
+ },
335
376
  plugins: [
336
377
  vue(),
337
378
  bagelink({ workspace }),
@@ -339,6 +380,20 @@ export default defineConfig({
339
380
  })
340
381
  `;
341
382
  node_fs.writeFileSync(node_path.resolve(projectDir, "vite.config.ts"), viteConfig);
383
+ const tsconfigJson = {
384
+ extends: "../tsconfig.app.json",
385
+ compilerOptions: {
386
+ paths: {
387
+ "@/*": ["./src/*"]
388
+ }
389
+ },
390
+ include: ["src/**/*"]
391
+ };
392
+ node_fs.writeFileSync(
393
+ node_path.resolve(projectDir, "tsconfig.json"),
394
+ `${JSON.stringify(tsconfigJson, null, 2)}
395
+ `
396
+ );
342
397
  const srcDir = node_path.resolve(projectDir, "src");
343
398
  node_fs.mkdirSync(srcDir, { recursive: true });
344
399
  const indexHtml = `<!DOCTYPE html>
@@ -355,27 +410,52 @@ export default defineConfig({
355
410
  </html>
356
411
  `;
357
412
  node_fs.writeFileSync(node_path.resolve(projectDir, "index.html"), indexHtml);
413
+ const routerDir = node_path.resolve(srcDir, "router");
414
+ node_fs.mkdirSync(routerDir, { recursive: true });
415
+ const routerTs = `import { createRouter, createWebHistory } from 'vue-router'
416
+ import HomeView from '../views/HomeView.vue'
417
+
418
+ export default createRouter({
419
+ history: createWebHistory(import.meta.env.BASE_URL),
420
+ routes: [
421
+ { path: '/', component: HomeView },
422
+ ],
423
+ })
424
+ `;
425
+ node_fs.writeFileSync(node_path.resolve(routerDir, "index.ts"), routerTs);
426
+ const viewsDir = node_path.resolve(srcDir, "views");
427
+ node_fs.mkdirSync(viewsDir, { recursive: true });
428
+ const homeView = `<script setup lang="ts">
429
+ ${isWorkspace ? "import { formatDate } from 'shared/utils'\n" : ""}
430
+ <\/script>
431
+
432
+ <template>
433
+ <main>
434
+ <h1>${name}</h1>
435
+ ${isWorkspace ? "<p>{{ formatDate(new Date()) }}</p>" : ""}
436
+ </main>
437
+ </template>
438
+ `;
439
+ node_fs.writeFileSync(node_path.resolve(viewsDir, "HomeView.vue"), homeView);
358
440
  const mainTs = `import { createApp } from 'vue'
441
+ import { createPinia } from 'pinia'
359
442
  import { BagelVue } from '@bagelink/vue'
443
+ import router from './router'
360
444
  import App from './App.vue'
361
445
 
362
446
  createApp(App)
447
+ .use(createPinia())
448
+ .use(router)
363
449
  .use(BagelVue)
364
450
  .mount('#app')
365
451
  `;
366
452
  node_fs.writeFileSync(node_path.resolve(srcDir, "main.ts"), mainTs);
367
453
  const appVue = `<script setup lang="ts">
368
- import { ref } from 'vue'
369
- ${isWorkspace ? "import { formatDate } from 'shared/utils'\n" : ""}
370
- const count = ref(0)
454
+ import { RouterView } from 'vue-router'
371
455
  <\/script>
372
456
 
373
457
  <template>
374
- <div>
375
- <h1>${name}</h1>
376
- <button @click="count++">Count: {{ count }}</button>
377
- ${isWorkspace ? "<p>{{ formatDate(new Date()) }}</p>" : ""}
378
- </div>
458
+ <RouterView />
379
459
  </template>
380
460
  `;
381
461
  node_fs.writeFileSync(node_path.resolve(srcDir, "App.vue"), appVue);
@@ -3,6 +3,16 @@ import { resolve } from 'node:path';
3
3
  import process from 'node:process';
4
4
  import prompts from 'prompts';
5
5
 
6
+ async function resolveLatestVersion(pkg) {
7
+ try {
8
+ const res = await fetch(`https://registry.npmjs.org/${pkg}/latest`);
9
+ if (!res.ok) return "latest";
10
+ const data = await res.json();
11
+ return `^${data.version}`;
12
+ } catch {
13
+ return "latest";
14
+ }
15
+ }
6
16
  async function initWorkspace(root = process.cwd()) {
7
17
  console.log("\n\u{1F680} Creating Bagel workspace...\n");
8
18
  const response = await prompts([
@@ -37,7 +47,24 @@ async function initWorkspace(root = process.cwd()) {
37
47
  }
38
48
  const { workspaceName, projectId, createFirstProject, firstProjectName } = response;
39
49
  const workspaceDir = resolve(root, workspaceName);
40
- createWorkspaceRoot(root, workspaceName, projectId);
50
+ console.log("Resolving package versions...");
51
+ const allPkgs = [
52
+ "@bagelink/auth",
53
+ "@bagelink/sdk",
54
+ "@bagelink/vue",
55
+ "pinia",
56
+ "vue",
57
+ "vue-router",
58
+ "@bagelink/lint-config",
59
+ "@bagelink/workspace",
60
+ "@vitejs/plugin-vue",
61
+ "eslint",
62
+ "vite"
63
+ ];
64
+ const versions = Object.fromEntries(
65
+ await Promise.all(allPkgs.map(async (pkg) => [pkg, await resolveLatestVersion(pkg)]))
66
+ );
67
+ createWorkspaceRoot(root, workspaceName, projectId, versions);
41
68
  createSharedPackage(workspaceDir);
42
69
  if (createFirstProject && firstProjectName) {
43
70
  await addProject(firstProjectName, workspaceDir);
@@ -53,7 +80,7 @@ async function initWorkspace(root = process.cwd()) {
53
80
  }
54
81
  console.log("");
55
82
  }
56
- function createWorkspaceRoot(root, name, projectId) {
83
+ function createWorkspaceRoot(root, name, projectId, versions) {
57
84
  const workspaceDir = resolve(root, name);
58
85
  if (existsSync(workspaceDir)) {
59
86
  console.error(`\u274C Directory ${name} already exists`);
@@ -74,20 +101,20 @@ function createWorkspaceRoot(root, name, projectId) {
74
101
  "lint:fix": "eslint . --cache --fix"
75
102
  },
76
103
  dependencies: {
77
- "@bagelink/auth": "latest",
78
- "@bagelink/sdk": "latest",
79
- "@bagelink/vue": "latest",
80
- "pinia": "latest",
81
- "vue": "latest",
82
- "vue-router": "latest"
104
+ "@bagelink/auth": versions["@bagelink/auth"],
105
+ "@bagelink/sdk": versions["@bagelink/sdk"],
106
+ "@bagelink/vue": versions["@bagelink/vue"],
107
+ "pinia": versions.pinia,
108
+ "vue": versions.vue,
109
+ "vue-router": versions["vue-router"]
83
110
  },
84
111
  devDependencies: {
85
- "@bagelink/lint-config": "latest",
86
- "@bagelink/workspace": "latest",
87
- "@vitejs/plugin-vue": "latest",
88
- "eslint": "latest",
112
+ "@bagelink/lint-config": versions["@bagelink/lint-config"],
113
+ "@bagelink/workspace": versions["@bagelink/workspace"],
114
+ "@vitejs/plugin-vue": versions["@vitejs/plugin-vue"],
115
+ "eslint": versions.eslint,
89
116
  "typescript": "^5.0.0",
90
- "vite": "latest"
117
+ "vite": versions.vite
91
118
  }
92
119
  };
93
120
  writeFileSync(
@@ -268,6 +295,11 @@ async function addProject(name, root = process.cwd()) {
268
295
  console.log(`
269
296
  \u{1F4E6} Creating project: ${name}
270
297
  `);
298
+ console.log("Resolving package versions...");
299
+ const projectPkgs = ["@vitejs/plugin-vue", "vite", "vue", "pinia", "vue-router"];
300
+ const versions = Object.fromEntries(
301
+ await Promise.all(projectPkgs.map(async (pkg) => [pkg, await resolveLatestVersion(pkg)]))
302
+ );
271
303
  mkdirSync(projectDir, { recursive: true });
272
304
  const isWorkspace = existsSync(resolve(root, "bgl.config.ts"));
273
305
  const packageJson = {
@@ -278,11 +310,14 @@ async function addProject(name, root = process.cwd()) {
278
310
  build: "vite build",
279
311
  preview: "vite preview"
280
312
  },
281
- dependencies: {},
313
+ dependencies: {
314
+ "pinia": versions.pinia,
315
+ "vue": versions.vue,
316
+ "vue-router": versions["vue-router"]
317
+ },
282
318
  devDependencies: {
283
- "@vitejs/plugin-vue": "latest",
284
- "vite": "latest",
285
- "vue": "latest"
319
+ "@vitejs/plugin-vue": versions["@vitejs/plugin-vue"],
320
+ "vite": versions.vite
286
321
  }
287
322
  };
288
323
  if (isWorkspace) {
@@ -319,12 +354,18 @@ export default defineWorkspace({
319
354
  })
320
355
  `;
321
356
  writeFileSync(resolve(projectDir, "bgl.config.ts"), bglConfigContent);
322
- const viteConfig = `import { defineConfig } from 'vite'
357
+ const viteConfig = `import { resolve } from 'node:path'
358
+ import { defineConfig } from 'vite'
323
359
  import vue from '@vitejs/plugin-vue'
324
360
  import { bagelink } from '@bagelink/workspace/vite'
325
361
  import workspace from './bgl.config'
326
362
 
327
363
  export default defineConfig({
364
+ resolve: {
365
+ alias: {
366
+ '@': resolve(__dirname, 'src'),
367
+ },
368
+ },
328
369
  plugins: [
329
370
  vue(),
330
371
  bagelink({ workspace }),
@@ -332,6 +373,20 @@ export default defineConfig({
332
373
  })
333
374
  `;
334
375
  writeFileSync(resolve(projectDir, "vite.config.ts"), viteConfig);
376
+ const tsconfigJson = {
377
+ extends: "../tsconfig.app.json",
378
+ compilerOptions: {
379
+ paths: {
380
+ "@/*": ["./src/*"]
381
+ }
382
+ },
383
+ include: ["src/**/*"]
384
+ };
385
+ writeFileSync(
386
+ resolve(projectDir, "tsconfig.json"),
387
+ `${JSON.stringify(tsconfigJson, null, 2)}
388
+ `
389
+ );
335
390
  const srcDir = resolve(projectDir, "src");
336
391
  mkdirSync(srcDir, { recursive: true });
337
392
  const indexHtml = `<!DOCTYPE html>
@@ -348,27 +403,52 @@ export default defineConfig({
348
403
  </html>
349
404
  `;
350
405
  writeFileSync(resolve(projectDir, "index.html"), indexHtml);
406
+ const routerDir = resolve(srcDir, "router");
407
+ mkdirSync(routerDir, { recursive: true });
408
+ const routerTs = `import { createRouter, createWebHistory } from 'vue-router'
409
+ import HomeView from '../views/HomeView.vue'
410
+
411
+ export default createRouter({
412
+ history: createWebHistory(import.meta.env.BASE_URL),
413
+ routes: [
414
+ { path: '/', component: HomeView },
415
+ ],
416
+ })
417
+ `;
418
+ writeFileSync(resolve(routerDir, "index.ts"), routerTs);
419
+ const viewsDir = resolve(srcDir, "views");
420
+ mkdirSync(viewsDir, { recursive: true });
421
+ const homeView = `<script setup lang="ts">
422
+ ${isWorkspace ? "import { formatDate } from 'shared/utils'\n" : ""}
423
+ <\/script>
424
+
425
+ <template>
426
+ <main>
427
+ <h1>${name}</h1>
428
+ ${isWorkspace ? "<p>{{ formatDate(new Date()) }}</p>" : ""}
429
+ </main>
430
+ </template>
431
+ `;
432
+ writeFileSync(resolve(viewsDir, "HomeView.vue"), homeView);
351
433
  const mainTs = `import { createApp } from 'vue'
434
+ import { createPinia } from 'pinia'
352
435
  import { BagelVue } from '@bagelink/vue'
436
+ import router from './router'
353
437
  import App from './App.vue'
354
438
 
355
439
  createApp(App)
440
+ .use(createPinia())
441
+ .use(router)
356
442
  .use(BagelVue)
357
443
  .mount('#app')
358
444
  `;
359
445
  writeFileSync(resolve(srcDir, "main.ts"), mainTs);
360
446
  const appVue = `<script setup lang="ts">
361
- import { ref } from 'vue'
362
- ${isWorkspace ? "import { formatDate } from 'shared/utils'\n" : ""}
363
- const count = ref(0)
447
+ import { RouterView } from 'vue-router'
364
448
  <\/script>
365
449
 
366
450
  <template>
367
- <div>
368
- <h1>${name}</h1>
369
- <button @click="count++">Count: {{ count }}</button>
370
- ${isWorkspace ? "<p>{{ formatDate(new Date()) }}</p>" : ""}
371
- </div>
451
+ <RouterView />
372
452
  </template>
373
453
  `;
374
454
  writeFileSync(resolve(srcDir, "App.vue"), appVue);
package/dist/vite.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
  const node_path = require('node:path');
4
4
  const process = require('node:process');
5
5
  const node_url = require('node:url');
6
- const netlify = require('./shared/workspace.DRlDHdPw.cjs');
6
+ const netlify = require('./shared/workspace.CbSngeyq.cjs');
7
7
  require('node:fs');
8
8
  require('prompts');
9
9
 
package/dist/vite.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import { basename } from 'node:path';
2
2
  import process from 'node:process';
3
3
  import { fileURLToPath } from 'node:url';
4
- import { l as listProjects } from './shared/workspace.Bc_dpzhA.mjs';
5
- export { g as generateNetlifyConfig, s as setBuildEnvVars, w as writeNetlifyConfig } from './shared/workspace.Bc_dpzhA.mjs';
4
+ import { l as listProjects } from './shared/workspace.Hoo0tj7x.mjs';
5
+ export { g as generateNetlifyConfig, s as setBuildEnvVars, w as writeNetlifyConfig } from './shared/workspace.Hoo0tj7x.mjs';
6
6
  import 'node:fs';
7
7
  import 'prompts';
8
8
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/workspace",
3
3
  "type": "module",
4
- "version": "1.10.25",
4
+ "version": "1.10.29",
5
5
  "description": "Monorepo workspace tooling for Bagel projects with proxy and config management",
6
6
  "author": {
7
7
  "name": "Bagel Studio",
package/src/workspace.ts CHANGED
@@ -3,6 +3,18 @@ import { resolve } from 'node:path'
3
3
  import process from 'node:process'
4
4
  import prompts from 'prompts'
5
5
 
6
+ async function resolveLatestVersion(pkg: string): Promise<string> {
7
+ try {
8
+ const res = await fetch(`https://registry.npmjs.org/${pkg}/latest`)
9
+ if (!res.ok) return 'latest'
10
+ const data = await res.json() as { version: string }
11
+ return `^${data.version}`
12
+ }
13
+ catch {
14
+ return 'latest'
15
+ }
16
+ }
17
+
6
18
  /**
7
19
  * Initialize a new workspace with flat structure
8
20
  */
@@ -45,8 +57,27 @@ export async function initWorkspace(root: string = process.cwd()): Promise<void>
45
57
 
46
58
  const workspaceDir = resolve(root, workspaceName)
47
59
 
60
+ // Resolve actual latest versions from npm before writing package.json
61
+ console.log('Resolving package versions...')
62
+ const allPkgs = [
63
+ '@bagelink/auth',
64
+ '@bagelink/sdk',
65
+ '@bagelink/vue',
66
+ 'pinia',
67
+ 'vue',
68
+ 'vue-router',
69
+ '@bagelink/lint-config',
70
+ '@bagelink/workspace',
71
+ '@vitejs/plugin-vue',
72
+ 'eslint',
73
+ 'vite',
74
+ ]
75
+ const versions = Object.fromEntries(
76
+ await Promise.all(allPkgs.map(async pkg => [pkg, await resolveLatestVersion(pkg)])),
77
+ )
78
+
48
79
  // Create workspace structure
49
- createWorkspaceRoot(root, workspaceName, projectId)
80
+ createWorkspaceRoot(root, workspaceName, projectId, versions)
50
81
 
51
82
  // Create shared package
52
83
  createSharedPackage(workspaceDir)
@@ -71,7 +102,7 @@ export async function initWorkspace(root: string = process.cwd()): Promise<void>
71
102
  /**
72
103
  * Create workspace root files
73
104
  */
74
- function createWorkspaceRoot(root: string, name: string, projectId: string): void {
105
+ function createWorkspaceRoot(root: string, name: string, projectId: string, versions: Record<string, string>): void {
75
106
  const workspaceDir = resolve(root, name)
76
107
 
77
108
  if (existsSync(workspaceDir)) {
@@ -96,20 +127,20 @@ function createWorkspaceRoot(root: string, name: string, projectId: string): voi
96
127
  'lint:fix': 'eslint . --cache --fix',
97
128
  },
98
129
  dependencies: {
99
- '@bagelink/auth': 'latest',
100
- '@bagelink/sdk': 'latest',
101
- '@bagelink/vue': 'latest',
102
- 'pinia': 'latest',
103
- 'vue': 'latest',
104
- 'vue-router': 'latest',
130
+ '@bagelink/auth': versions['@bagelink/auth'],
131
+ '@bagelink/sdk': versions['@bagelink/sdk'],
132
+ '@bagelink/vue': versions['@bagelink/vue'],
133
+ 'pinia': versions.pinia,
134
+ 'vue': versions.vue,
135
+ 'vue-router': versions['vue-router'],
105
136
  },
106
137
  devDependencies: {
107
- '@bagelink/lint-config': 'latest',
108
- '@bagelink/workspace': 'latest',
109
- '@vitejs/plugin-vue': 'latest',
110
- 'eslint': 'latest',
138
+ '@bagelink/lint-config': versions['@bagelink/lint-config'],
139
+ '@bagelink/workspace': versions['@bagelink/workspace'],
140
+ '@vitejs/plugin-vue': versions['@vitejs/plugin-vue'],
141
+ 'eslint': versions.eslint,
111
142
  'typescript': '^5.0.0',
112
- 'vite': 'latest',
143
+ 'vite': versions.vite,
113
144
  },
114
145
  }
115
146
 
@@ -325,6 +356,12 @@ export async function addProject(
325
356
 
326
357
  console.log(`\n📦 Creating project: ${name}\n`)
327
358
 
359
+ console.log('Resolving package versions...')
360
+ const projectPkgs = ['@vitejs/plugin-vue', 'vite', 'vue', 'pinia', 'vue-router']
361
+ const versions = Object.fromEntries(
362
+ await Promise.all(projectPkgs.map(async pkg => [pkg, await resolveLatestVersion(pkg)])),
363
+ )
364
+
328
365
  mkdirSync(projectDir, { recursive: true })
329
366
 
330
367
  // Determine if this is part of a workspace
@@ -339,11 +376,14 @@ export async function addProject(
339
376
  build: 'vite build',
340
377
  preview: 'vite preview',
341
378
  },
342
- dependencies: {} as Record<string, string>,
379
+ dependencies: {
380
+ 'pinia': versions.pinia,
381
+ 'vue': versions.vue,
382
+ 'vue-router': versions['vue-router'],
383
+ } as Record<string, string>,
343
384
  devDependencies: {
344
- '@vitejs/plugin-vue': 'latest',
345
- 'vite': 'latest',
346
- 'vue': 'latest',
385
+ '@vitejs/plugin-vue': versions['@vitejs/plugin-vue'],
386
+ 'vite': versions.vite,
347
387
  },
348
388
  }
349
389
 
@@ -389,12 +429,18 @@ export default defineWorkspace({
389
429
  writeFileSync(resolve(projectDir, 'bgl.config.ts'), bglConfigContent)
390
430
 
391
431
  // vite.config.ts
392
- const viteConfig = `import { defineConfig } from 'vite'
432
+ const viteConfig = `import { resolve } from 'node:path'
433
+ import { defineConfig } from 'vite'
393
434
  import vue from '@vitejs/plugin-vue'
394
435
  import { bagelink } from '@bagelink/workspace/vite'
395
436
  import workspace from './bgl.config'
396
437
 
397
438
  export default defineConfig({
439
+ resolve: {
440
+ alias: {
441
+ '@': resolve(__dirname, 'src'),
442
+ },
443
+ },
398
444
  plugins: [
399
445
  vue(),
400
446
  bagelink({ workspace }),
@@ -404,6 +450,22 @@ export default defineConfig({
404
450
 
405
451
  writeFileSync(resolve(projectDir, 'vite.config.ts'), viteConfig)
406
452
 
453
+ // tsconfig.json
454
+ const tsconfigJson = {
455
+ extends: '../tsconfig.app.json',
456
+ compilerOptions: {
457
+ paths: {
458
+ '@/*': ['./src/*'],
459
+ },
460
+ },
461
+ include: ['src/**/*'],
462
+ }
463
+
464
+ writeFileSync(
465
+ resolve(projectDir, 'tsconfig.json'),
466
+ `${JSON.stringify(tsconfigJson, null, 2)}\n`,
467
+ )
468
+
407
469
  // Create basic src structure
408
470
  const srcDir = resolve(projectDir, 'src')
409
471
  mkdirSync(srcDir, { recursive: true })
@@ -425,12 +487,47 @@ export default defineConfig({
425
487
 
426
488
  writeFileSync(resolve(projectDir, 'index.html'), indexHtml)
427
489
 
490
+ // src/router/index.ts
491
+ const routerDir = resolve(srcDir, 'router')
492
+ mkdirSync(routerDir, { recursive: true })
493
+ const routerTs = `import { createRouter, createWebHistory } from 'vue-router'
494
+ import HomeView from '../views/HomeView.vue'
495
+
496
+ export default createRouter({
497
+ history: createWebHistory(import.meta.env.BASE_URL),
498
+ routes: [
499
+ { path: '/', component: HomeView },
500
+ ],
501
+ })
502
+ `
503
+ writeFileSync(resolve(routerDir, 'index.ts'), routerTs)
504
+
505
+ // src/views/HomeView.vue
506
+ const viewsDir = resolve(srcDir, 'views')
507
+ mkdirSync(viewsDir, { recursive: true })
508
+ const homeView = `<script setup lang="ts">
509
+ ${isWorkspace ? 'import { formatDate } from \'shared/utils\'\n' : ''}
510
+ </script>
511
+
512
+ <template>
513
+ <main>
514
+ <h1>${name}</h1>
515
+ ${isWorkspace ? '<p>{{ formatDate(new Date()) }}</p>' : ''}
516
+ </main>
517
+ </template>
518
+ `
519
+ writeFileSync(resolve(viewsDir, 'HomeView.vue'), homeView)
520
+
428
521
  // main.ts
429
522
  const mainTs = `import { createApp } from 'vue'
523
+ import { createPinia } from 'pinia'
430
524
  import { BagelVue } from '@bagelink/vue'
525
+ import router from './router'
431
526
  import App from './App.vue'
432
527
 
433
528
  createApp(App)
529
+ .use(createPinia())
530
+ .use(router)
434
531
  .use(BagelVue)
435
532
  .mount('#app')
436
533
  `
@@ -439,17 +536,11 @@ createApp(App)
439
536
 
440
537
  // App.vue
441
538
  const appVue = `<script setup lang="ts">
442
- import { ref } from 'vue'
443
- ${isWorkspace ? 'import { formatDate } from \'shared/utils\'\n' : ''}
444
- const count = ref(0)
539
+ import { RouterView } from 'vue-router'
445
540
  </script>
446
541
 
447
542
  <template>
448
- <div>
449
- <h1>${name}</h1>
450
- <button @click="count++">Count: {{ count }}</button>
451
- ${isWorkspace ? '<p>{{ formatDate(new Date()) }}</p>' : ''}
452
- </div>
543
+ <RouterView />
453
544
  </template>
454
545
  `
455
546