@hapticjs/cli 0.1.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/dist/index.d.ts +2 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/package.json +33 -0
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/preview.ts
|
|
4
|
+
import { parseHPL, compile, validateHPL } from "@hapticjs/core";
|
|
5
|
+
|
|
6
|
+
// src/utils/visualizer.ts
|
|
7
|
+
var BLOCK_CHARS = [" ", "\u2581", "\u2582", "\u2583", "\u2584", "\u2585", "\u2586", "\u2587", "\u2588"];
|
|
8
|
+
function visualize(steps) {
|
|
9
|
+
if (steps.length === 0) return " (empty pattern)";
|
|
10
|
+
const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);
|
|
11
|
+
const width = Math.min(60, Math.max(20, Math.floor(totalDuration / 10)));
|
|
12
|
+
const timeline = new Array(width).fill(0);
|
|
13
|
+
let currentMs = 0;
|
|
14
|
+
for (const step of steps) {
|
|
15
|
+
const startCol = Math.floor(currentMs / totalDuration * width);
|
|
16
|
+
const endCol = Math.floor((currentMs + step.duration) / totalDuration * width);
|
|
17
|
+
for (let col = startCol; col < endCol && col < width; col++) {
|
|
18
|
+
if (step.type === "vibrate") {
|
|
19
|
+
timeline[col] = Math.max(timeline[col], step.intensity);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
currentMs += step.duration;
|
|
23
|
+
}
|
|
24
|
+
const bars = timeline.map((intensity) => {
|
|
25
|
+
const idx = Math.round(intensity * (BLOCK_CHARS.length - 1));
|
|
26
|
+
return BLOCK_CHARS[idx];
|
|
27
|
+
});
|
|
28
|
+
const lines = [];
|
|
29
|
+
lines.push(` Timeline (${totalDuration}ms total):`);
|
|
30
|
+
lines.push("");
|
|
31
|
+
lines.push(` ${bars.join("")}`);
|
|
32
|
+
lines.push(` ${"0".padEnd(Math.floor(width / 2))}${Math.floor(totalDuration / 2)}ms${" ".repeat(Math.max(0, width - Math.floor(width / 2) - String(Math.floor(totalDuration / 2)).length - 2))}${totalDuration}ms`);
|
|
33
|
+
lines.push("");
|
|
34
|
+
lines.push(" Steps:");
|
|
35
|
+
for (const step of steps) {
|
|
36
|
+
if (step.type === "vibrate") {
|
|
37
|
+
const bar = BLOCK_CHARS[Math.round(step.intensity * (BLOCK_CHARS.length - 1))];
|
|
38
|
+
lines.push(` ${bar.repeat(3)} vibrate ${step.duration}ms @ ${Math.round(step.intensity * 100)}%`);
|
|
39
|
+
} else {
|
|
40
|
+
lines.push(` ... pause ${step.duration}ms`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return lines.join("\n");
|
|
44
|
+
}
|
|
45
|
+
function summarize(steps) {
|
|
46
|
+
const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);
|
|
47
|
+
const vibrations = steps.filter((s) => s.type === "vibrate");
|
|
48
|
+
const maxIntensity = Math.max(...vibrations.map((s) => s.intensity), 0);
|
|
49
|
+
const avgIntensity = vibrations.length > 0 ? vibrations.reduce((sum, s) => sum + s.intensity, 0) / vibrations.length : 0;
|
|
50
|
+
return `${totalDuration}ms | ${vibrations.length} pulses | avg ${Math.round(avgIntensity * 100)}% | peak ${Math.round(maxIntensity * 100)}%`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/commands/preview.ts
|
|
54
|
+
function preview(pattern) {
|
|
55
|
+
const validation = validateHPL(pattern);
|
|
56
|
+
if (!validation.valid) {
|
|
57
|
+
return `Error: Invalid pattern
|
|
58
|
+
${validation.errors.map((e) => ` - ${e}`).join("\n")}`;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const ast = parseHPL(pattern);
|
|
62
|
+
const steps = compile(ast);
|
|
63
|
+
return visualize(steps);
|
|
64
|
+
} catch (err) {
|
|
65
|
+
return `Error: ${err instanceof Error ? err.message : String(err)}`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// src/commands/validate.ts
|
|
70
|
+
import { validateHPL as validateHPL2, parseHPL as parseHPL2, compile as compile2 } from "@hapticjs/core";
|
|
71
|
+
function validate(pattern) {
|
|
72
|
+
const result = validateHPL2(pattern);
|
|
73
|
+
if (!result.valid) {
|
|
74
|
+
const lines = ["Invalid pattern:", ...result.errors.map((e) => ` - ${e}`)];
|
|
75
|
+
return lines.join("\n");
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const ast = parseHPL2(pattern);
|
|
79
|
+
const steps = compile2(ast);
|
|
80
|
+
return `Valid pattern: ${summarize(steps)}`;
|
|
81
|
+
} catch (err) {
|
|
82
|
+
return `Parse error: ${err instanceof Error ? err.message : String(err)}`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/commands/list.ts
|
|
87
|
+
import { presets } from "@hapticjs/core";
|
|
88
|
+
function list(category) {
|
|
89
|
+
const lines = [];
|
|
90
|
+
const categories = category ? { [category]: presets[category] } : presets;
|
|
91
|
+
for (const [catName, catPresets] of Object.entries(categories)) {
|
|
92
|
+
if (!catPresets) {
|
|
93
|
+
lines.push(`Unknown category: ${catName}`);
|
|
94
|
+
lines.push(`Available: ${Object.keys(presets).join(", ")}`);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
lines.push(`
|
|
98
|
+
${catName.toUpperCase()}`);
|
|
99
|
+
lines.push(` ${"\u2500".repeat(40)}`);
|
|
100
|
+
for (const [name, preset] of Object.entries(catPresets)) {
|
|
101
|
+
lines.push(` ${name.padEnd(20)} ${summarize(preset.steps)}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return lines.join("\n");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// src/index.ts
|
|
108
|
+
var args = process.argv.slice(2);
|
|
109
|
+
var command = args[0];
|
|
110
|
+
var arg = args.slice(1).join(" ");
|
|
111
|
+
var HELP = `
|
|
112
|
+
feelback \u2014 Haptic Pattern Language developer tools
|
|
113
|
+
|
|
114
|
+
Usage:
|
|
115
|
+
feelback preview <pattern> Visualize a haptic pattern
|
|
116
|
+
feelback validate <pattern> Validate an HPL pattern string
|
|
117
|
+
feelback list [category] List all available presets
|
|
118
|
+
feelback help Show this help
|
|
119
|
+
|
|
120
|
+
Pattern Language:
|
|
121
|
+
~ light vibrate (50ms, 30%)
|
|
122
|
+
# medium vibrate (50ms, 60%)
|
|
123
|
+
@ heavy vibrate (50ms, 100%)
|
|
124
|
+
. pause (50ms)
|
|
125
|
+
| sharp tap (10ms, 100%)
|
|
126
|
+
- sustain (extend previous by 50ms)
|
|
127
|
+
[] group
|
|
128
|
+
xN repeat N times
|
|
129
|
+
|
|
130
|
+
Examples:
|
|
131
|
+
feelback preview "~~..##..@@"
|
|
132
|
+
feelback preview "[|.]x3"
|
|
133
|
+
feelback validate "@--..~~"
|
|
134
|
+
feelback list gaming
|
|
135
|
+
`;
|
|
136
|
+
switch (command) {
|
|
137
|
+
case "preview":
|
|
138
|
+
if (!arg) {
|
|
139
|
+
console.log("Usage: feelback preview <pattern>");
|
|
140
|
+
console.log('Example: feelback preview "~~..##..@@"');
|
|
141
|
+
} else {
|
|
142
|
+
console.log(preview(arg));
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
case "validate":
|
|
146
|
+
if (!arg) {
|
|
147
|
+
console.log("Usage: feelback validate <pattern>");
|
|
148
|
+
} else {
|
|
149
|
+
console.log(validate(arg));
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
case "list":
|
|
153
|
+
console.log(list(arg || void 0));
|
|
154
|
+
break;
|
|
155
|
+
case "help":
|
|
156
|
+
case "--help":
|
|
157
|
+
case "-h":
|
|
158
|
+
case void 0:
|
|
159
|
+
console.log(HELP);
|
|
160
|
+
break;
|
|
161
|
+
default:
|
|
162
|
+
console.log(`Unknown command: ${command}`);
|
|
163
|
+
console.log('Run "feelback help" for usage information.');
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/preview.ts","../src/utils/visualizer.ts","../src/commands/validate.ts","../src/commands/list.ts","../src/index.ts"],"sourcesContent":["import { parseHPL, compile, validateHPL } from '@hapticjs/core';\nimport { visualize } from '../utils/visualizer';\n\nexport function preview(pattern: string): string {\n const validation = validateHPL(pattern);\n if (!validation.valid) {\n return `Error: Invalid pattern\\n${validation.errors.map((e) => ` - ${e}`).join('\\n')}`;\n }\n\n try {\n const ast = parseHPL(pattern);\n const steps = compile(ast);\n return visualize(steps);\n } catch (err) {\n return `Error: ${err instanceof Error ? err.message : String(err)}`;\n }\n}\n","import type { HapticStep } from '@hapticjs/core';\n\nconst BLOCK_CHARS = [' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n\n/**\n * Render an ASCII timeline visualization of a haptic pattern.\n */\nexport function visualize(steps: HapticStep[]): string {\n if (steps.length === 0) return ' (empty pattern)';\n\n const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);\n const width = Math.min(60, Math.max(20, Math.floor(totalDuration / 10)));\n\n // Build intensity timeline\n const timeline: number[] = new Array(width).fill(0);\n let currentMs = 0;\n\n for (const step of steps) {\n const startCol = Math.floor((currentMs / totalDuration) * width);\n const endCol = Math.floor(((currentMs + step.duration) / totalDuration) * width);\n\n for (let col = startCol; col < endCol && col < width; col++) {\n if (step.type === 'vibrate') {\n timeline[col] = Math.max(timeline[col]!, step.intensity);\n }\n }\n\n currentMs += step.duration;\n }\n\n // Render bars\n const bars = timeline.map((intensity) => {\n const idx = Math.round(intensity * (BLOCK_CHARS.length - 1));\n return BLOCK_CHARS[idx]!;\n });\n\n // Build output\n const lines: string[] = [];\n lines.push(` Timeline (${totalDuration}ms total):`);\n lines.push('');\n lines.push(` ${bars.join('')}`);\n lines.push(` ${'0'.padEnd(Math.floor(width / 2))}${Math.floor(totalDuration / 2)}ms${' '.repeat(Math.max(0, width - Math.floor(width / 2) - String(Math.floor(totalDuration / 2)).length - 2))}${totalDuration}ms`);\n\n // Step breakdown\n lines.push('');\n lines.push(' Steps:');\n for (const step of steps) {\n if (step.type === 'vibrate') {\n const bar = BLOCK_CHARS[Math.round(step.intensity * (BLOCK_CHARS.length - 1))]!;\n lines.push(` ${bar.repeat(3)} vibrate ${step.duration}ms @ ${Math.round(step.intensity * 100)}%`);\n } else {\n lines.push(` ... pause ${step.duration}ms`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Render a compact one-line summary of a pattern.\n */\nexport function summarize(steps: HapticStep[]): string {\n const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);\n const vibrations = steps.filter((s) => s.type === 'vibrate');\n const maxIntensity = Math.max(...vibrations.map((s) => s.intensity), 0);\n const avgIntensity = vibrations.length > 0\n ? vibrations.reduce((sum, s) => sum + s.intensity, 0) / vibrations.length\n : 0;\n\n return `${totalDuration}ms | ${vibrations.length} pulses | avg ${Math.round(avgIntensity * 100)}% | peak ${Math.round(maxIntensity * 100)}%`;\n}\n","import { validateHPL, parseHPL, compile } from '@hapticjs/core';\nimport { summarize } from '../utils/visualizer';\n\nexport function validate(pattern: string): string {\n const result = validateHPL(pattern);\n\n if (!result.valid) {\n const lines = ['Invalid pattern:', ...result.errors.map((e) => ` - ${e}`)];\n return lines.join('\\n');\n }\n\n try {\n const ast = parseHPL(pattern);\n const steps = compile(ast);\n return `Valid pattern: ${summarize(steps)}`;\n } catch (err) {\n return `Parse error: ${err instanceof Error ? err.message : String(err)}`;\n }\n}\n","import { presets } from '@hapticjs/core';\nimport { summarize } from '../utils/visualizer';\n\nexport function list(category?: string): string {\n const lines: string[] = [];\n\n const categories = category\n ? { [category]: (presets as Record<string, Record<string, { name: string; steps: Array<{ type: string; duration: number; intensity: number }> }>>)[category] }\n : presets;\n\n for (const [catName, catPresets] of Object.entries(categories)) {\n if (!catPresets) {\n lines.push(`Unknown category: ${catName}`);\n lines.push(`Available: ${Object.keys(presets).join(', ')}`);\n continue;\n }\n\n lines.push(`\\n ${catName.toUpperCase()}`);\n lines.push(` ${'─'.repeat(40)}`);\n\n for (const [name, preset] of Object.entries(catPresets as Record<string, { name: string; steps: Array<{ type: 'vibrate' | 'pause'; duration: number; intensity: number }> }>)) {\n lines.push(` ${name.padEnd(20)} ${summarize(preset.steps)}`);\n }\n }\n\n return lines.join('\\n');\n}\n","import { preview } from './commands/preview';\nimport { validate } from './commands/validate';\nimport { list } from './commands/list';\n\nconst args = process.argv.slice(2);\nconst command = args[0];\nconst arg = args.slice(1).join(' ');\n\nconst HELP = `\n feelback — Haptic Pattern Language developer tools\n\n Usage:\n feelback preview <pattern> Visualize a haptic pattern\n feelback validate <pattern> Validate an HPL pattern string\n feelback list [category] List all available presets\n feelback help Show this help\n\n Pattern Language:\n ~ light vibrate (50ms, 30%)\n # medium vibrate (50ms, 60%)\n @ heavy vibrate (50ms, 100%)\n . pause (50ms)\n | sharp tap (10ms, 100%)\n - sustain (extend previous by 50ms)\n [] group\n xN repeat N times\n\n Examples:\n feelback preview \"~~..##..@@\"\n feelback preview \"[|.]x3\"\n feelback validate \"@--..~~\"\n feelback list gaming\n`;\n\nswitch (command) {\n case 'preview':\n if (!arg) {\n console.log('Usage: feelback preview <pattern>');\n console.log('Example: feelback preview \"~~..##..@@\"');\n } else {\n console.log(preview(arg));\n }\n break;\n\n case 'validate':\n if (!arg) {\n console.log('Usage: feelback validate <pattern>');\n } else {\n console.log(validate(arg));\n }\n break;\n\n case 'list':\n console.log(list(arg || undefined));\n break;\n\n case 'help':\n case '--help':\n case '-h':\n case undefined:\n console.log(HELP);\n break;\n\n default:\n console.log(`Unknown command: ${command}`);\n console.log('Run \"feelback help\" for usage information.');\n break;\n}\n"],"mappings":";;;AAAA,SAAS,UAAU,SAAS,mBAAmB;;;ACE/C,IAAM,cAAc,CAAC,KAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAKzD,SAAS,UAAU,OAA6B;AACrD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,gBAAgB,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,UAAU,CAAC;AAClE,QAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,MAAM,gBAAgB,EAAE,CAAC,CAAC;AAGvE,QAAM,WAAqB,IAAI,MAAM,KAAK,EAAE,KAAK,CAAC;AAClD,MAAI,YAAY;AAEhB,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,KAAK,MAAO,YAAY,gBAAiB,KAAK;AAC/D,UAAM,SAAS,KAAK,OAAQ,YAAY,KAAK,YAAY,gBAAiB,KAAK;AAE/E,aAAS,MAAM,UAAU,MAAM,UAAU,MAAM,OAAO,OAAO;AAC3D,UAAI,KAAK,SAAS,WAAW;AAC3B,iBAAS,GAAG,IAAI,KAAK,IAAI,SAAS,GAAG,GAAI,KAAK,SAAS;AAAA,MACzD;AAAA,IACF;AAEA,iBAAa,KAAK;AAAA,EACpB;AAGA,QAAM,OAAO,SAAS,IAAI,CAAC,cAAc;AACvC,UAAM,MAAM,KAAK,MAAM,aAAa,YAAY,SAAS,EAAE;AAC3D,WAAO,YAAY,GAAG;AAAA,EACxB,CAAC;AAGD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,eAAe,aAAa,YAAY;AACnD,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,KAAK,KAAK,KAAK,EAAE,CAAC,EAAE;AAC/B,QAAM,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,gBAAgB,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,KAAK,MAAM,QAAQ,CAAC,IAAI,OAAO,KAAK,MAAM,gBAAgB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI;AAGnN,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,UAAU;AACrB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,WAAW;AAC3B,YAAM,MAAM,YAAY,KAAK,MAAM,KAAK,aAAa,YAAY,SAAS,EAAE,CAAC;AAC7E,YAAM,KAAK,OAAO,IAAI,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,QAAQ,KAAK,MAAM,KAAK,YAAY,GAAG,CAAC,GAAG;AAAA,IACrG,OAAO;AACL,YAAM,KAAK,iBAAiB,KAAK,QAAQ,IAAI;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,SAAS,UAAU,OAA6B;AACrD,QAAM,gBAAgB,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,UAAU,CAAC;AAClE,QAAM,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS;AAC3D,QAAM,eAAe,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,CAAC;AACtE,QAAM,eAAe,WAAW,SAAS,IACrC,WAAW,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,WAAW,CAAC,IAAI,WAAW,SACjE;AAEJ,SAAO,GAAG,aAAa,QAAQ,WAAW,MAAM,iBAAiB,KAAK,MAAM,eAAe,GAAG,CAAC,YAAY,KAAK,MAAM,eAAe,GAAG,CAAC;AAC3I;;;ADnEO,SAAS,QAAQ,SAAyB;AAC/C,QAAM,aAAa,YAAY,OAAO;AACtC,MAAI,CAAC,WAAW,OAAO;AACrB,WAAO;AAAA,EAA2B,WAAW,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EACvF;AAEA,MAAI;AACF,UAAM,MAAM,SAAS,OAAO;AAC5B,UAAM,QAAQ,QAAQ,GAAG;AACzB,WAAO,UAAU,KAAK;AAAA,EACxB,SAAS,KAAK;AACZ,WAAO,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EACnE;AACF;;;AEhBA,SAAS,eAAAA,cAAa,YAAAC,WAAU,WAAAC,gBAAe;AAGxC,SAAS,SAAS,SAAyB;AAChD,QAAM,SAASC,aAAY,OAAO;AAElC,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,QAAQ,CAAC,oBAAoB,GAAG,OAAO,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,CAAC;AAC1E,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,MAAI;AACF,UAAM,MAAMC,UAAS,OAAO;AAC5B,UAAM,QAAQC,SAAQ,GAAG;AACzB,WAAO,kBAAkB,UAAU,KAAK,CAAC;AAAA,EAC3C,SAAS,KAAK;AACZ,WAAO,gBAAgB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EACzE;AACF;;;AClBA,SAAS,eAAe;AAGjB,SAAS,KAAK,UAA2B;AAC9C,QAAM,QAAkB,CAAC;AAEzB,QAAM,aAAa,WACf,EAAE,CAAC,QAAQ,GAAI,QAAkI,QAAQ,EAAE,IAC3J;AAEJ,aAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC9D,QAAI,CAAC,YAAY;AACf,YAAM,KAAK,qBAAqB,OAAO,EAAE;AACzC,YAAM,KAAK,cAAc,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAC1D;AAAA,IACF;AAEA,UAAM,KAAK;AAAA,IAAO,QAAQ,YAAY,CAAC,EAAE;AACzC,UAAM,KAAK,KAAK,SAAI,OAAO,EAAE,CAAC,EAAE;AAEhC,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,UAAgI,GAAG;AAC7K,YAAM,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC,IAAI,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACtBA,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,UAAU,KAAK,CAAC;AACtB,IAAM,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG;AAElC,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Bb,QAAQ,SAAS;AAAA,EACf,KAAK;AACH,QAAI,CAAC,KAAK;AACR,cAAQ,IAAI,mCAAmC;AAC/C,cAAQ,IAAI,wCAAwC;AAAA,IACtD,OAAO;AACL,cAAQ,IAAI,QAAQ,GAAG,CAAC;AAAA,IAC1B;AACA;AAAA,EAEF,KAAK;AACH,QAAI,CAAC,KAAK;AACR,cAAQ,IAAI,oCAAoC;AAAA,IAClD,OAAO;AACL,cAAQ,IAAI,SAAS,GAAG,CAAC;AAAA,IAC3B;AACA;AAAA,EAEF,KAAK;AACH,YAAQ,IAAI,KAAK,OAAO,MAAS,CAAC;AAClC;AAAA,EAEF,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACH,YAAQ,IAAI,IAAI;AAChB;AAAA,EAEF;AACE,YAAQ,IAAI,oBAAoB,OAAO,EAAE;AACzC,YAAQ,IAAI,4CAA4C;AACxD;AACJ;","names":["validateHPL","parseHPL","compile","validateHPL","parseHPL","compile"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hapticjs/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Developer CLI for Feelback haptic engine — preview, test, and validate patterns",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"feelback": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@hapticjs/core": "0.1.0"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"haptics",
|
|
19
|
+
"cli",
|
|
20
|
+
"developer-tools",
|
|
21
|
+
"vibration"
|
|
22
|
+
],
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^25.5.0"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsup",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"typecheck": "tsc --noEmit",
|
|
31
|
+
"clean": "rm -rf dist"
|
|
32
|
+
}
|
|
33
|
+
}
|