@lessonkit/cli 1.2.0 → 1.3.1
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 +1 -1
- package/dist/bin.js +36 -12
- package/dist/index.js +36 -12
- package/package.json +3 -3
- package/template/vite-react/package.json +7 -7
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
|
|
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
|
|
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
|
-
|
|
377
|
-
const
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
if (
|
|
382
|
-
|
|
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.`,
|
|
@@ -457,7 +466,10 @@ async function runDev(opts) {
|
|
|
457
466
|
const pkg = await readPackageJson(project.root);
|
|
458
467
|
assertViteProject(pkg, project.root);
|
|
459
468
|
const viteJs = resolveViteJs(project.root);
|
|
460
|
-
await runCommand(process.execPath, [viteJs, ...opts.viteArgs ?? []], {
|
|
469
|
+
await runCommand(process.execPath, [viteJs, ...opts.viteArgs ?? []], {
|
|
470
|
+
cwd: project.root,
|
|
471
|
+
timeoutMs: 0
|
|
472
|
+
});
|
|
461
473
|
return { ok: true, command: "dev", projectRoot: project.root };
|
|
462
474
|
}
|
|
463
475
|
async function runBuild(opts) {
|
|
@@ -541,6 +553,17 @@ async function runPackage(opts) {
|
|
|
541
553
|
issues: result.issues
|
|
542
554
|
});
|
|
543
555
|
}
|
|
556
|
+
const warnings = result.validation?.issues?.filter((issue) => {
|
|
557
|
+
const severity = issue.severity?.toLowerCase();
|
|
558
|
+
return severity !== "error" && severity !== "fatal";
|
|
559
|
+
});
|
|
560
|
+
if (warnings?.length && !opts.json) {
|
|
561
|
+
for (const issue of warnings) {
|
|
562
|
+
const location = issue.path ?? "course";
|
|
563
|
+
process.stderr.write(`[lessonkit] packaging warning: ${location}: ${issue.message}
|
|
564
|
+
`);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
544
567
|
return {
|
|
545
568
|
ok: true,
|
|
546
569
|
command: "package",
|
|
@@ -548,7 +571,8 @@ async function runPackage(opts) {
|
|
|
548
571
|
projectRoot: project.root,
|
|
549
572
|
outputPath: result.outputPath,
|
|
550
573
|
outputDir: result.outputDir,
|
|
551
|
-
fileCount: result.fileCount
|
|
574
|
+
fileCount: result.fileCount,
|
|
575
|
+
...warnings?.length ? { warnings } : {}
|
|
552
576
|
};
|
|
553
577
|
}
|
|
554
578
|
|
|
@@ -566,7 +590,7 @@ function createLogger(opts) {
|
|
|
566
590
|
}
|
|
567
591
|
|
|
568
592
|
// src/index.ts
|
|
569
|
-
var require2 =
|
|
593
|
+
var require2 = createRequire2(import.meta.url);
|
|
570
594
|
var { version } = require2("../package.json");
|
|
571
595
|
async function handleCommand(fn, logger, json) {
|
|
572
596
|
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
|
|
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
|
-
|
|
375
|
-
const
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
if (
|
|
380
|
-
|
|
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.`,
|
|
@@ -455,7 +464,10 @@ async function runDev(opts) {
|
|
|
455
464
|
const pkg = await readPackageJson(project.root);
|
|
456
465
|
assertViteProject(pkg, project.root);
|
|
457
466
|
const viteJs = resolveViteJs(project.root);
|
|
458
|
-
await runCommand(process.execPath, [viteJs, ...opts.viteArgs ?? []], {
|
|
467
|
+
await runCommand(process.execPath, [viteJs, ...opts.viteArgs ?? []], {
|
|
468
|
+
cwd: project.root,
|
|
469
|
+
timeoutMs: 0
|
|
470
|
+
});
|
|
459
471
|
return { ok: true, command: "dev", projectRoot: project.root };
|
|
460
472
|
}
|
|
461
473
|
async function runBuild(opts) {
|
|
@@ -539,6 +551,17 @@ async function runPackage(opts) {
|
|
|
539
551
|
issues: result.issues
|
|
540
552
|
});
|
|
541
553
|
}
|
|
554
|
+
const warnings = result.validation?.issues?.filter((issue) => {
|
|
555
|
+
const severity = issue.severity?.toLowerCase();
|
|
556
|
+
return severity !== "error" && severity !== "fatal";
|
|
557
|
+
});
|
|
558
|
+
if (warnings?.length && !opts.json) {
|
|
559
|
+
for (const issue of warnings) {
|
|
560
|
+
const location = issue.path ?? "course";
|
|
561
|
+
process.stderr.write(`[lessonkit] packaging warning: ${location}: ${issue.message}
|
|
562
|
+
`);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
542
565
|
return {
|
|
543
566
|
ok: true,
|
|
544
567
|
command: "package",
|
|
@@ -546,7 +569,8 @@ async function runPackage(opts) {
|
|
|
546
569
|
projectRoot: project.root,
|
|
547
570
|
outputPath: result.outputPath,
|
|
548
571
|
outputDir: result.outputDir,
|
|
549
|
-
fileCount: result.fileCount
|
|
572
|
+
fileCount: result.fileCount,
|
|
573
|
+
...warnings?.length ? { warnings } : {}
|
|
550
574
|
};
|
|
551
575
|
}
|
|
552
576
|
|
|
@@ -564,7 +588,7 @@ function createLogger(opts) {
|
|
|
564
588
|
}
|
|
565
589
|
|
|
566
590
|
// src/index.ts
|
|
567
|
-
var require2 =
|
|
591
|
+
var require2 = createRequire2(import.meta.url);
|
|
568
592
|
var { version } = require2("../package.json");
|
|
569
593
|
async function handleCommand(fn, logger, json) {
|
|
570
594
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lessonkit/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
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.
|
|
46
|
-
"@lessonkit/lxpack": "1.
|
|
45
|
+
"@lessonkit/core": "1.3.1",
|
|
46
|
+
"@lessonkit/lxpack": "1.3.1",
|
|
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.
|
|
17
|
-
"@lessonkit/react": "^1.
|
|
18
|
-
"@lessonkit/themes": "^1.
|
|
19
|
-
"@lessonkit/xapi": "^1.
|
|
16
|
+
"@lessonkit/core": "^1.3.1",
|
|
17
|
+
"@lessonkit/react": "^1.3.1",
|
|
18
|
+
"@lessonkit/themes": "^1.3.1",
|
|
19
|
+
"@lessonkit/xapi": "^1.3.1",
|
|
20
20
|
"react": "^18.3.1",
|
|
21
21
|
"react-dom": "^18.3.1"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@lessonkit/cli": "^1.
|
|
25
|
-
"@lessonkit/lxpack": "^1.
|
|
24
|
+
"@lessonkit/cli": "^1.3.1",
|
|
25
|
+
"@lessonkit/lxpack": "^1.3.1",
|
|
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": "^
|
|
33
|
+
"vitest": "^4.1.8"
|
|
34
34
|
}
|
|
35
35
|
}
|