@olegkuibar/plunk 0.2.0-canary.04ff96f

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.
Files changed (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +95 -0
  3. package/dist/add-5ZRFUL6Z.mjs +258 -0
  4. package/dist/chokidar-XGAEDN45.mjs +1746 -0
  5. package/dist/chunk-34UXZ622.mjs +98 -0
  6. package/dist/chunk-4O2QOKVO.mjs +1958 -0
  7. package/dist/chunk-CSMZ6DZA.mjs +367 -0
  8. package/dist/chunk-CZM4TNAI.mjs +292 -0
  9. package/dist/chunk-EDUXIQ5W.mjs +1729 -0
  10. package/dist/chunk-GAAB2TLH.mjs +160 -0
  11. package/dist/chunk-HKNM3UWU.mjs +496 -0
  12. package/dist/chunk-I6SN7BBN.mjs +1131 -0
  13. package/dist/chunk-KYDBD2KQ.mjs +39 -0
  14. package/dist/chunk-LKQINKH4.mjs +130 -0
  15. package/dist/chunk-PUSXMPOF.mjs +82 -0
  16. package/dist/chunk-S4HJSJ32.mjs +69 -0
  17. package/dist/chunk-W3C72UKC.mjs +113 -0
  18. package/dist/chunk-WSECI6M7.mjs +85 -0
  19. package/dist/chunk-XMIZ7OUZ.mjs +26 -0
  20. package/dist/chunk-XZK5T4GK.mjs +23 -0
  21. package/dist/chunk-ZOYNYK5Y.mjs +23 -0
  22. package/dist/chunk-ZQCGJUBJ.mjs +92 -0
  23. package/dist/clean-LTR5MZTY.mjs +84 -0
  24. package/dist/cli.mjs +57 -0
  25. package/dist/dev-LFXQP6SA.mjs +194 -0
  26. package/dist/dist-DUFCZSIL.mjs +813 -0
  27. package/dist/doctor-R7ZVR7PY.mjs +230 -0
  28. package/dist/hash-worker.mjs +65 -0
  29. package/dist/index.d.ts +194 -0
  30. package/dist/index.mjs +9486 -0
  31. package/dist/init-SWCNRISY.mjs +310 -0
  32. package/dist/list-B77L2F34.mjs +119 -0
  33. package/dist/migrate-X5TIC5SS.mjs +124 -0
  34. package/dist/prompt-HTPH6HQ7.mjs +756 -0
  35. package/dist/publish-UXCLPNM6.mjs +63 -0
  36. package/dist/push-JI6HGCFG.mjs +197 -0
  37. package/dist/remove-DCR7KKD5.mjs +149 -0
  38. package/dist/restore-SUN3WGSW.mjs +124 -0
  39. package/dist/status-MESRBH54.mjs +103 -0
  40. package/dist/tailwind-source-JBBEIXIJ.mjs +89 -0
  41. package/dist/update-SKDSA673.mjs +100 -0
  42. package/dist/vite-config-BAK67JHB.mjs +128 -0
  43. package/dist/vite-plugin.d.ts +5 -0
  44. package/dist/vite-plugin.mjs +42 -0
  45. package/dist/workspace-76HJPAK2.mjs +97 -0
  46. package/package.json +96 -0
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env node
2
+ import{createRequire as __cr}from"node:module";globalThis.require=__cr(import.meta.url);
3
+ import {
4
+ addPostinstall,
5
+ ensureGitignore
6
+ } from "./chunk-ZQCGJUBJ.mjs";
7
+ import {
8
+ detectBuildCommand
9
+ } from "./chunk-XMIZ7OUZ.mjs";
10
+ import {
11
+ detectBundler,
12
+ detectPackageManager
13
+ } from "./chunk-34UXZ622.mjs";
14
+ import {
15
+ readConsumerState,
16
+ writeConsumerState
17
+ } from "./chunk-GAAB2TLH.mjs";
18
+ import {
19
+ Timer
20
+ } from "./chunk-XZK5T4GK.mjs";
21
+ import {
22
+ require_picocolors
23
+ } from "./chunk-PUSXMPOF.mjs";
24
+ import "./chunk-EDUXIQ5W.mjs";
25
+ import {
26
+ output,
27
+ suppressHumanOutput
28
+ } from "./chunk-ZOYNYK5Y.mjs";
29
+ import {
30
+ defineCommand
31
+ } from "./chunk-CSMZ6DZA.mjs";
32
+ import {
33
+ ensureDir,
34
+ exists
35
+ } from "./chunk-HKNM3UWU.mjs";
36
+ import {
37
+ consola
38
+ } from "./chunk-I6SN7BBN.mjs";
39
+ import {
40
+ __toESM
41
+ } from "./chunk-KYDBD2KQ.mjs";
42
+
43
+ // src/commands/init.ts
44
+ import { resolve, join, basename } from "path";
45
+ import { readFile, writeFile } from "fs/promises";
46
+ var import_picocolors = __toESM(require_picocolors(), 1);
47
+ var init_default = defineCommand({
48
+ meta: {
49
+ name: "init",
50
+ description: "Set up plunk in the current project"
51
+ },
52
+ args: {
53
+ yes: {
54
+ type: "boolean",
55
+ alias: "y",
56
+ description: "Skip confirmation prompts",
57
+ default: false
58
+ },
59
+ role: {
60
+ type: "string",
61
+ description: 'Project role: "consumer" or "library"'
62
+ }
63
+ },
64
+ async run({ args }) {
65
+ suppressHumanOutput();
66
+ const timer = new Timer();
67
+ const projectDir = resolve(".");
68
+ const skipPrompts = args.yes;
69
+ consola.info(`Initializing plunk in ${import_picocolors.default.cyan(projectDir)}
70
+ `);
71
+ const detectedPm = await detectPackageManager(projectDir);
72
+ const lockfileNames = {
73
+ pnpm: "pnpm-lock.yaml",
74
+ bun: "bun.lockb",
75
+ yarn: "yarn.lock",
76
+ npm: "package-lock.json"
77
+ };
78
+ consola.success(
79
+ `Detected package manager: ${import_picocolors.default.cyan(detectedPm)}` + (lockfileNames[detectedPm] ? ` (from ${lockfileNames[detectedPm]})` : "")
80
+ );
81
+ let pm = detectedPm;
82
+ if (!skipPrompts) {
83
+ const confirm = await consola.prompt(`Use ${detectedPm}?`, {
84
+ type: "confirm",
85
+ initial: true
86
+ });
87
+ if (confirm === false) {
88
+ const choices = ["npm", "pnpm", "yarn", "bun"].filter(
89
+ (p) => p !== detectedPm
90
+ );
91
+ const selected = await consola.prompt("Select package manager:", {
92
+ type: "select",
93
+ options: choices.map((p) => ({ label: p, value: p }))
94
+ });
95
+ if (typeof selected === "string") {
96
+ pm = selected;
97
+ }
98
+ }
99
+ }
100
+ let role = "consumer";
101
+ if (args.role === "consumer" || args.role === "library") {
102
+ role = args.role;
103
+ } else if (!skipPrompts) {
104
+ const selected = await consola.prompt(
105
+ "How will you use plunk in this project?",
106
+ {
107
+ type: "select",
108
+ options: [
109
+ {
110
+ label: "Consumer (app) \u2014 I want to link packages INTO this project",
111
+ value: "consumer"
112
+ },
113
+ {
114
+ label: "Library (package) \u2014 I want to publish this package FOR other projects",
115
+ value: "library"
116
+ }
117
+ ]
118
+ }
119
+ );
120
+ if (selected === "library") {
121
+ role = "library";
122
+ }
123
+ }
124
+ consola.success(`Project role: ${import_picocolors.default.cyan(role)}`);
125
+ const gitignorePath = join(projectDir, ".gitignore");
126
+ const gitignoreUpdated = await ensureGitignore(gitignorePath);
127
+ if (gitignoreUpdated) {
128
+ consola.success("Added .plunk/ to .gitignore");
129
+ }
130
+ const pkgPath = join(projectDir, "package.json");
131
+ let libraryBuildCmd;
132
+ if (await exists(pkgPath)) {
133
+ if (role === "consumer") {
134
+ const postinstallAdded = await addPostinstall(pkgPath);
135
+ if (postinstallAdded) {
136
+ consola.success(
137
+ 'Added "postinstall": "plunk restore" to package.json scripts'
138
+ );
139
+ }
140
+ let packageName = "{package-name}";
141
+ if (!skipPrompts) {
142
+ const input = await consola.prompt(
143
+ "Package name to link (leave blank to skip):",
144
+ { type: "text", default: "" }
145
+ );
146
+ if (typeof input === "string" && input.trim()) {
147
+ packageName = input.trim();
148
+ }
149
+ }
150
+ const addScriptAdded = await addScript(
151
+ pkgPath,
152
+ "plunk:add",
153
+ `plunk add ${packageName}`
154
+ );
155
+ if (addScriptAdded) {
156
+ consola.success(
157
+ `Added "plunk:add": "plunk add ${packageName}" to package.json scripts`
158
+ );
159
+ }
160
+ } else {
161
+ libraryBuildCmd = await detectBuildCommand2(pkgPath, pm, skipPrompts);
162
+ const added = await addLibraryScripts(pkgPath);
163
+ for (const name of added) {
164
+ consola.success(`Added "${name}" script to package.json`);
165
+ }
166
+ }
167
+ }
168
+ const plunkDir = join(projectDir, ".plunk");
169
+ if (!await exists(plunkDir)) {
170
+ await ensureDir(plunkDir);
171
+ await writeFile(
172
+ join(plunkDir, "state.json"),
173
+ JSON.stringify(
174
+ { version: "1", packageManager: pm, role, links: {} },
175
+ null,
176
+ 2
177
+ )
178
+ );
179
+ consola.success("Created .plunk/ state directory");
180
+ } else {
181
+ const state = await readConsumerState(projectDir);
182
+ state.packageManager = pm;
183
+ state.role = role;
184
+ await writeConsumerState(projectDir, state);
185
+ }
186
+ if (role === "consumer") {
187
+ const bundler = await detectBundler(projectDir);
188
+ if (bundler.type === "vite" && bundler.configFile) {
189
+ consola.success(
190
+ `Detected bundler: ${import_picocolors.default.cyan("Vite")} (${basename(bundler.configFile)})`
191
+ );
192
+ const { addPlunkVitePlugin } = await import("./vite-config-BAK67JHB.mjs");
193
+ const viteResult = await addPlunkVitePlugin(bundler.configFile);
194
+ if (viteResult.modified) {
195
+ consola.success(`Added plunk plugin to ${basename(bundler.configFile)}`);
196
+ } else if (viteResult.error) {
197
+ consola.info(
198
+ `Add the Vite plugin for automatic dev server restarts:
199
+ ${import_picocolors.default.cyan('import plunk from "@olegkuibar/plunk/vite"')}
200
+ ${import_picocolors.default.cyan("plugins: [plunk()]")}`
201
+ );
202
+ }
203
+ } else if (bundler.type === "next" && bundler.configFile) {
204
+ consola.success(
205
+ `Detected bundler: ${import_picocolors.default.cyan("Next.js")} (${basename(bundler.configFile)})`
206
+ );
207
+ consola.info(
208
+ `Next.js transpilePackages will be auto-configured when you run ${import_picocolors.default.cyan("plunk add")}`
209
+ );
210
+ } else if (bundler.type) {
211
+ const names = {
212
+ webpack: "Webpack",
213
+ turbo: "Turbopack",
214
+ rollup: "Rollup"
215
+ };
216
+ consola.success(
217
+ `Detected bundler: ${import_picocolors.default.cyan(names[bundler.type] || bundler.type)} \u2014 no config needed, works out of the box`
218
+ );
219
+ }
220
+ console.log("");
221
+ consola.info(`${import_picocolors.default.bold("Next steps:")}`);
222
+ console.log(
223
+ ` 1. ${import_picocolors.default.cyan("cd ../my-lib && plunk publish")}`
224
+ );
225
+ console.log(
226
+ ` 2. ${import_picocolors.default.cyan("plunk add my-lib")}${bundler.type === "vite" ? " \u2190 auto-updates vite config" : bundler.type === "next" ? " \u2190 auto-updates next config" : ""}`
227
+ );
228
+ console.log(
229
+ ` 3. ${import_picocolors.default.cyan("cd ../my-lib && plunk dev")} \u2190 watch + rebuild + auto-push`
230
+ );
231
+ } else {
232
+ console.log("");
233
+ consola.info(`${import_picocolors.default.bold("Next steps:")}`);
234
+ console.log(
235
+ ` 1. ${import_picocolors.default.cyan("plunk publish")} \u2190 copy built files to plunk store`
236
+ );
237
+ console.log(
238
+ ` 2. ${import_picocolors.default.cyan(`${pm} run plunk:dev`)} \u2190 watch + rebuild + auto-push to consumers`
239
+ );
240
+ console.log(
241
+ ` 3. In consumer project: ${import_picocolors.default.cyan("plunk add " + await readPkgName(pkgPath))}`
242
+ );
243
+ }
244
+ consola.info(`Done in ${timer.elapsed()}`);
245
+ output({
246
+ packageManager: pm,
247
+ role,
248
+ elapsed: timer.elapsedMs()
249
+ });
250
+ }
251
+ });
252
+ async function addScript(pkgPath, name, command) {
253
+ const content = await readFile(pkgPath, "utf-8");
254
+ const pkg = JSON.parse(content);
255
+ if (pkg.scripts?.[name]) return false;
256
+ if (!pkg.scripts) pkg.scripts = {};
257
+ pkg.scripts[name] = command;
258
+ const indent = content.match(/^(\s+)"/m)?.[1] || " ";
259
+ await writeFile(pkgPath, JSON.stringify(pkg, null, indent) + "\n");
260
+ return true;
261
+ }
262
+ async function detectBuildCommand2(pkgPath, pm, skipPrompts) {
263
+ const packageDir = join(pkgPath, "..");
264
+ const detected = await detectBuildCommand(packageDir, pm);
265
+ if (detected) {
266
+ consola.success(`Detected build script: ${import_picocolors.default.cyan(detected)}`);
267
+ return detected;
268
+ }
269
+ const runPrefix = pm === "npm" ? "npm run " : `${pm} `;
270
+ if (!skipPrompts) {
271
+ consola.warn("No build script found in package.json");
272
+ const input = await consola.prompt(
273
+ "Build command (e.g. tsc, tsup, rollup -c):",
274
+ { type: "text", default: "" }
275
+ );
276
+ if (typeof input === "string" && input.trim()) {
277
+ return input.trim();
278
+ }
279
+ }
280
+ const fallback = `${runPrefix}build`;
281
+ consola.warn(
282
+ `Using ${import_picocolors.default.cyan(fallback)} as placeholder \u2014 add a "build" script to package.json`
283
+ );
284
+ return fallback;
285
+ }
286
+ async function addLibraryScripts(pkgPath) {
287
+ const added = [];
288
+ if (await addScript(pkgPath, "plunk:publish", "plunk publish")) {
289
+ added.push("plunk:publish");
290
+ }
291
+ if (await addScript(
292
+ pkgPath,
293
+ "plunk:dev",
294
+ "plunk dev"
295
+ )) {
296
+ added.push("plunk:dev");
297
+ }
298
+ return added;
299
+ }
300
+ async function readPkgName(pkgPath) {
301
+ try {
302
+ const pkg = JSON.parse(await readFile(pkgPath, "utf-8"));
303
+ return pkg.name || "my-package";
304
+ } catch {
305
+ return "my-package";
306
+ }
307
+ }
308
+ export {
309
+ init_default as default
310
+ };
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env node
2
+ import{createRequire as __cr}from"node:module";globalThis.require=__cr(import.meta.url);
3
+ import {
4
+ readConsumerState
5
+ } from "./chunk-GAAB2TLH.mjs";
6
+ import {
7
+ getStoreEntry,
8
+ listStoreEntries
9
+ } from "./chunk-W3C72UKC.mjs";
10
+ import {
11
+ require_picocolors
12
+ } from "./chunk-PUSXMPOF.mjs";
13
+ import "./chunk-EDUXIQ5W.mjs";
14
+ import {
15
+ output,
16
+ suppressHumanOutput
17
+ } from "./chunk-ZOYNYK5Y.mjs";
18
+ import {
19
+ defineCommand
20
+ } from "./chunk-CSMZ6DZA.mjs";
21
+ import "./chunk-HKNM3UWU.mjs";
22
+ import {
23
+ consola
24
+ } from "./chunk-I6SN7BBN.mjs";
25
+ import {
26
+ __toESM
27
+ } from "./chunk-KYDBD2KQ.mjs";
28
+
29
+ // src/commands/list.ts
30
+ import { resolve } from "path";
31
+ var import_picocolors = __toESM(require_picocolors(), 1);
32
+ var list_default = defineCommand({
33
+ meta: {
34
+ name: "list",
35
+ description: "List linked packages in current project or in the store"
36
+ },
37
+ args: {
38
+ store: {
39
+ type: "boolean",
40
+ description: "List all packages in the global plunk store",
41
+ default: false
42
+ }
43
+ },
44
+ async run({ args }) {
45
+ suppressHumanOutput();
46
+ if (args.store) {
47
+ await listStore();
48
+ } else {
49
+ await listProject();
50
+ }
51
+ }
52
+ });
53
+ async function listProject() {
54
+ const state = await readConsumerState(resolve("."));
55
+ const links = Object.entries(state.links);
56
+ if (links.length === 0) {
57
+ consola.info("No linked packages in this project");
58
+ output({ packages: [] });
59
+ return;
60
+ }
61
+ consola.info(`Linked packages (${links.length}):
62
+ `);
63
+ const packages = [];
64
+ for (const [name, link] of links) {
65
+ const buildTag = link.buildId ? `[${link.buildId}]` : "[--------]";
66
+ let stale = false;
67
+ const storeEntry = await getStoreEntry(name, link.version);
68
+ if (storeEntry && storeEntry.meta.buildId && link.buildId && storeEntry.meta.buildId !== link.buildId) {
69
+ stale = true;
70
+ }
71
+ const staleTag = stale ? import_picocolors.default.yellow(" (stale)") : "";
72
+ console.log(
73
+ ` ${import_picocolors.default.cyan(name)} ${import_picocolors.default.dim("@" + link.version)} ${import_picocolors.default.dim(buildTag)}${staleTag} \u2190 ${import_picocolors.default.dim(link.sourcePath)}`
74
+ );
75
+ packages.push({ name, version: link.version, buildId: link.buildId ?? null, stale, sourcePath: link.sourcePath });
76
+ }
77
+ output({ packages });
78
+ }
79
+ async function listStore() {
80
+ const entries = await listStoreEntries();
81
+ if (entries.length === 0) {
82
+ consola.info("Plunk store is empty");
83
+ output({ entries: [] });
84
+ return;
85
+ }
86
+ consola.info(`Store entries (${entries.length}):
87
+ `);
88
+ const storeEntries = [];
89
+ for (const entry of entries) {
90
+ const age = getRelativeTime(new Date(entry.meta.publishedAt));
91
+ const buildTag = entry.meta.buildId ? `[${entry.meta.buildId}]` : "[--------]";
92
+ console.log(
93
+ ` ${import_picocolors.default.cyan(entry.name)} ${import_picocolors.default.dim("@" + entry.version)} ${import_picocolors.default.dim(buildTag)} ${import_picocolors.default.dim(`published ${age}`)}`
94
+ );
95
+ console.log(` ${import_picocolors.default.dim(`from: ${entry.meta.sourcePath}`)}`);
96
+ storeEntries.push({
97
+ name: entry.name,
98
+ version: entry.version,
99
+ buildId: entry.meta.buildId ?? null,
100
+ publishedAt: entry.meta.publishedAt,
101
+ sourcePath: entry.meta.sourcePath
102
+ });
103
+ }
104
+ output({ entries: storeEntries });
105
+ }
106
+ function getRelativeTime(date) {
107
+ const diff = Date.now() - date.getTime();
108
+ const seconds = Math.floor(diff / 1e3);
109
+ if (seconds < 60) return `${seconds}s ago`;
110
+ const minutes = Math.floor(seconds / 60);
111
+ if (minutes < 60) return `${minutes}m ago`;
112
+ const hours = Math.floor(minutes / 60);
113
+ if (hours < 24) return `${hours}h ago`;
114
+ const days = Math.floor(hours / 24);
115
+ return `${days}d ago`;
116
+ }
117
+ export {
118
+ list_default as default
119
+ };
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env node
2
+ import{createRequire as __cr}from"node:module";globalThis.require=__cr(import.meta.url);
3
+ import {
4
+ Timer
5
+ } from "./chunk-XZK5T4GK.mjs";
6
+ import {
7
+ require_picocolors
8
+ } from "./chunk-PUSXMPOF.mjs";
9
+ import {
10
+ output,
11
+ suppressHumanOutput
12
+ } from "./chunk-ZOYNYK5Y.mjs";
13
+ import {
14
+ defineCommand
15
+ } from "./chunk-CSMZ6DZA.mjs";
16
+ import {
17
+ exists
18
+ } from "./chunk-HKNM3UWU.mjs";
19
+ import {
20
+ consola
21
+ } from "./chunk-I6SN7BBN.mjs";
22
+ import {
23
+ __toESM
24
+ } from "./chunk-KYDBD2KQ.mjs";
25
+
26
+ // src/commands/migrate.ts
27
+ import { resolve, join } from "path";
28
+ import { readFile, writeFile, rm } from "fs/promises";
29
+ var import_picocolors = __toESM(require_picocolors(), 1);
30
+ var migrate_default = defineCommand({
31
+ meta: {
32
+ name: "migrate",
33
+ description: "Migrate from yalc to plunk"
34
+ },
35
+ async run() {
36
+ suppressHumanOutput();
37
+ const timer = new Timer();
38
+ const projectDir = resolve(".");
39
+ consola.info("Checking for yalc usage...\n");
40
+ const yalcDir = join(projectDir, ".yalc");
41
+ const yalcLockPath = join(projectDir, "yalc.lock");
42
+ const pkgPath = join(projectDir, "package.json");
43
+ const hasYalcDir = await exists(yalcDir);
44
+ const hasYalcLock = await exists(yalcLockPath);
45
+ if (!hasYalcDir && !hasYalcLock) {
46
+ consola.info("No yalc usage detected in this project.");
47
+ output({ migrated: false, packages: [] });
48
+ return;
49
+ }
50
+ const packages = [];
51
+ if (hasYalcLock) {
52
+ try {
53
+ const lockContent = await readFile(yalcLockPath, "utf-8");
54
+ const lock = JSON.parse(lockContent);
55
+ if (lock.packages) {
56
+ packages.push(...Object.keys(lock.packages));
57
+ consola.info(
58
+ `Found ${packages.length} yalc-linked package(s): ${packages.map((p) => import_picocolors.default.cyan(p)).join(", ")}`
59
+ );
60
+ }
61
+ } catch {
62
+ consola.warn("Could not parse yalc.lock");
63
+ }
64
+ }
65
+ if (await exists(pkgPath)) {
66
+ try {
67
+ const pkgContent = await readFile(pkgPath, "utf-8");
68
+ const pkg = JSON.parse(pkgContent);
69
+ let changed = false;
70
+ for (const depField of ["dependencies", "devDependencies", "peerDependencies"]) {
71
+ const deps = pkg[depField];
72
+ if (!deps) continue;
73
+ for (const [name, version] of Object.entries(deps)) {
74
+ if (typeof version === "string" && version.includes(".yalc/")) {
75
+ delete deps[name];
76
+ changed = true;
77
+ consola.info(`Removed file:.yalc/ reference for ${import_picocolors.default.cyan(name)}`);
78
+ }
79
+ }
80
+ }
81
+ if (changed) {
82
+ const indent = pkgContent.match(/^(\s+)"/m)?.[1] || " ";
83
+ await writeFile(pkgPath, JSON.stringify(pkg, null, indent) + "\n");
84
+ consola.success("Cleaned up package.json");
85
+ }
86
+ } catch (err) {
87
+ consola.warn(`Could not clean package.json: ${err}`);
88
+ }
89
+ }
90
+ if (hasYalcDir) {
91
+ await rm(yalcDir, { recursive: true, force: true });
92
+ consola.success("Removed .yalc/ directory");
93
+ }
94
+ if (hasYalcLock) {
95
+ await rm(yalcLockPath, { force: true });
96
+ consola.success("Removed yalc.lock");
97
+ }
98
+ console.log("");
99
+ consola.info(`${import_picocolors.default.bold("Migration complete!")} Next steps:
100
+ `);
101
+ console.log(` 1. ${import_picocolors.default.cyan("plunk init")}`);
102
+ if (packages.length > 0) {
103
+ for (const pkg of packages) {
104
+ console.log(
105
+ ` 2. ${import_picocolors.default.cyan(`plunk add ${pkg} --from <path-to-${pkg}>`)}`
106
+ );
107
+ }
108
+ }
109
+ console.log(
110
+ `
111
+ Run ${import_picocolors.default.cyan("plunk doctor")} to verify your setup.
112
+ `
113
+ );
114
+ consola.info(`Migrated in ${timer.elapsed()}`);
115
+ output({
116
+ migrated: true,
117
+ packages,
118
+ elapsed: timer.elapsedMs()
119
+ });
120
+ }
121
+ });
122
+ export {
123
+ migrate_default as default
124
+ };