@haibun/utils 1.53.1 → 1.54.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 +21 -7
- package/build/vcapture/index.d.ts.map +1 -0
- package/build/vcapture/index.js +138 -0
- package/build/vcapture/index.js.map +1 -0
- package/package.json +4 -9
- package/{walkthrough-container → vcapture}/Dockerfile +1 -1
- package/{walkthrough-container → vcapture}/capture-start.sh +1 -1
- package/{walkthrough-container → vcapture}/entrypoint.sh +1 -2
- package/build/generate-video.d.ts +0 -2
- package/build/generate-video.d.ts.map +0 -1
- package/build/generate-video.js +0 -155
- package/build/generate-video.js.map +0 -1
- package/build/walkthrough-container/index.d.ts.map +0 -1
- package/build/walkthrough-container/index.js +0 -111
- package/build/walkthrough-container/index.js.map +0 -1
- package/walkthrough-container/package-lock.json +0 -953
- /package/build/{walkthrough-container → vcapture}/index.d.ts +0 -0
- /package/{walkthrough-container → vcapture}/capture-stop.sh +0 -0
- /package/{walkthrough-container → vcapture}/docker-compose.yml +0 -0
- /package/{walkthrough-container → vcapture}/kokoro-speak.cjs +0 -0
- /package/{walkthrough-container → vcapture}/output.wav +0 -0
- /package/{walkthrough-container → vcapture}/package.json +0 -0
- /package/{walkthrough-container → vcapture}/speak-to-wav.sh +0 -0
package/README.md
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
# Scaffolding
|
|
3
2
|
|
|
4
3
|
You can scaffold Haibun into an existing or new project using `npx -p @haibun/utils scaffold`.
|
|
@@ -6,15 +5,30 @@ This will add the core library, Typescript and unit test support (if missing),
|
|
|
6
5
|
steppers, a placeholder library, and tests.
|
|
7
6
|
It won't overwrite existing files. It presumes a `src` folder for source files.
|
|
8
7
|
|
|
9
|
-
#
|
|
8
|
+
# Virtual capture
|
|
9
|
+
|
|
10
|
+
Audio/video virtualized captures (vcapture) can be added to projects using the `run-vcapture` command
|
|
11
|
+
with the following options:
|
|
12
|
+
|
|
13
|
+
[--recreate] [--tts] [--no-capture] [--help] [--res WxH] script filter features …folders
|
|
14
|
+
|
|
15
|
+
`script` is the package.json script to run for the script,
|
|
16
|
+
`filter` is the feature filter to use (or ""),
|
|
17
|
+
and `folders` is individual folders that need to be mounted in the container
|
|
18
|
+
to execute the tests (for example, `features assets`).
|
|
19
|
+
|
|
20
|
+
See [Haibun e2e tests](https://github.com/withhaibun/haibun-e2e-tests/blob/package.json) for an example.
|
|
21
|
+
|
|
22
|
+
This feature requires Docker Compose to be installed on the host system.
|
|
23
|
+
|
|
24
|
+
## Options
|
|
25
|
+
|
|
26
|
+
`--recreate`: Re-create the container
|
|
10
27
|
|
|
11
|
-
|
|
12
|
-
`"walkthrough": "run-walkthrough-container <test-script> <filter> <folders>"`.
|
|
28
|
+
`--tts`: uses local Kokoro text-to-speech.
|
|
13
29
|
|
|
14
30
|
Any prose lines in the tests, along with headings like "Scenario" will be spoken (using kokoro-tts).
|
|
15
31
|
|
|
16
|
-
|
|
32
|
+
Runtime options should be passed to package.json script commands using `-- --option`.
|
|
17
33
|
|
|
18
|
-
Where test-script is the package.json script to run for the script, filter is any filter ot use (or ""), and folders is folders that need to be mounted in the container to execute the tests (for example, `features files`).
|
|
19
34
|
|
|
20
|
-
`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vcapture/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { getPackageLocation } from '@haibun/core/build/lib/util/workspace-lib.js';
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
import { resolve } from 'path';
|
|
5
|
+
import { writeFileSync, unlinkSync, readFileSync, mkdirSync, existsSync } from 'fs';
|
|
6
|
+
import { tmpdir } from 'os';
|
|
7
|
+
import { HOST_PROJECT_DIR } from '@haibun/core/build/lib/defs.js';
|
|
8
|
+
process.on('unhandledRejection', (err) => {
|
|
9
|
+
console.error('cli Unhandled Rejection:', err);
|
|
10
|
+
if (err && err.stack) {
|
|
11
|
+
console.error(err.stack);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
console.error(err);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const runOptions = {
|
|
18
|
+
recreate: false,
|
|
19
|
+
tts: false,
|
|
20
|
+
capture: true,
|
|
21
|
+
res: '1280x1024',
|
|
22
|
+
};
|
|
23
|
+
const runContainer = (testToRun, filter, includeDirs = [], thisRunOptions) => {
|
|
24
|
+
try {
|
|
25
|
+
const utilDir = resolve(getPackageLocation(import.meta), '..', '..', 'vcapture');
|
|
26
|
+
const projectDir = process.cwd();
|
|
27
|
+
const tmpFile = resolve(tmpdir(), `docker-compose.override-${Date.now()}.yml`);
|
|
28
|
+
const envs = existsSync(`${projectDir}/.env`) ? readFileSync(`${projectDir}/.env`, 'utf8').split('\n').filter(l => l.length > 0) : [];
|
|
29
|
+
const haibunEnvc = (envs.length > 0) ? `HAIBUN_ENV=${envs.join(',')} ` : '';
|
|
30
|
+
const captureDir = resolve(projectDir, 'capture');
|
|
31
|
+
console.info('vcapture running with options:', thisRunOptions);
|
|
32
|
+
if (!existsSync(captureDir)) {
|
|
33
|
+
console.log('Creating capture directory');
|
|
34
|
+
mkdirSync(captureDir, { recursive: true });
|
|
35
|
+
}
|
|
36
|
+
const buildContextDir = resolve(tmpdir(), `build-context-${Date.now()}`);
|
|
37
|
+
mkdirSync(buildContextDir, { recursive: true });
|
|
38
|
+
execSync(`cp ${projectDir}/*.json ${buildContextDir}/`);
|
|
39
|
+
execSync(`cp ${utilDir}/*.sh ${utilDir}/kokoro-speak.cjs ${buildContextDir}/`);
|
|
40
|
+
const dirsToMount = [...includeDirs, 'capture'];
|
|
41
|
+
const composeVolumes = [
|
|
42
|
+
`${projectDir}/capture:/app/capture`,
|
|
43
|
+
`${projectDir}:/app/output`,
|
|
44
|
+
...dirsToMount.map(dir => `${resolve(projectDir, dir)}:/app/${dir}`)
|
|
45
|
+
];
|
|
46
|
+
const composeEnvironment = [
|
|
47
|
+
'DISPLAY=:99',
|
|
48
|
+
`RES=${thisRunOptions.res}`,
|
|
49
|
+
`${HOST_PROJECT_DIR}=${projectDir}`,
|
|
50
|
+
`COMMAND_TO_RECORD=${HOST_PROJECT_DIR}="${projectDir}" HAIBUN_LOG_LEVEL=log ${haibunEnvc} npm run ${testToRun} ${filter}`
|
|
51
|
+
];
|
|
52
|
+
if (thisRunOptions.tts) {
|
|
53
|
+
composeEnvironment.push('HAIBUN_O_HAIBUN_TTS_CMD=/app/speak-to-wav.sh @WHAT@', 'HAIBUN_O_HAIBUN_TTS_PLAY=aplay @WHAT@');
|
|
54
|
+
}
|
|
55
|
+
if (thisRunOptions.capture) {
|
|
56
|
+
composeEnvironment.push('HAIBUN_O_HAIBUN_CAPTURE_START=/app/capture-start.sh', 'HAIBUN_O_HAIBUN_CAPTURE_STOP=/app/capture-stop.sh');
|
|
57
|
+
}
|
|
58
|
+
const composeFile = `
|
|
59
|
+
services:
|
|
60
|
+
haibun-recorder:
|
|
61
|
+
build:
|
|
62
|
+
context: ${buildContextDir}
|
|
63
|
+
dockerfile: ${utilDir}/Dockerfile
|
|
64
|
+
volumes:
|
|
65
|
+
${asYamlOptions(composeVolumes)}
|
|
66
|
+
environment:
|
|
67
|
+
${(asYamlOptions(composeEnvironment))}
|
|
68
|
+
`;
|
|
69
|
+
writeFileSync(tmpFile, composeFile);
|
|
70
|
+
console.log(`Building then starting vcapture container using ${utilDir}`);
|
|
71
|
+
console.log(`Mounting directories:\n${composeVolumes}`);
|
|
72
|
+
try {
|
|
73
|
+
const cmd = `docker compose -f docker-compose.yml -f ${tmpFile} up ${thisRunOptions.recreate ? '--force-recreate --build' : ''}`;
|
|
74
|
+
console.log('building with:', cmd);
|
|
75
|
+
execSync(cmd, {
|
|
76
|
+
cwd: utilDir,
|
|
77
|
+
stdio: 'inherit',
|
|
78
|
+
env: {
|
|
79
|
+
...process.env,
|
|
80
|
+
CURRENT_DIR: projectDir,
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
unlinkSync(tmpFile);
|
|
86
|
+
execSync(`rm -rf ${buildContextDir}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
console.error('Error:', error.stderr?.toString() || error.message);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const args = process.argv.slice(2);
|
|
95
|
+
args.reduce((acc, arg) => {
|
|
96
|
+
if (arg.startsWith('--')) {
|
|
97
|
+
if (arg === '--recreate') {
|
|
98
|
+
runOptions.recreate = true;
|
|
99
|
+
return acc;
|
|
100
|
+
}
|
|
101
|
+
else if (arg === '--tts') {
|
|
102
|
+
runOptions.tts = true;
|
|
103
|
+
return acc;
|
|
104
|
+
}
|
|
105
|
+
else if (arg === '--no-capture') {
|
|
106
|
+
runOptions.capture = false;
|
|
107
|
+
return acc;
|
|
108
|
+
}
|
|
109
|
+
else if (arg === '--res') {
|
|
110
|
+
const res = args.shift();
|
|
111
|
+
if (res && res.match(/^\d+x\d+$/)) {
|
|
112
|
+
runOptions.res = res;
|
|
113
|
+
return acc;
|
|
114
|
+
}
|
|
115
|
+
console.error(`Missing or incorrect WxH value for --res: ${res}`);
|
|
116
|
+
printHelp();
|
|
117
|
+
}
|
|
118
|
+
else if (arg === '--help') {
|
|
119
|
+
printHelp(0);
|
|
120
|
+
}
|
|
121
|
+
console.error(`unknown -- arg ${arg}`);
|
|
122
|
+
printHelp();
|
|
123
|
+
}
|
|
124
|
+
return [...acc, arg];
|
|
125
|
+
}, []);
|
|
126
|
+
const [testToRun, filter, ...includeDirs] = args;
|
|
127
|
+
if (!testToRun || includeDirs.length === 0) {
|
|
128
|
+
printHelp();
|
|
129
|
+
}
|
|
130
|
+
runContainer(testToRun, filter, includeDirs, runOptions);
|
|
131
|
+
function printHelp(exitCode = 1) {
|
|
132
|
+
console.error(`Usage: ${process.argv[1]} [--recreate] [--tts] [--no-capture] [--help] [--res WxH] script filter features files ...`);
|
|
133
|
+
process.exit(exitCode);
|
|
134
|
+
}
|
|
135
|
+
function asYamlOptions(options) {
|
|
136
|
+
return options.map(o => ` - ${o}`).join('\n');
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vcapture/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,20 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haibun/utils",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.54.0",
|
|
5
5
|
"description": "",
|
|
6
6
|
"main": "index.js",
|
|
7
|
-
"files": [
|
|
8
|
-
"ref.package.json",
|
|
9
|
-
"build/**",
|
|
10
|
-
"scaffold/**",
|
|
11
|
-
"walkthrough-container/**"
|
|
12
|
-
],
|
|
7
|
+
"files": ["ref.package.json", "build/**", "scaffold/**", "vcapture/**"],
|
|
13
8
|
"bin": {
|
|
14
9
|
"scaffold": "build/scaffold/index.js",
|
|
15
10
|
"version": "build/version.js",
|
|
16
11
|
"link": "build/npm-link-haibuns.js",
|
|
17
|
-
"run-
|
|
12
|
+
"run-vcapture": "build/vcapture/index.js"
|
|
18
13
|
},
|
|
19
14
|
"scripts": {
|
|
20
15
|
"test": "vitest run",
|
|
@@ -27,5 +22,5 @@
|
|
|
27
22
|
"author": "",
|
|
28
23
|
"license": "ISC",
|
|
29
24
|
"gitHead": "7cf9680bd922fb622fb59f1e6bf5b65284cb8fd5",
|
|
30
|
-
"dependencies": { "@haibun/cli": "1.
|
|
25
|
+
"dependencies": { "@haibun/cli": "1.54.0", "@haibun/core": "1.54.0" }
|
|
31
26
|
}
|
|
@@ -39,7 +39,7 @@ WORKDIR /app
|
|
|
39
39
|
COPY package*.json kokoro-speak.cjs *.sh ./
|
|
40
40
|
RUN chmod +x *.sh
|
|
41
41
|
|
|
42
|
-
RUN npm i # && npm install kokoro-js
|
|
42
|
+
RUN npm i # && npm install kokoro-js # kokoro-js is installed on demand in capture-start.sh
|
|
43
43
|
|
|
44
44
|
RUN mkdir -p /run/user/1000 && chmod 700 /run/user/1000
|
|
45
45
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
LOGFILE=./output/container-setup.log
|
|
4
4
|
|
|
5
|
-
rm output/
|
|
5
|
+
rm output/vcapture.webm 2>/dev/null
|
|
6
6
|
|
|
7
7
|
echo "entrypoint is setting up the environment (logfile is $LOGFILE)"
|
|
8
8
|
{
|
|
@@ -54,7 +54,6 @@ echo "entrypoint is setting up the environment (logfile is $LOGFILE)"
|
|
|
54
54
|
|
|
55
55
|
echo "About to run $COMMAND_TO_RECORD"
|
|
56
56
|
eval "$COMMAND_TO_RECORD"
|
|
57
|
-
echo "created file://${HOST_PROJECT_DIR}/walkthrough.webm"
|
|
58
57
|
SLEEPTIME=2
|
|
59
58
|
echo "Waiting for $SLEEPTIME seconds."
|
|
60
59
|
sleep $SLEEPTIME
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-video.d.ts","sourceRoot":"","sources":["../src/generate-video.ts"],"names":[],"mappings":""}
|
package/build/generate-video.js
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { getMediafileDuration } from '@haibun/core/build/steps/lib/tts.js';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
const generateEditlyConfig = async (logEntries, outputPath, jitter, inputFilePath, title, endTitle) => {
|
|
4
|
-
// Get the base directory from the input file path to resolve relative paths
|
|
5
|
-
const basePath = inputFilePath.substring(0, inputFilePath.lastIndexOf('/') + 1);
|
|
6
|
-
console.log(`Base path for assets: ${basePath}`);
|
|
7
|
-
// Collect assets and find videoStart
|
|
8
|
-
const assets = { video: [], speech: [], featureStart: undefined };
|
|
9
|
-
for (const entry of logEntries) {
|
|
10
|
-
const startTime = entry.messageContext?.incidentDetails?.result?.actionResult?.start;
|
|
11
|
-
if (entry.messageContext?.artifact?.artifactType === 'video') {
|
|
12
|
-
const videoPath = entry.messageContext.artifact.path;
|
|
13
|
-
const resolvedPath = `${basePath}${videoPath}`;
|
|
14
|
-
if (!fs.existsSync(resolvedPath))
|
|
15
|
-
throw new Error(`Media file not found at ${resolvedPath}`);
|
|
16
|
-
assets.video.push({ type: 'video', path: resolvedPath, start: startTime, messageContext: entry.messageContext, metadata: entry.messageContext.artifact });
|
|
17
|
-
}
|
|
18
|
-
if (entry.messageContext?.artifact?.artifactType === 'speech') {
|
|
19
|
-
const speechPath = entry.messageContext.artifact.path;
|
|
20
|
-
const resolvedPath = `${basePath}${speechPath}`;
|
|
21
|
-
if (!fs.existsSync(resolvedPath))
|
|
22
|
-
throw new Error(`Media file not found at ${resolvedPath}`);
|
|
23
|
-
assets.speech.push({ type: 'speech', path: resolvedPath, start: startTime, messageContext: entry.messageContext, metadata: entry.messageContext.artifact });
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
// Extract featureStart from FEATURE_START's incidentDetails.startTime
|
|
27
|
-
const featureStartEntry = logEntries.find(e => e.messageContext?.incident === 'FEATURE_START' && e.messageContext?.incidentDetails?.startTime);
|
|
28
|
-
if (featureStartEntry) {
|
|
29
|
-
assets.featureStart = featureStartEntry.messageContext.incidentDetails.startTime;
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
throw new Error('No FEATURE_START with startTime found in log.');
|
|
33
|
-
}
|
|
34
|
-
const featureEndEntry = logEntries.find(e => e.messageContext?.incident === 'FEATURE_END' && e.messageContext?.incidentDetails?.totalTime);
|
|
35
|
-
const totalDuration = featureEndEntry.messageContext.incidentDetails.totalTime / 1000;
|
|
36
|
-
if (!featureEndEntry)
|
|
37
|
-
throw new Error('No FEATURE_END with totalTime found in log.');
|
|
38
|
-
if (assets.video.length === 0)
|
|
39
|
-
throw new Error('No video asset found.');
|
|
40
|
-
const mainVideoAsset = assets.video[0];
|
|
41
|
-
const videoFileDuration = await getMediafileDuration(mainVideoAsset.path);
|
|
42
|
-
const videoLayerStart = totalDuration - videoFileDuration;
|
|
43
|
-
const videoStartFromArtifact = logEntries.find(e => e.messageContext?.artifact?.artifactType === 'video/start').messageContext.artifact.start / 1000;
|
|
44
|
-
if (videoStartFromArtifact < 1)
|
|
45
|
-
throw new Error('No video start time found in log.');
|
|
46
|
-
console.info("\nAssets:");
|
|
47
|
-
console.info("video:", assets.video.map(v => ({ start: v.start, path: v.path })));
|
|
48
|
-
console.info("speech:", assets.speech.map(s => ({ start: s.start, path: s.path })));
|
|
49
|
-
console.info("featureStart", assets.featureStart);
|
|
50
|
-
console.info("totalDuration", totalDuration);
|
|
51
|
-
console.info("videoFileDuration", videoFileDuration);
|
|
52
|
-
console.info("videoLayerStart", videoLayerStart);
|
|
53
|
-
console.info('videoStartFromArtifact', videoStartFromArtifact);
|
|
54
|
-
// this is subject to wobble, videoLayerStart or videoStartFromArtifact are forays
|
|
55
|
-
const videoStart = videoStartFromArtifact + jitter;
|
|
56
|
-
const endSlideDuration = 2;
|
|
57
|
-
// Build layers for the single clip
|
|
58
|
-
const layers = [];
|
|
59
|
-
layers.push({
|
|
60
|
-
type: 'title',
|
|
61
|
-
text: title,
|
|
62
|
-
textColor: '#cccccc',
|
|
63
|
-
backgroundColor: '#222',
|
|
64
|
-
position: 'center',
|
|
65
|
-
start: 0,
|
|
66
|
-
duration: videoStart,
|
|
67
|
-
fadeIn: 0,
|
|
68
|
-
transition: null
|
|
69
|
-
});
|
|
70
|
-
for (const speech of assets.speech) {
|
|
71
|
-
layers.push({
|
|
72
|
-
type: 'detached-audio',
|
|
73
|
-
path: speech.path,
|
|
74
|
-
cutFrom: 0,
|
|
75
|
-
start: speech.start / 1000,
|
|
76
|
-
mixVolume: 100
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
layers.push({
|
|
80
|
-
type: 'video',
|
|
81
|
-
path: mainVideoAsset.path,
|
|
82
|
-
start: videoStart
|
|
83
|
-
});
|
|
84
|
-
// Add end slide
|
|
85
|
-
layers.push({
|
|
86
|
-
type: 'title',
|
|
87
|
-
text: endTitle,
|
|
88
|
-
textColor: '#cccccc',
|
|
89
|
-
backgroundColor: '#222',
|
|
90
|
-
position: 'center',
|
|
91
|
-
start: totalDuration,
|
|
92
|
-
duration: endSlideDuration,
|
|
93
|
-
fadeIn: 0,
|
|
94
|
-
transition: null
|
|
95
|
-
});
|
|
96
|
-
layers.sort((a, b) => (a.start ?? 0) - (b.start ?? 0));
|
|
97
|
-
const config = {
|
|
98
|
-
outPath: outputPath,
|
|
99
|
-
defaults: {
|
|
100
|
-
layer: {
|
|
101
|
-
// fontPath: "/usr/share/fonts/truetype/ubuntu/UbuntuSansMono[wght].ttf"
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
clips: [
|
|
105
|
-
{
|
|
106
|
-
duration: totalDuration + endSlideDuration,
|
|
107
|
-
layers
|
|
108
|
-
}
|
|
109
|
-
]
|
|
110
|
-
};
|
|
111
|
-
return config;
|
|
112
|
-
};
|
|
113
|
-
const main = async () => {
|
|
114
|
-
const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf-8'));
|
|
115
|
-
let jitter = -2;
|
|
116
|
-
const positional = [];
|
|
117
|
-
for (const arg of process.argv.slice(2)) {
|
|
118
|
-
if (arg.startsWith('--jitter=')) {
|
|
119
|
-
const val = arg.split('=')[1];
|
|
120
|
-
if (!isNaN(Number(val))) {
|
|
121
|
-
jitter = Number(val);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
throw new Error(`Invalid value for --jitter: ${val}`);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
positional.push(arg);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
if (positional.length < 3) {
|
|
132
|
-
console.error('Usage: node generate-video.js [--jitter=<n>] <inputFile> <outputFile> <configOutput> [title] [endTitle]');
|
|
133
|
-
process.exit(1);
|
|
134
|
-
}
|
|
135
|
-
const defaultTitle = packageJson?.description || packageJson?.name;
|
|
136
|
-
const defaultEndTitle = "End of test";
|
|
137
|
-
const [inputFile, outputFile, configOutput, title, endTitle] = positional;
|
|
138
|
-
console.info('Jitter:', jitter);
|
|
139
|
-
console.info(`Input file: ${inputFile}`);
|
|
140
|
-
console.info(`Output video file: ${outputFile}`);
|
|
141
|
-
console.info(`Config output: ${configOutput}`);
|
|
142
|
-
console.info('Title:', title);
|
|
143
|
-
console.info('End Title:', endTitle);
|
|
144
|
-
const logData = fs.readFileSync(inputFile, 'utf-8');
|
|
145
|
-
const logEntries = JSON.parse(logData);
|
|
146
|
-
console.log(`Loaded ${logEntries.length} log entries`);
|
|
147
|
-
const editlyConfig = await generateEditlyConfig(logEntries, outputFile, jitter, inputFile, title || defaultTitle, endTitle || defaultEndTitle);
|
|
148
|
-
fs.writeFileSync(configOutput, JSON.stringify(editlyConfig, null, 2));
|
|
149
|
-
console.info(`\nEditly config written to ${configOutput}`);
|
|
150
|
-
};
|
|
151
|
-
main().catch((error) => {
|
|
152
|
-
console.error('Error in main function:', error);
|
|
153
|
-
process.exit(1);
|
|
154
|
-
});
|
|
155
|
-
//# sourceMappingURL=generate-video.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-video.js","sourceRoot":"","sources":["../src/generate-video.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAezB,MAAM,oBAAoB,GAAG,KAAK,EAAE,UAAsB,EAAE,UAAkB,EAAE,MAAc,EAAE,aAAqB,EAAE,KAAa,EAAE,QAAgB,EAAsB,EAAE;IAC7K,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IAEjD,qCAAqC;IACrC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,EAAkB,EAAE,MAAM,EAAE,EAAkB,EAAE,YAAY,EAAE,SAAmB,EAAE,CAAC;IAC5G,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC;QACrF,IAAI,KAAK,CAAC,cAAc,EAAE,QAAQ,EAAE,YAAY,KAAK,OAAO,EAAE,CAAC;YAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;YACrD,MAAM,YAAY,GAAG,GAAG,QAAQ,GAAG,SAAS,EAAE,CAAC;YAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;YAC7F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3J,CAAC;QACD,IAAI,KAAK,CAAC,cAAc,EAAE,QAAQ,EAAE,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtD,MAAM,YAAY,GAAG,GAAG,QAAQ,GAAG,UAAU,EAAE,CAAC;YAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;YAC7F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7J,CAAC;IACF,CAAC;IACD,sEAAsE;IACtE,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,QAAQ,KAAK,eAAe,IAAI,CAAC,CAAC,cAAc,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IAC/I,IAAI,iBAAiB,EAAE,CAAC;QACvB,MAAM,CAAC,YAAY,GAAG,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC;IAClF,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,QAAQ,KAAK,aAAa,IAAI,CAAC,CAAC,cAAc,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IAC3I,MAAM,aAAa,GAAG,eAAe,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC;IAEtF,IAAI,CAAC,eAAe;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAErF,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEvC,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,cAAc,CAAC,IAAK,CAAC,CAAC;IAC3E,MAAM,eAAe,GAAG,aAAa,GAAG,iBAAiB,CAAC;IAC1D,MAAM,sBAAsB,GAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,QAAQ,EAAE,YAAY,KAAK,aAAa,CAAC,CAAC,cAAc,CAAC,QAAgC,CAAC,KAAK,GAAG,IAAI,CAAC;IAC9K,IAAI,sBAAsB,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAErF,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,sBAAsB,CAAC,CAAC;IAE/D,kFAAkF;IAClF,MAAM,UAAU,GAAG,sBAAsB,GAAG,MAAM,CAAC;IAEnD,MAAM,gBAAgB,GAAG,CAAC,CAAC;IAE3B,mCAAmC;IACnC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,SAAS;QACpB,eAAe,EAAE,MAAM;QACvB,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,CAAC;QACT,UAAU,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,IAAI;YAC1B,SAAS,EAAE,GAAG;SACd,CAAC,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,cAAc,CAAC,IAAI;QACzB,KAAK,EAAE,UAAU;KACjB,CAAC,CAAC;IACH,gBAAgB;IAChB,MAAM,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,SAAS;QACpB,eAAe,EAAE,MAAM;QACvB,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,CAAC;QACT,UAAU,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAc;QACzB,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE;YACT,KAAK,EAAE;YACN,wEAAwE;aACxE;SACD;QACD,KAAK,EAAE;YACN;gBACC,QAAQ,EAAE,aAAa,GAAG,gBAAgB;gBAC1C,MAAM;aACN;SACD;KACD,CAAC;IACF,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IACvB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3E,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;IAEhB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;YACvD,CAAC;QACF,CAAC;aAAM,CAAC;YACP,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,yGAAyG,CAAC,CAAC;QACzH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,EAAE,WAAW,IAAI,WAAW,EAAE,IAAI,CAAC;IACnE,MAAM,eAAe,GAAG,aAAa,CAAC;IAEtC,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC;IAE1E,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,kBAAkB,YAAY,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,UAAU,GAAe,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,UAAU,UAAU,CAAC,MAAM,cAAc,CAAC,CAAC;IAEvD,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,YAAY,EAAE,QAAQ,IAAI,eAAe,CAAC,CAAC;IAE/I,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEtE,OAAO,CAAC,IAAI,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/walkthrough-container/index.ts"],"names":[],"mappings":""}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { getPackageLocation } from '@haibun/core/build/lib/util/workspace-lib.js';
|
|
3
|
-
import { execSync } from 'child_process';
|
|
4
|
-
import { resolve } from 'path';
|
|
5
|
-
import { writeFileSync, unlinkSync, readFileSync, mkdirSync, existsSync } from 'fs';
|
|
6
|
-
import { tmpdir } from 'os';
|
|
7
|
-
import { HOST_PROJECT_DIR } from '@haibun/core/build/lib/defs.js';
|
|
8
|
-
process.on('unhandledRejection', (err) => {
|
|
9
|
-
console.error('cli Unhandled Rejection:', err);
|
|
10
|
-
if (err && err.stack) {
|
|
11
|
-
console.error(err.stack);
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
console.error(err);
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
const VIRTUAL_SCREEN_RESOLUTION = '1280x1024';
|
|
18
|
-
const runContainer = (testToRun, filter, includeDirs = [], recreate) => {
|
|
19
|
-
try {
|
|
20
|
-
const utilDir = resolve(getPackageLocation(import.meta), '..', '..', 'walkthrough-container');
|
|
21
|
-
const projectDir = process.cwd();
|
|
22
|
-
const tmpFile = resolve(tmpdir(), `docker-compose.override-${Date.now()}.yml`);
|
|
23
|
-
const envs = existsSync(`${projectDir}/.env`) ? readFileSync(`${projectDir}/.env`, 'utf8').split('\n').filter(l => l.length > 0) : [];
|
|
24
|
-
const haibunEnvc = (envs.length > 0) ? `HAIBUN_ENV=${envs.join(',')} ` : '';
|
|
25
|
-
// Ensure capture directory exists
|
|
26
|
-
const captureDir = resolve(projectDir, 'capture');
|
|
27
|
-
if (!existsSync(captureDir)) {
|
|
28
|
-
console.log('Creating capture directory');
|
|
29
|
-
mkdirSync(captureDir, { recursive: true });
|
|
30
|
-
}
|
|
31
|
-
// Add capture to directories to mount
|
|
32
|
-
const dirsToMount = [...includeDirs, 'capture'];
|
|
33
|
-
// Create docker compose config file with volumes
|
|
34
|
-
const volumeConfig = dirsToMount.map(dir => {
|
|
35
|
-
const sourcePath = resolve(projectDir, dir);
|
|
36
|
-
return ` - ${sourcePath}:/app/${dir}`;
|
|
37
|
-
}).join('\n');
|
|
38
|
-
const buildContextDir = resolve(tmpdir(), `build-context-${Date.now()}`);
|
|
39
|
-
mkdirSync(buildContextDir, { recursive: true });
|
|
40
|
-
// Copy project's json files to build context
|
|
41
|
-
execSync(`cp ${projectDir}/*.json ${buildContextDir}/`);
|
|
42
|
-
// Copy container files to build context
|
|
43
|
-
execSync(`cp ${utilDir}/*.sh ${utilDir}/kokoro-speak.cjs ${buildContextDir}/`);
|
|
44
|
-
const composeFile = `
|
|
45
|
-
services:
|
|
46
|
-
haibun-recorder:
|
|
47
|
-
build:
|
|
48
|
-
context: ${buildContextDir}
|
|
49
|
-
dockerfile: ${utilDir}/Dockerfile
|
|
50
|
-
volumes:
|
|
51
|
-
- ${projectDir}/capture:/app/capture
|
|
52
|
-
- ${projectDir}:/app/output
|
|
53
|
-
${volumeConfig}
|
|
54
|
-
environment:
|
|
55
|
-
- DISPLAY=:99
|
|
56
|
-
- RES=${VIRTUAL_SCREEN_RESOLUTION}
|
|
57
|
-
- HAIBUN_O_HAIBUN_TTS_CMD=/app/speak-to-wav.sh @WHAT@
|
|
58
|
-
- HAIBUN_O_HAIBUN_TTS_PLAY=aplay @WHAT@
|
|
59
|
-
- HAIBUN_O_HAIBUN_CAPTURE_START=/app/capture-start.sh
|
|
60
|
-
- HAIBUN_O_HAIBUN_CAPTURE_STOP=/app/capture-stop.sh
|
|
61
|
-
- ${HOST_PROJECT_DIR}=${projectDir}
|
|
62
|
-
- COMMAND_TO_RECORD=${HOST_PROJECT_DIR}="${projectDir}" HAIBUN_LOG_LEVEL=log ${haibunEnvc} npm run ${testToRun} ${filter}
|
|
63
|
-
`;
|
|
64
|
-
writeFileSync(tmpFile, composeFile);
|
|
65
|
-
console.log(`Building then starting walkthrough container using ${utilDir}`);
|
|
66
|
-
console.log(`Mounting directories:\n${volumeConfig}`);
|
|
67
|
-
try {
|
|
68
|
-
execSync(`docker compose -f docker-compose.yml -f ${tmpFile} up --build ${recreate ? '--force-recreate' : ''}`, {
|
|
69
|
-
cwd: utilDir,
|
|
70
|
-
stdio: 'inherit',
|
|
71
|
-
env: {
|
|
72
|
-
...process.env,
|
|
73
|
-
CURRENT_DIR: projectDir,
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
finally {
|
|
78
|
-
unlinkSync(tmpFile);
|
|
79
|
-
execSync(`rm -rf ${buildContextDir}`);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
console.error('Error:', error.stderr?.toString() || error.message);
|
|
84
|
-
process.exit(1);
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
let recreate = false;
|
|
88
|
-
const args = process.argv.slice(2).reduce((acc, arg) => {
|
|
89
|
-
if (arg.startsWith('--')) {
|
|
90
|
-
if (arg === '--recreate') {
|
|
91
|
-
recreate = true;
|
|
92
|
-
return acc;
|
|
93
|
-
}
|
|
94
|
-
console.error(`unknown -- arg ${arg}`);
|
|
95
|
-
printHelp();
|
|
96
|
-
}
|
|
97
|
-
else if (arg === '--help') {
|
|
98
|
-
printHelp();
|
|
99
|
-
}
|
|
100
|
-
return [...acc, arg];
|
|
101
|
-
}, []);
|
|
102
|
-
const [testToRun, filter, ...includeDirs] = args;
|
|
103
|
-
if (!testToRun || includeDirs.length === 0) {
|
|
104
|
-
printHelp();
|
|
105
|
-
}
|
|
106
|
-
runContainer(testToRun, filter, includeDirs, recreate);
|
|
107
|
-
function printHelp() {
|
|
108
|
-
console.error(`Usage: ${process.argv[1]} [--recreate] script filter features files ...`);
|
|
109
|
-
process.exit(1);
|
|
110
|
-
}
|
|
111
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/walkthrough-container/index.ts"],"names":[],"mappings":"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"}
|