@lessonkit/cli 1.2.0 → 1.3.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.
package/README.md CHANGED
@@ -32,7 +32,7 @@ lessonkit package --target scorm12 # LMS artifact
32
32
 
33
33
  Every project includes a root `lessonkit.json` manifest (`schemaVersion: 1`).
34
34
 
35
- Subprocess timeout defaults to **30 minutes** (`LESSONKIT_CMD_TIMEOUT_MS`; set `0` to disable).
35
+ Subprocess timeout defaults to **30 minutes** (`LESSONKIT_CMD_TIMEOUT_MS`). To disable the timeout, pass `timeoutMs: 0` in the exec API (the env var falls back to 30 minutes when set to `0` or omitted).
36
36
 
37
37
  ## Docs
38
38
 
package/dist/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/index.ts
4
- import { createRequire } from "module";
4
+ import { createRequire as createRequire2 } from "module";
5
5
  import { Command } from "commander";
6
6
 
7
7
  // src/commands/init.ts
@@ -62,7 +62,7 @@ function resolveCommandTimeoutMs(explicit) {
62
62
  const raw = process.env.LESSONKIT_CMD_TIMEOUT_MS;
63
63
  if (raw === void 0 || raw === "") return DEFAULT_CMD_TIMEOUT_MS;
64
64
  const parsed = Number(raw);
65
- if (!Number.isFinite(parsed) || parsed <= 0) return void 0;
65
+ if (!Number.isFinite(parsed) || parsed <= 0) return DEFAULT_CMD_TIMEOUT_MS;
66
66
  return parsed;
67
67
  }
68
68
  async function runCommand(command, args, opts) {
@@ -250,6 +250,7 @@ async function runInit(opts, logger) {
250
250
  // src/lib/project.ts
251
251
  import { readFileSync, existsSync as existsSync2 } from "fs";
252
252
  import { readFile as readFile2 } from "fs/promises";
253
+ import { createRequire } from "module";
253
254
  import { dirname as dirname2, join as join2, parse, resolve as resolve2 } from "path";
254
255
  import { parseLessonkitManifest } from "@lessonkit/lxpack";
255
256
  var LESSONKIT_JSON = "lessonkit.json";
@@ -372,14 +373,22 @@ function assertViteProject(pkg, projectRoot) {
372
373
  );
373
374
  }
374
375
  }
