on master help sign in
spin/scripts/codegen
50 lines 1.4 kB history raw
1#!/usr/bin/env node
3"use strict";
5const spinners = require("./spinners.json");
6const fs = require("fs");
7const path = require("path");
9const specsFile = path.resolve(__filename, "../../src/Spin/Specs.hs");
11const entries = Object.entries(spinners);
13const lines = [
14 "-- | This module contains specs for a number of default spinning indicators.",
15 "-- This file has been auto-generated using scripts/codegen. The specs",
16 "-- themselves have been copied from github.com/sindresorhus/cli-spinners.",
17 "module Spin.Specs",
18 ...(entries.length > 0
19 ? [
20 ` ( ${entries[0][0]}Spec`,
21 ...entries.slice(1).map(([name]) => ` , ${name}Spec`)
22 ]
23 : [" ("]),
24 " ) where",
25 "",
26 "import Spin.Types",
27 "",
28 ...entries.flatMap(([name, { interval, frames }]) => [
29 `-- | Spec for ${name} spinning indicator:`,
30 ...frames.map(frame => `-- ${frame}`),
31 `${name}Spec :: Spec`,
32 `${name}Spec = Spec`,
33 ` { specName = ${JSON.stringify(name)}`,
34 ` , specInterval = ${String(interval)}`,
35 ...(frames.length > 0
36 ? [
37 " , specFrames =",
38 ` [ ${JSON.stringify(frames[0])}`,
39 ...frames
40 .slice(1)
41 .map((frame, i) => ` , ${JSON.stringify(frame)}`),
42 " ]"
43 ]
44 : [" , specFrames = []"]),
45 " }",
46 ""
47 ])
48];
50fs.writeFileSync(specsFile, lines.join("\n"));