@slidev/cli 0.39.0 → 0.40.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.
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkDTAZRAWWjs = require('./chunk-DTAZRAWW.js');
5
+ var _chunk5WKTX26Wjs = require('./chunk-5WKTX26W.js');
6
6
  require('./chunk-UJ5GHVII.js');
7
7
 
8
8
  // node/build.ts
@@ -646,16 +646,16 @@ async function build(options, viteConfig = {}, args) {
646
646
  let originalIndexHTML;
647
647
  if (_fsextra2.default.existsSync(indexPath))
648
648
  originalIndexHTML = await _fsextra2.default.readFile(indexPath, "utf-8");
649
- await _fsextra2.default.writeFile(indexPath, await _chunkDTAZRAWWjs.getIndexHtml.call(void 0, options), "utf-8");
649
+ await _fsextra2.default.writeFile(indexPath, await _chunk5WKTX26Wjs.getIndexHtml.call(void 0, options), "utf-8");
650
650
  let config = void 0;
651
651
  try {
652
- const inlineConfig = await _chunkDTAZRAWWjs.mergeViteConfigs.call(void 0,
652
+ const inlineConfig = await _chunk5WKTX26Wjs.mergeViteConfigs.call(void 0,
653
653
  options,
654
654
  viteConfig,
655
655
  {
656
656
  root: options.userRoot,
657
657
  plugins: [
658
- await _chunkDTAZRAWWjs.ViteSlidevPlugin.call(void 0, options, pluginOptions),
658
+ await _chunk5WKTX26Wjs.ViteSlidevPlugin.call(void 0, options, pluginOptions),
659
659
  {
660
660
  name: "resolve-config",
661
661
  configResolved(_config) {
@@ -676,7 +676,7 @@ async function build(options, viteConfig = {}, args) {
676
676
  } else {
677
677
  console.log(_kolorist.blue.call(void 0, " building for Monaco...\n"));
678
678
  await _vite.build.call(void 0,
679
- await _chunkDTAZRAWWjs.mergeViteConfigs.call(void 0,
679
+ await _chunk5WKTX26Wjs.mergeViteConfigs.call(void 0,
680
680
  options,
681
681
  inlineConfig,
682
682
  {
@@ -2,7 +2,7 @@ import {
2
2
  ViteSlidevPlugin,
3
3
  getIndexHtml,
4
4
  mergeViteConfigs
5
- } from "./chunk-36C7XM4S.mjs";
5
+ } from "./chunk-BBPMWYAE.mjs";
6
6
  import "./chunk-VLEV37KF.mjs";
7
7
 
8
8
  // node/build.ts
@@ -269,10 +269,10 @@ var dependencies = {
269
269
  "@antfu/utils": "^0.7.2",
270
270
  "@slidev/parser": "workspace:*",
271
271
  "@slidev/types": "workspace:*",
272
- "@unocss/reset": "^0.49.1",
273
- "@vueuse/core": "^9.11.1",
274
- "@vueuse/head": "^1.0.23",
275
- "@vueuse/math": "^9.11.1",
272
+ "@unocss/reset": "^0.49.4",
273
+ "@vueuse/core": "^9.12.0",
274
+ "@vueuse/head": "^1.0.24",
275
+ "@vueuse/math": "^9.12.0",
276
276
  "@vueuse/motion": "^2.0.0-beta.27",
277
277
  codemirror: "^5.65.5",
278
278
  defu: "^6.1.2",
@@ -287,9 +287,9 @@ var dependencies = {
287
287
  prettier: "^2.8.3",
288
288
  recordrtc: "^5.6.2",
289
289
  resolve: "^1.22.1",
290
- unocss: "^0.49.1",
290
+ unocss: "^0.49.4",
291
291
  "vite-plugin-windicss": "^1.8.10",
292
- vue: "^3.2.45",
292
+ vue: "^3.2.47",
293
293
  "vue-router": "^4.1.6",
294
294
  "vue-starport": "^0.3.0",
295
295
  windicss: "^3.5.6"
@@ -472,7 +472,7 @@ md.use(_markdownitlinkattributes2.default, {
472
472
  function prepareSlideInfo(data) {
473
473
  return {
474
474
  ...data,
475
- notesHTML: md.render((data == null ? void 0 : data.note) || "")
475
+ noteHTML: md.render((data == null ? void 0 : data.note) || "")
476
476
  };
477
477
  }
478
478
  function createSlidesLoader({ data, entry, clientRoot, themeRoots, addonRoots, userRoot, roots, remote }, pluginOptions, serverOptions, VuePlugin, MarkdownPlugin) {
@@ -1637,6 +1637,7 @@ async function ViteSlidevPlugin(options, pluginOptions, serverOptions = {}) {
1637
1637
  customCollections: Object.keys(iconsOptions.customCollections || [])
1638
1638
  })
1639
1639
  ],
1640
+ dts: false,
1640
1641
  ...componentsOptions
1641
1642
  }),
1642
1643
  _vite4.default.call(void 0, {
@@ -269,10 +269,10 @@ var dependencies = {
269
269
  "@antfu/utils": "^0.7.2",
270
270
  "@slidev/parser": "workspace:*",
271
271
  "@slidev/types": "workspace:*",
272
- "@unocss/reset": "^0.49.1",
273
- "@vueuse/core": "^9.11.1",
274
- "@vueuse/head": "^1.0.23",
275
- "@vueuse/math": "^9.11.1",
272
+ "@unocss/reset": "^0.49.4",
273
+ "@vueuse/core": "^9.12.0",
274
+ "@vueuse/head": "^1.0.24",
275
+ "@vueuse/math": "^9.12.0",
276
276
  "@vueuse/motion": "^2.0.0-beta.27",
277
277
  codemirror: "^5.65.5",
278
278
  defu: "^6.1.2",
@@ -287,9 +287,9 @@ var dependencies = {
287
287
  prettier: "^2.8.3",
288
288
  recordrtc: "^5.6.2",
289
289
  resolve: "^1.22.1",
290
- unocss: "^0.49.1",
290
+ unocss: "^0.49.4",
291
291
  "vite-plugin-windicss": "^1.8.10",
292
- vue: "^3.2.45",
292
+ vue: "^3.2.47",
293
293
  "vue-router": "^4.1.6",
294
294
  "vue-starport": "^0.3.0",
295
295
  windicss: "^3.5.6"
@@ -472,7 +472,7 @@ md.use(mila, {
472
472
  function prepareSlideInfo(data) {
473
473
  return {
474
474
  ...data,
475
- notesHTML: md.render((data == null ? void 0 : data.note) || "")
475
+ noteHTML: md.render((data == null ? void 0 : data.note) || "")
476
476
  };
477
477
  }
478
478
  function createSlidesLoader({ data, entry, clientRoot, themeRoots, addonRoots, userRoot, roots, remote }, pluginOptions, serverOptions, VuePlugin, MarkdownPlugin) {
@@ -1637,6 +1637,7 @@ async function ViteSlidevPlugin(options, pluginOptions, serverOptions = {}) {
1637
1637
  customCollections: Object.keys(iconsOptions.customCollections || [])
1638
1638
  })
1639
1639
  ],
1640
+ dts: false,
1640
1641
  ...componentsOptions
1641
1642
  }),
1642
1643
  Icons({
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ViteSlidevPlugin,
3
3
  mergeViteConfigs
4
- } from "./chunk-36C7XM4S.mjs";
4
+ } from "./chunk-BBPMWYAE.mjs";
5
5
  import {
6
6
  __commonJS,
7
7
  __privateAdd,
@@ -2400,7 +2400,7 @@ async function createServer(options, viteConfig = {}, serverOptions = {}) {
2400
2400
  import * as parser from "@slidev/parser/fs";
2401
2401
 
2402
2402
  // package.json
2403
- var version = "0.39.0";
2403
+ var version = "0.40.0";
2404
2404
 
2405
2405
  // node/themes.ts
2406
2406
  import prompts2 from "prompts";
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
2
 
3
3
 
4
- var _chunkDTAZRAWWjs = require('./chunk-DTAZRAWW.js');
4
+ var _chunk5WKTX26Wjs = require('./chunk-5WKTX26W.js');
5
5
 
6
6
 
7
7
 
@@ -2377,7 +2377,7 @@ async function createServer(options, viteConfig = {}, serverOptions = {}) {
2377
2377
  const pluginOptions = rawConfig.slidev || {};
2378
2378
  process.env.EDITOR = process.env.EDITOR || "code";
2379
2379
  const server = await _vite.createServer.call(void 0,
2380
- await _chunkDTAZRAWWjs.mergeViteConfigs.call(void 0,
2380
+ await _chunk5WKTX26Wjs.mergeViteConfigs.call(void 0,
2381
2381
  options,
2382
2382
  viteConfig,
2383
2383
  {
@@ -2387,7 +2387,7 @@ async function createServer(options, viteConfig = {}, serverOptions = {}) {
2387
2387
  ]
2388
2388
  },
2389
2389
  plugins: [
2390
- await _chunkDTAZRAWWjs.ViteSlidevPlugin.call(void 0, options, pluginOptions, serverOptions)
2390
+ await _chunk5WKTX26Wjs.ViteSlidevPlugin.call(void 0, options, pluginOptions, serverOptions)
2391
2391
  ]
2392
2392
  },
2393
2393
  "serve"
@@ -2400,7 +2400,7 @@ async function createServer(options, viteConfig = {}, serverOptions = {}) {
2400
2400
  var _fs = require('@slidev/parser/fs'); var parser = _interopRequireWildcard(_fs);
2401
2401
 
2402
2402
  // package.json
2403
- var version = "0.39.0";
2403
+ var version = "0.40.0";
2404
2404
 
2405
2405
  // node/themes.ts
2406
2406
  var _prompts = require('prompts'); var _prompts2 = _interopRequireDefault(_prompts);
package/dist/cli.js CHANGED
@@ -9,17 +9,17 @@
9
9
 
10
10
 
11
11
 
12
- var _chunkIM22HCOOjs = require('./chunk-IM22HCOO.js');
12
+ var _chunkVR2CNJVJjs = require('./chunk-VR2CNJVJ.js');
13
13
 
14
14
 
15
15
 
16
- var _chunkDTAZRAWWjs = require('./chunk-DTAZRAWW.js');
16
+ var _chunk5WKTX26Wjs = require('./chunk-5WKTX26W.js');
17
17
 
18
18
 
19
19
  var _chunkUJ5GHVIIjs = require('./chunk-UJ5GHVII.js');
20
20
 
21
21
  // node/cli.ts
22
- var import_fast_deep_equal = _chunkUJ5GHVIIjs.__toESM.call(void 0, _chunkDTAZRAWWjs.require_fast_deep_equal.call(void 0, ));
22
+ var import_fast_deep_equal = _chunkUJ5GHVIIjs.__toESM.call(void 0, _chunk5WKTX26Wjs.require_fast_deep_equal.call(void 0, ));
23
23
  var _path = require('path'); var _path2 = _interopRequireDefault(_path);
24
24
  var _os = require('os'); var _os2 = _interopRequireDefault(_os);
25
25
  var _child_process = require('child_process');
@@ -43,14 +43,14 @@ var CONFIG_RESTART_FIELDS = [
43
43
  _fs.injectPreparserExtensionLoader.call(void 0, async (headmatter, filepath) => {
44
44
  const addons = _nullishCoalesce((headmatter == null ? void 0 : headmatter.addons), () => ( []));
45
45
  const roots = [
46
- _chunkIM22HCOOjs.getUserRoot.call(void 0, {}).userRoot,
47
- ..._chunkIM22HCOOjs.getAddonRoots.call(void 0, addons, ""),
48
- _chunkIM22HCOOjs.getClientRoot.call(void 0, )
46
+ _chunkVR2CNJVJjs.getUserRoot.call(void 0, {}).userRoot,
47
+ ..._chunkVR2CNJVJjs.getAddonRoots.call(void 0, addons, ""),
48
+ _chunkVR2CNJVJjs.getClientRoot.call(void 0, )
49
49
  ];
50
50
  const mergeArrays = (a, b) => a.concat(b);
51
- return await _chunkDTAZRAWWjs.loadSetups.call(void 0, roots, "preparser.ts", { filepath, headmatter }, [], false, mergeArrays);
51
+ return await _chunk5WKTX26Wjs.loadSetups.call(void 0, roots, "preparser.ts", { filepath, headmatter }, [], false, mergeArrays);
52
52
  });
53
- var cli = _yargs2.default.scriptName("slidev").usage("$0 [args]").version(_chunkIM22HCOOjs.version).strict().showHelpOnFail(false).alias("h", "help").alias("v", "version");
53
+ var cli = _yargs2.default.scriptName("slidev").usage("$0 [args]").version(_chunkVR2CNJVJjs.version).strict().showHelpOnFail(false).alias("h", "help").alias("v", "version");
54
54
  cli.command(
55
55
  "* [entry]",
56
56
  "Start a local server for Slidev",
@@ -66,6 +66,10 @@ cli.command(
66
66
  }).option("remote", {
67
67
  type: "string",
68
68
  describe: "listen public host and enable remote control"
69
+ }).option("tunnel", {
70
+ default: false,
71
+ type: "boolean",
72
+ describe: "open localtunnel to make Slidev available on the internet"
69
73
  }).option("log", {
70
74
  default: "warn",
71
75
  type: "string",
@@ -81,7 +85,7 @@ cli.command(
81
85
  type: "boolean",
82
86
  describe: "force the optimizer to ignore the cache and re-bundle "
83
87
  }).strict().help(),
84
- async ({ entry, theme, port: userPort, open, log, remote, force, inspect }) => {
88
+ async ({ entry, theme, port: userPort, open, log, remote, tunnel, force, inspect }) => {
85
89
  if (!_fsextra2.default.existsSync(entry) && !entry.endsWith(".md"))
86
90
  entry = `${entry}.md`;
87
91
  if (!_fsextra2.default.existsSync(entry)) {
@@ -98,12 +102,13 @@ cli.command(
98
102
  }
99
103
  let server;
100
104
  let port = 3030;
105
+ let lastRemoteUrl;
101
106
  async function initServer() {
102
107
  if (server)
103
108
  await server.close();
104
- const options = await _chunkIM22HCOOjs.resolveOptions.call(void 0, { entry, remote, theme, inspect }, "dev");
109
+ const options = await _chunkVR2CNJVJjs.resolveOptions.call(void 0, { entry, remote, theme, inspect }, "dev");
105
110
  port = userPort || await findFreePort(3030);
106
- server = await _chunkIM22HCOOjs.createServer.call(void 0,
111
+ server = await _chunkVR2CNJVJjs.createServer.call(void 0,
107
112
  options,
108
113
  {
109
114
  server: {
@@ -117,7 +122,7 @@ cli.command(
117
122
  },
118
123
  {
119
124
  onDataReload(newData, data) {
120
- if (!theme && _chunkIM22HCOOjs.resolveThemeName.call(void 0, newData.config.theme) !== _chunkIM22HCOOjs.resolveThemeName.call(void 0, data.config.theme)) {
125
+ if (!theme && _chunkVR2CNJVJjs.resolveThemeName.call(void 0, newData.config.theme) !== _chunkVR2CNJVJjs.resolveThemeName.call(void 0, data.config.theme)) {
121
126
  console.log(_kolorist.yellow.call(void 0, "\n restarting on theme change\n"));
122
127
  initServer();
123
128
  } else if (CONFIG_RESTART_FIELDS.some((i) => !(0, import_fast_deep_equal.default)(newData.config[i], data.config[i]))) {
@@ -128,7 +133,22 @@ cli.command(
128
133
  }
129
134
  );
130
135
  await server.listen();
131
- printInfo(options, port, remote);
136
+ let tunnelUrl = "";
137
+ if (tunnel) {
138
+ if (remote != null)
139
+ tunnelUrl = await openTunnel(port);
140
+ else
141
+ console.log(_kolorist.yellow.call(void 0, "\n --remote is required for tunneling, localtunnel is not enabled.\n"));
142
+ }
143
+ lastRemoteUrl = printInfo(options, port, remote, tunnelUrl);
144
+ }
145
+ async function openTunnel(port2) {
146
+ const localtunnel = await Promise.resolve().then(() => require("localtunnel")).then((r) => r.default || r);
147
+ const tunnel2 = await localtunnel({
148
+ port: port2,
149
+ local_host: "0.0.0.0"
150
+ });
151
+ return tunnel2.url;
132
152
  }
133
153
  const SHORTCUTS = [
134
154
  {
@@ -151,6 +171,22 @@ cli.command(
151
171
  action() {
152
172
  _child_process.exec.call(void 0, `code "${entry}"`);
153
173
  }
174
+ },
175
+ {
176
+ name: "c",
177
+ fullname: "qrcode",
178
+ async action() {
179
+ if (!lastRemoteUrl)
180
+ return;
181
+ const { default: qrcode } = await Promise.resolve().then(() => require("qrcode-terminal"));
182
+ qrcode.generate(lastRemoteUrl, { small: true }, (v) => {
183
+ console.log(`
184
+ ${_kolorist.dim.call(void 0, " QR Code for remote control: ")}
185
+ ${_kolorist.blue.call(void 0, lastRemoteUrl)}
186
+ `);
187
+ console.log(v.split("\n").map((i) => ` ${i}`).join("\n"));
188
+ });
189
+ }
154
190
  }
155
191
  ];
156
192
  function bindShortcut() {
@@ -204,8 +240,8 @@ cli.command(
204
240
  }).strict().help(),
205
241
  async (args) => {
206
242
  const { entry, theme, watch, base, download, out, inspect } = args;
207
- const { build } = await Promise.resolve().then(() => require("./build-XQGKVESO.js"));
208
- const options = await _chunkIM22HCOOjs.resolveOptions.call(void 0, { entry, theme, inspect }, "build");
243
+ const { build } = await Promise.resolve().then(() => require("./build-E572SEEO.js"));
244
+ const options = await _chunkVR2CNJVJjs.resolveOptions.call(void 0, { entry, theme, inspect }, "build");
209
245
  if (download && !options.data.config.download)
210
246
  options.data.config.download = download;
211
247
  printInfo(options);
@@ -223,9 +259,9 @@ cli.command(
223
259
  "Format the markdown file",
224
260
  (args) => commonOptions(args).strict().help(),
225
261
  async ({ entry }) => {
226
- const data = await _chunkIM22HCOOjs.parser.load(entry);
227
- _chunkIM22HCOOjs.parser.prettify(data);
228
- await _chunkIM22HCOOjs.parser.save(data);
262
+ const data = await _chunkVR2CNJVJjs.parser.load(entry);
263
+ _chunkVR2CNJVJjs.parser.prettify(data);
264
+ await _chunkVR2CNJVJjs.parser.save(data);
229
265
  }
230
266
  );
231
267
  cli.command(
@@ -240,17 +276,17 @@ cli.command(
240
276
  default: "theme"
241
277
  }),
242
278
  async ({ entry, dir, theme: themeInput }) => {
243
- const data = await _chunkIM22HCOOjs.parser.load(entry);
244
- const theme = _chunkIM22HCOOjs.resolveThemeName.call(void 0, themeInput || data.config.theme);
279
+ const data = await _chunkVR2CNJVJjs.parser.load(entry);
280
+ const theme = _chunkVR2CNJVJjs.resolveThemeName.call(void 0, themeInput || data.config.theme);
245
281
  if (theme === "none") {
246
282
  console.error('Cannot eject theme "none"');
247
283
  process.exit(1);
248
284
  }
249
- if (_chunkIM22HCOOjs.isPath.call(void 0, theme)) {
285
+ if (_chunkVR2CNJVJjs.isPath.call(void 0, theme)) {
250
286
  console.error("Theme is already ejected");
251
287
  process.exit(1);
252
288
  }
253
- const roots = _chunkIM22HCOOjs.getThemeRoots.call(void 0, theme, entry);
289
+ const roots = _chunkVR2CNJVJjs.getThemeRoots.call(void 0, theme, entry);
254
290
  if (!roots.length) {
255
291
  console.error(`Could not find theme "${theme}"`);
256
292
  process.exit(1);
@@ -262,7 +298,7 @@ cli.command(
262
298
  const dirPath = `./${dir}`;
263
299
  data.slides[0].frontmatter.theme = dirPath;
264
300
  data.slides[0].raw = null;
265
- await _chunkIM22HCOOjs.parser.save(data);
301
+ await _chunkVR2CNJVJjs.parser.save(data);
266
302
  console.log(`Theme "${theme}" ejected successfully to "${dirPath}"`);
267
303
  }
268
304
  );
@@ -281,8 +317,8 @@ cli.command(
281
317
  process.env.NODE_ENV = "production";
282
318
  const { exportSlides, getExportOptions } = await Promise.resolve().then(() => require("./export-BRPXINGP.js"));
283
319
  const port = await findFreePort(12445);
284
- const options = await _chunkIM22HCOOjs.resolveOptions.call(void 0, { entry, theme }, "export");
285
- const server = await _chunkIM22HCOOjs.createServer.call(void 0,
320
+ const options = await _chunkVR2CNJVJjs.resolveOptions.call(void 0, { entry, theme }, "export");
321
+ const server = await _chunkVR2CNJVJjs.createServer.call(void 0,
286
322
  options,
287
323
  {
288
324
  server: { port },
@@ -291,7 +327,7 @@ cli.command(
291
327
  );
292
328
  await server.listen(port);
293
329
  printInfo(options);
294
- _chunkIM22HCOOjs.parser.filterDisabled(options.data);
330
+ _chunkVR2CNJVJjs.parser.filterDisabled(options.data);
295
331
  const output = await exportSlides({
296
332
  port,
297
333
  ...getExportOptions(args, options)
@@ -325,10 +361,10 @@ cli.command(
325
361
  process.env.NODE_ENV = "production";
326
362
  const { exportNotes } = await Promise.resolve().then(() => require("./export-BRPXINGP.js"));
327
363
  const port = await findFreePort(12445);
328
- const options = await _chunkIM22HCOOjs.resolveOptions.call(void 0, { entry }, "export");
364
+ const options = await _chunkVR2CNJVJjs.resolveOptions.call(void 0, { entry }, "export");
329
365
  if (!output)
330
366
  output = options.data.config.exportFilename ? `${options.data.config.exportFilename}-notes` : `${_path2.default.basename(entry, ".md")}-export-notes`;
331
- const server = await _chunkIM22HCOOjs.createServer.call(void 0,
367
+ const server = await _chunkVR2CNJVJjs.createServer.call(void 0,
332
368
  options,
333
369
  {
334
370
  server: { port },
@@ -337,7 +373,7 @@ cli.command(
337
373
  );
338
374
  await server.listen(port);
339
375
  printInfo(options);
340
- _chunkIM22HCOOjs.parser.filterDisabled(options.data);
376
+ _chunkVR2CNJVJjs.parser.filterDisabled(options.data);
341
377
  output = await exportNotes({
342
378
  port,
343
379
  output,
@@ -393,11 +429,11 @@ function exportOptions(args) {
393
429
  describe: "slide slides slide by slide. Works better with global components, but will break cross slide links and TOC in PDF"
394
430
  });
395
431
  }
396
- function printInfo(options, port, remote) {
432
+ function printInfo(options, port, remote, tunnelUrl) {
397
433
  console.log();
398
434
  console.log();
399
435
  console.log(` ${_kolorist.cyan.call(void 0, "\u25CF") + _kolorist.blue.call(void 0, "\u25A0") + _kolorist.yellow.call(void 0, "\u25B2")}`);
400
- console.log(`${_kolorist.bold.call(void 0, " Slidev")} ${_kolorist.blue.call(void 0, `v${_chunkIM22HCOOjs.version}`)} ${_isinstalledglobally2.default ? _kolorist.yellow.call(void 0, "(global)") : ""}`);
436
+ console.log(`${_kolorist.bold.call(void 0, " Slidev")} ${_kolorist.blue.call(void 0, `v${_chunkVR2CNJVJjs.version}`)} ${_isinstalledglobally2.default ? _kolorist.yellow.call(void 0, "(global)") : ""}`);
401
437
  console.log();
402
438
  console.log(_kolorist.dim.call(void 0, " theme ") + (options.theme ? _kolorist.green.call(void 0, options.theme) : _kolorist.gray.call(void 0, "none")));
403
439
  console.log(_kolorist.dim.call(void 0, " entry ") + _kolorist.dim.call(void 0, _path2.default.dirname(options.entry) + _path2.default.sep) + _path2.default.basename(options.entry));
@@ -411,17 +447,24 @@ function printInfo(options, port, remote) {
411
447
  console.log(`${_kolorist.dim.call(void 0, " presenter mode ")} > ${_kolorist.blue.call(void 0, `http://localhost:${_kolorist.bold.call(void 0, port)}${presenterPath}`)}`);
412
448
  if (options.inspect)
413
449
  console.log(`${_kolorist.dim.call(void 0, " inspector")} > ${_kolorist.yellow.call(void 0, `http://localhost:${_kolorist.bold.call(void 0, port)}/__inspect/`)}`);
450
+ let lastRemoteUrl = "";
414
451
  if (remote !== void 0) {
415
452
  Object.values(_os2.default.networkInterfaces()).forEach(
416
453
  (v) => (v || []).filter((details) => String(details.family).slice(-1) === "4" && !details.address.includes("127.0.0.1")).forEach(({ address }) => {
417
- console.log(`${_kolorist.dim.call(void 0, " remote control ")} > ${_kolorist.blue.call(void 0, `http://${address}:${port}${presenterPath}`)}`);
454
+ lastRemoteUrl = `http://${address}:${port}${presenterPath}`;
455
+ console.log(`${_kolorist.dim.call(void 0, " remote control ")} > ${_kolorist.blue.call(void 0, lastRemoteUrl)}`);
418
456
  })
419
457
  );
458
+ if (tunnelUrl) {
459
+ lastRemoteUrl = `${tunnelUrl}${presenterPath}`;
460
+ console.log(`${_kolorist.dim.call(void 0, " remote via tunnel")} > ${_kolorist.yellow.call(void 0, lastRemoteUrl)}`);
461
+ }
420
462
  } else {
421
463
  console.log(`${_kolorist.dim.call(void 0, " remote control ")} > ${_kolorist.dim.call(void 0, "pass --remote to enable")}`);
422
464
  }
423
465
  console.log();
424
- console.log(`${_kolorist.dim.call(void 0, " shortcuts ")} > ${_kolorist.underline.call(void 0, "r")}${_kolorist.dim.call(void 0, "estart | ")}${_kolorist.underline.call(void 0, "o")}${_kolorist.dim.call(void 0, "pen | ")}${_kolorist.underline.call(void 0, "e")}${_kolorist.dim.call(void 0, "dit")}`);
466
+ console.log(`${_kolorist.dim.call(void 0, " shortcuts ")} > ${_kolorist.underline.call(void 0, "r")}${_kolorist.dim.call(void 0, "estart | ")}${_kolorist.underline.call(void 0, "o")}${_kolorist.dim.call(void 0, "pen | ")}${_kolorist.underline.call(void 0, "e")}${_kolorist.dim.call(void 0, "dit")}${lastRemoteUrl ? ` | ${_kolorist.dim.call(void 0, "qr")}${_kolorist.underline.call(void 0, "c")}${_kolorist.dim.call(void 0, "ode")}` : ""}`);
467
+ return lastRemoteUrl;
425
468
  }
426
469
  console.log();
427
470
  _parser.verifyConfig.call(void 0, options.data.config, options.data.themeMeta, (v) => console.warn(_kolorist.yellow.call(void 0, ` ! ${v}`)));
package/dist/cli.mjs CHANGED
@@ -9,11 +9,11 @@ import {
9
9
  resolveOptions,
10
10
  resolveThemeName,
11
11
  version
12
- } from "./chunk-CRCTWL4B.mjs";
12
+ } from "./chunk-RFXDKP4A.mjs";
13
13
  import {
14
14
  loadSetups,
15
15
  require_fast_deep_equal
16
- } from "./chunk-36C7XM4S.mjs";
16
+ } from "./chunk-BBPMWYAE.mjs";
17
17
  import {
18
18
  __toESM
19
19
  } from "./chunk-VLEV37KF.mjs";
@@ -66,6 +66,10 @@ cli.command(
66
66
  }).option("remote", {
67
67
  type: "string",
68
68
  describe: "listen public host and enable remote control"
69
+ }).option("tunnel", {
70
+ default: false,
71
+ type: "boolean",
72
+ describe: "open localtunnel to make Slidev available on the internet"
69
73
  }).option("log", {
70
74
  default: "warn",
71
75
  type: "string",
@@ -81,7 +85,7 @@ cli.command(
81
85
  type: "boolean",
82
86
  describe: "force the optimizer to ignore the cache and re-bundle "
83
87
  }).strict().help(),
84
- async ({ entry, theme, port: userPort, open, log, remote, force, inspect }) => {
88
+ async ({ entry, theme, port: userPort, open, log, remote, tunnel, force, inspect }) => {
85
89
  if (!fs.existsSync(entry) && !entry.endsWith(".md"))
86
90
  entry = `${entry}.md`;
87
91
  if (!fs.existsSync(entry)) {
@@ -98,6 +102,7 @@ cli.command(
98
102
  }
99
103
  let server;
100
104
  let port = 3030;
105
+ let lastRemoteUrl;
101
106
  async function initServer() {
102
107
  if (server)
103
108
  await server.close();
@@ -128,7 +133,22 @@ cli.command(
128
133
  }
129
134
  );
130
135
  await server.listen();
131
- printInfo(options, port, remote);
136
+ let tunnelUrl = "";
137
+ if (tunnel) {
138
+ if (remote != null)
139
+ tunnelUrl = await openTunnel(port);
140
+ else
141
+ console.log(yellow("\n --remote is required for tunneling, localtunnel is not enabled.\n"));
142
+ }
143
+ lastRemoteUrl = printInfo(options, port, remote, tunnelUrl);
144
+ }
145
+ async function openTunnel(port2) {
146
+ const localtunnel = await import("localtunnel").then((r) => r.default || r);
147
+ const tunnel2 = await localtunnel({
148
+ port: port2,
149
+ local_host: "0.0.0.0"
150
+ });
151
+ return tunnel2.url;
132
152
  }
133
153
  const SHORTCUTS = [
134
154
  {
@@ -151,6 +171,22 @@ cli.command(
151
171
  action() {
152
172
  exec(`code "${entry}"`);
153
173
  }
174
+ },
175
+ {
176
+ name: "c",
177
+ fullname: "qrcode",
178
+ async action() {
179
+ if (!lastRemoteUrl)
180
+ return;
181
+ const { default: qrcode } = await import("qrcode-terminal");
182
+ qrcode.generate(lastRemoteUrl, { small: true }, (v) => {
183
+ console.log(`
184
+ ${dim(" QR Code for remote control: ")}
185
+ ${blue(lastRemoteUrl)}
186
+ `);
187
+ console.log(v.split("\n").map((i) => ` ${i}`).join("\n"));
188
+ });
189
+ }
154
190
  }
155
191
  ];
156
192
  function bindShortcut() {
@@ -204,7 +240,7 @@ cli.command(
204
240
  }).strict().help(),
205
241
  async (args) => {
206
242
  const { entry, theme, watch, base, download, out, inspect } = args;
207
- const { build } = await import("./build-LQUKCJTB.mjs");
243
+ const { build } = await import("./build-HZHWGNHW.mjs");
208
244
  const options = await resolveOptions({ entry, theme, inspect }, "build");
209
245
  if (download && !options.data.config.download)
210
246
  options.data.config.download = download;
@@ -393,7 +429,7 @@ function exportOptions(args) {
393
429
  describe: "slide slides slide by slide. Works better with global components, but will break cross slide links and TOC in PDF"
394
430
  });
395
431
  }
396
- function printInfo(options, port, remote) {
432
+ function printInfo(options, port, remote, tunnelUrl) {
397
433
  console.log();
398
434
  console.log();
399
435
  console.log(` ${cyan("\u25CF") + blue("\u25A0") + yellow("\u25B2")}`);
@@ -411,17 +447,24 @@ function printInfo(options, port, remote) {
411
447
  console.log(`${dim(" presenter mode ")} > ${blue(`http://localhost:${bold(port)}${presenterPath}`)}`);
412
448
  if (options.inspect)
413
449
  console.log(`${dim(" inspector")} > ${yellow(`http://localhost:${bold(port)}/__inspect/`)}`);
450
+ let lastRemoteUrl = "";
414
451
  if (remote !== void 0) {
415
452
  Object.values(os.networkInterfaces()).forEach(
416
453
  (v) => (v || []).filter((details) => String(details.family).slice(-1) === "4" && !details.address.includes("127.0.0.1")).forEach(({ address }) => {
417
- console.log(`${dim(" remote control ")} > ${blue(`http://${address}:${port}${presenterPath}`)}`);
454
+ lastRemoteUrl = `http://${address}:${port}${presenterPath}`;
455
+ console.log(`${dim(" remote control ")} > ${blue(lastRemoteUrl)}`);
418
456
  })
419
457
  );
458
+ if (tunnelUrl) {
459
+ lastRemoteUrl = `${tunnelUrl}${presenterPath}`;
460
+ console.log(`${dim(" remote via tunnel")} > ${yellow(lastRemoteUrl)}`);
461
+ }
420
462
  } else {
421
463
  console.log(`${dim(" remote control ")} > ${dim("pass --remote to enable")}`);
422
464
  }
423
465
  console.log();
424
- console.log(`${dim(" shortcuts ")} > ${underline("r")}${dim("estart | ")}${underline("o")}${dim("pen | ")}${underline("e")}${dim("dit")}`);
466
+ console.log(`${dim(" shortcuts ")} > ${underline("r")}${dim("estart | ")}${underline("o")}${dim("pen | ")}${underline("e")}${dim("dit")}${lastRemoteUrl ? ` | ${dim("qr")}${underline("c")}${dim("ode")}` : ""}`);
467
+ return lastRemoteUrl;
425
468
  }
426
469
  console.log();
427
470
  verifyConfig(options.data.config, options.data.themeMeta, (v) => console.warn(yellow(` ! ${v}`)));
package/dist/index.js CHANGED
@@ -9,11 +9,11 @@
9
9
 
10
10
 
11
11
 
12
- var _chunkIM22HCOOjs = require('./chunk-IM22HCOO.js');
12
+ var _chunkVR2CNJVJjs = require('./chunk-VR2CNJVJ.js');
13
13
 
14
14
 
15
15
 
16
- var _chunkDTAZRAWWjs = require('./chunk-DTAZRAWW.js');
16
+ var _chunk5WKTX26Wjs = require('./chunk-5WKTX26W.js');
17
17
  require('./chunk-UJ5GHVII.js');
18
18
 
19
19
 
@@ -28,4 +28,4 @@ require('./chunk-UJ5GHVII.js');
28
28
 
29
29
 
30
30
 
31
- exports.ViteSlidevPlugin = _chunkDTAZRAWWjs.ViteSlidevPlugin; exports.createServer = _chunkIM22HCOOjs.createServer; exports.createWindiCSSPlugin = _chunkDTAZRAWWjs.createWindiCSSPlugin; exports.getAddonRoots = _chunkIM22HCOOjs.getAddonRoots; exports.getCLIRoot = _chunkIM22HCOOjs.getCLIRoot; exports.getClientRoot = _chunkIM22HCOOjs.getClientRoot; exports.getRoot = _chunkIM22HCOOjs.getRoot; exports.getThemeRoots = _chunkIM22HCOOjs.getThemeRoots; exports.getUserRoot = _chunkIM22HCOOjs.getUserRoot; exports.isPath = _chunkIM22HCOOjs.isPath; exports.parser = _chunkIM22HCOOjs.parser; exports.resolveOptions = _chunkIM22HCOOjs.resolveOptions;
31
+ exports.ViteSlidevPlugin = _chunk5WKTX26Wjs.ViteSlidevPlugin; exports.createServer = _chunkVR2CNJVJjs.createServer; exports.createWindiCSSPlugin = _chunk5WKTX26Wjs.createWindiCSSPlugin; exports.getAddonRoots = _chunkVR2CNJVJjs.getAddonRoots; exports.getCLIRoot = _chunkVR2CNJVJjs.getCLIRoot; exports.getClientRoot = _chunkVR2CNJVJjs.getClientRoot; exports.getRoot = _chunkVR2CNJVJjs.getRoot; exports.getThemeRoots = _chunkVR2CNJVJjs.getThemeRoots; exports.getUserRoot = _chunkVR2CNJVJjs.getUserRoot; exports.isPath = _chunkVR2CNJVJjs.isPath; exports.parser = _chunkVR2CNJVJjs.parser; exports.resolveOptions = _chunkVR2CNJVJjs.resolveOptions;
package/dist/index.mjs CHANGED
@@ -9,11 +9,11 @@ import {
9
9
  isPath,
10
10
  parser,
11
11
  resolveOptions
12
- } from "./chunk-CRCTWL4B.mjs";
12
+ } from "./chunk-RFXDKP4A.mjs";
13
13
  import {
14
14
  ViteSlidevPlugin,
15
15
  createWindiCSSPlugin
16
- } from "./chunk-36C7XM4S.mjs";
16
+ } from "./chunk-BBPMWYAE.mjs";
17
17
  import "./chunk-VLEV37KF.mjs";
18
18
  export {
19
19
  ViteSlidevPlugin,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slidev/cli",
3
- "version": "0.39.0",
3
+ "version": "0.40.0",
4
4
  "description": "Presentation slides for developers",
5
5
  "author": "antfu <anthonyfu117@hotmail.com>",
6
6
  "license": "MIT",
@@ -63,7 +63,8 @@
63
63
  "jiti": "^1.16.2",
64
64
  "js-base64": "^3.7.4",
65
65
  "katex": "^0.16.4",
66
- "kolorist": "^1.6.0",
66
+ "kolorist": "^1.7.0",
67
+ "localtunnel": "^2.0.2",
67
68
  "markdown-it": "^13.0.1",
68
69
  "markdown-it-footnote": "^3.0.3",
69
70
  "markdown-it-link-attributes": "^4.0.1",
@@ -75,25 +76,26 @@
75
76
  "postcss-nested": "^6.0.0",
76
77
  "prismjs": "^1.29.0",
77
78
  "prompts": "^2.4.2",
79
+ "qrcode-terminal": "^0.12.0",
78
80
  "resolve": "^1.22.1",
79
81
  "resolve-from": "^5.0.0",
80
82
  "resolve-global": "^1.0.0",
81
- "shiki": "^0.13.0",
82
- "unocss": "^0.49.1",
83
+ "shiki": "^0.14.0",
84
+ "unocss": "^0.49.4",
83
85
  "unplugin-icons": "^0.15.2",
84
86
  "unplugin-vue-components": "^0.23.0",
85
- "vite": "^4.0.4",
87
+ "vite": "^4.1.1",
86
88
  "vite-plugin-inspect": "^0.7.15",
87
89
  "vite-plugin-remote-assets": "^0.3.0",
88
90
  "vite-plugin-vue-markdown": "^0.22.2",
89
91
  "vite-plugin-vue-server-ref": "^0.3.0",
90
92
  "vite-plugin-windicss": "^1.8.10",
91
- "vue": "^3.2.45",
93
+ "vue": "^3.2.47",
92
94
  "windicss": "^3.5.6",
93
95
  "yargs": "^17.6.2",
94
- "@slidev/client": "0.39.0",
95
- "@slidev/parser": "0.39.0",
96
- "@slidev/types": "0.39.0"
96
+ "@slidev/client": "0.40.0",
97
+ "@slidev/parser": "0.40.0",
98
+ "@slidev/types": "0.40.0"
97
99
  },
98
100
  "devDependencies": {
99
101
  "@types/plantuml-encoder": "^1.4.0",