376
+ function projectDeclaresVite(pkg) {
377
+ return !!(pkg.devDependencies?.vite ?? pkg.dependencies?.vite);
378
+ }
375
379
  function resolveViteJs(projectRoot) {
376
- let dir = resolve2(projectRoot);
377
- const fsRoot = parse(dir).root;
378
- while (true) {
379
- const viteJs = join2(dir, "node_modules", "vite", "bin", "vite.js");
380
- if (existsSync2(viteJs)) return viteJs;
381
- if (dir === fsRoot) break;
382
- dir = dirname2(dir);
380
+ const root = resolve2(projectRoot);
381
+ const localViteJs = join2(root, "node_modules", "vite", "bin", "vite.js");
382
+ if (existsSync2(localViteJs)) return localViteJs;
383
+ try {
384
+ const pkg = JSON.parse(readFileSync(join2(root, PACKAGE_JSON), "utf8"));
385
+ if (projectDeclaresVite(pkg)) {
386
+ const req = createRequire(join2(root, "package.json"));
387
+ const vitePkg = req.resolve("vite/package.json");
388
+ const hoistedViteJs = join2(dirname2(vitePkg), "bin", "vite.js");
389
+ if (existsSync2(hoistedViteJs)) return hoistedViteJs;
390
+ }
391
+ } catch {
383
392
  }
384
393
  throw new CliError(
385
394
  `Vite not found near ${projectRoot}. Run npm install in the project first.`,
@@ -541,6 +550,17 @@ async function runPackage(opts) {
541
550
  issues: result.issues
542
551
  });
543
552
  }
553
+ const warnings = result.validation?.issues?.filter((issue) => {
554
+ const severity = issue.severity?.toLowerCase();
555
+ return severity !== "error" && severity !== "fatal";
556
+ });
557
+ if (warnings?.length && !opts.json) {
558
+ for (const issue of warnings) {
559
+ const location = issue.path ?? "course";
560
+ process.stderr.write(`[lessonkit] packaging warning: ${location}: ${issue.message}
561
+ `);
562
+ }
563
+ }
544
564
  return {
545
565
  ok: true,
546
566
  command: "package",
@@ -548,7 +568,8 @@ async function runPackage(opts) {
548
568
  projectRoot: project.root,
549
569
  outputPath: result.outputPath,
550
570
  outputDir: result.outputDir,
551
- fileCount: result.fileCount
571
+ fileCount: result.fileCount,
572
+ ...warnings?.length ? { warnings } : {}
552
573
  };
553
574
  }
554
575
 
@@ -566,7 +587,7 @@ function createLogger(opts) {
566
587
  }
567
588
 
568
589
  // src/index.ts
569
- var require2 = createRequire(import.meta.url);
590
+ var require2 = createRequire2(import.meta.url);
570
591
  var { version } = require2("../package.json");
571
592
  async function handleCommand(fn, logger, json) {
572
593
  try {
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/index.ts
2
- import { createRequire } from "module";
2
+ import { createRequire as createRequire2 } from "module";
3
3
  import { Command } from "commander";
4
4
 
5
5
  // src/commands/init.ts
@@ -60,7 +60,7 @@ function resolveCommandTimeoutMs(explicit) {
60
60
  const raw = process.env.LESSONKIT_CMD_TIMEOUT_MS;
61
61
  if (raw === void 0 || raw === "") return DEFAULT_CMD_TIMEOUT_MS;
62
62
  const parsed = Number(raw);
63
- if (!Number.isFinite(parsed) || parsed <= 0) return void 0;
63
+ if (!Number.isFinite(parsed) || parsed <= 0) return DEFAULT_CMD_TIMEOUT_MS;
64
64
  return parsed;
65
65
  }
66
66
  async function runCommand(command, args, opts) {
@@ -248,6 +248,7 @@ async function runInit(opts, logger) {
248
248
  // src/lib/project.ts
249
249
  import { readFileSync, existsSync as existsSync2 } from "fs";
250
250
  import { readFile as readFile2 } from "fs/promises";
251
+ import { createRequire } from "module";
251
252
  import { dirname as dirname2, join as join2, parse, resolve as resolve2 } from "path";
252
253
  import { parseLessonkitManifest } from "@lessonkit/lxpack";
253
254
  var LESSONKIT_JSON = "lessonkit.json";
@@ -370,14 +371,22 @@ function assertViteProject(pkg, projectRoot) {
370
371
  );
371
372
  }
372
373
  }
374
+ function projectDeclaresVite(pkg) {
375
+ return !!(pkg.devDependencies?.vite ?? pkg.dependencies?.vite);
376
+ }
373
377
  function resolveViteJs(projectRoot) {
374
- let dir = resolve2(projectRoot);
375
- const fsRoot = parse(dir).root;
376
- while (true) {
377
- const viteJs = join2(dir, "node_modules", "vite", "bin", "vite.js");
378
- if (existsSync2(viteJs)) return viteJs;
379
- if (dir === fsRoot) break;
380
- dir = dirname2(dir);
378
+ const root = resolve2(projectRoot);
379
+ const localViteJs = join2(root, "node_modules", "vite", "bin", "vite.js");
380
+ if (existsSync2(localViteJs)) return localViteJs;
381
+ try {
382
+ const pkg = JSON.parse(readFileSync(join2(root, PACKAGE_JSON), "utf8"));
383
+ if (projectDeclaresVite(pkg)) {
384
+ const req = createRequire(join2(root, "package.json"));
385
+ const vitePkg = req.resolve("vite/package.json");
386
+ const hoistedViteJs = join2(dirname2(vitePkg), "bin", "vite.js");
387
+ if (existsSync2(hoistedViteJs)) return hoistedViteJs;
388
+ }
389
+ } catch {
381
390
  }
382
391
  throw new CliError(
383
392
  `Vite not found near ${projectRoot}. Run npm install in the project first.`,
@@ -539,6 +548,17 @@ async function runPackage(opts) {
539
548
  issues: result.issues
540
549
  });
541
550
  }
551
+ const warnings = result.validation?.issues?.filter((issue) => {
552
+ const severity = issue.severity?.toLowerCase();
553
+ return severity !== "error" && severity !== "fatal";
554
+ });
555
+ if (warnings?.length && !opts.json) {
556
+ for (const issue of warnings) {
557
+ const location = issue.path ?? "course";
558
+ process.stderr.write(`[lessonkit] packaging warning: ${location}: ${issue.message}
559
+ `);
560
+ }
561
+ }
542
562
  return {
543
563
  ok: true,
544
564
  command: "package",
@@ -546,7 +566,8 @@ async function runPackage(opts) {
546
566
  projectRoot: project.root,
547
567
  outputPath: result.outputPath,
548
568
  outputDir: result.outputDir,
549
- fileCount: result.fileCount
569
+ fileCount: result.fileCount,
570
+ ...warnings?.length ? { warnings } : {}
550
571
  };
551
572
  }
552
573
 
@@ -564,7 +585,7 @@ function createLogger(opts) {
564
585
  }
565
586
 
566
587
  // src/index.ts
567
- var require2 = createRequire(import.meta.url);
588
+ var require2 = createRequire2(import.meta.url);
568
589
  var { version } = require2("../package.json");
569
590
  async function handleCommand(fn, logger, json) {
570
591
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lessonkit/cli",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "private": false,
5
5
  "description": "LessonKit CLI — init, dev, build, and package learning experiences.",
6
6
  "license": "Apache-2.0",
@@ -42,8 +42,8 @@
42
42
  "lint": "echo \"(no lint configured yet)\""
43
43
  },
44
44
  "dependencies": {
45
- "@lessonkit/core": "1.2.0",
46
- "@lessonkit/lxpack": "1.2.0",
45
+ "@lessonkit/core": "1.3.0",
46
+ "@lessonkit/lxpack": "1.3.0",
47
47
  "commander": "^14.0.1"
48
48
  },
49
49
  "engines": {
@@ -13,16 +13,16 @@
13
13
  "test:coverage": "vitest run --coverage --passWithNoTests=false"
14
14
  },
15
15
  "dependencies": {
16
- "@lessonkit/core": "^1.2.0",
17
- "@lessonkit/react": "^1.2.0",
18
- "@lessonkit/themes": "^1.2.0",
19
- "@lessonkit/xapi": "^1.2.0",
16
+ "@lessonkit/core": "^1.3.0",
17
+ "@lessonkit/react": "^1.3.0",
18
+ "@lessonkit/themes": "^1.3.0",
19
+ "@lessonkit/xapi": "^1.3.0",
20
20
  "react": "^18.3.1",
21
21
  "react-dom": "^18.3.1"
22
22
  },
23
23
  "devDependencies": {
24
- "@lessonkit/cli": "^1.2.0",
25
- "@lessonkit/lxpack": "^1.2.0",
24
+ "@lessonkit/cli": "^1.3.0",
25
+ "@lessonkit/lxpack": "^1.3.0",
26
26
  "@testing-library/react": "^16.3.0",
27
27
  "@types/react": "^18.3.23",
28
28
  "@types/react-dom": "^18.3.7",
@@ -30,6 +30,6 @@
30
30
  "jsdom": "^26.1.0",
31
31
  "typescript": "^5.8.3",
32
32
  "vite": "^7.1.3",
33
- "vitest": "^3.2.4"
33
+ "vitest": "^4.1.8"
34
34
  }
35
35
  }