|
11 | 11 | system = "x86_64-linux";
|
12 | 12 | pkgs = import nixpkgs { inherit system; };
|
13 | 13 | package = builtins.fromJSON (builtins.readFile ./package.json);
|
14 |
| - in rec { |
15 |
| - |
16 |
| - lib.memoizeAssets = assets: |
17 |
| - pkgs.runCommandNoCC "nixos-styles-svg-assets" { |
18 |
| - nativeBuildInputs = with pkgs.nodePackages; [ |
19 |
| - svgo |
20 |
| - ]; |
21 |
| - } |
22 |
| - '' |
23 |
| - cp -r "${assets}" assets |
24 |
| - chmod -R +w assets |
25 |
| -
|
26 |
| - echo ":: Embedding SVG files" |
27 |
| - (cd assets |
28 |
| - # Skip the source svg files |
29 |
| - rm -f *.src.svg |
30 |
| -
|
31 |
| - # Optimize svg files |
32 |
| - for f in *.svg; do |
33 |
| - svgo $f & |
34 |
| - done |
35 |
| - # Wait until all `svgo` processes are done |
36 |
| - # According to light testing, it is twice as fast that way. |
37 |
| - wait |
38 |
| -
|
39 |
| - # Embed svg files in svg.less |
40 |
| - for f in *.svg; do |
41 |
| - echo "- $f" |
42 |
| - token=''${f^^} |
43 |
| - token=''${token//[^A-Z0-9]/_} |
44 |
| - token=SVG_''${token/%_SVG/} |
45 |
| - substituteInPlace svg.less --replace "@$token)" "'$(cat $f)')" |
46 |
| - substituteInPlace svg.less --replace "@$token," "'$(cat $f)'," |
47 |
| - done |
48 |
| - ) |
49 |
| - mv assets $out |
50 |
| - ''; |
51 |
| - |
52 |
| - defaultPackage."${system}" = packages."${system}".commonStyles; |
53 |
| - |
54 |
| - checks."${system}".build = defaultPackage."${system}"; |
55 |
| - |
56 |
| - packages."${system}" = rec { |
57 |
| - |
58 |
| - commonStyles = pkgs.stdenv.mkDerivation { |
59 |
| - name = "nixos-common-styles-${self.lastModifiedDate}"; |
60 |
| - |
61 |
| - src = self; |
62 |
| - |
63 |
| - enableParallelBuilding = true; |
64 |
| - |
65 |
| - installPhase = '' |
66 |
| - mkdir $out |
67 |
| - cp -R src/* $out/ |
68 |
| -
|
69 |
| - rm -rf $out/assets |
70 |
| - ln -sf ${lib.memoizeAssets ./src/assets} $out/assets |
71 |
| - ''; |
72 |
| - }; |
73 | 14 |
|
74 |
| - storyBookYarnPkg = pkgs.yarn2nix-moretea.mkYarnPackage rec { |
75 |
| - name = "${package.name}-yarn-${package.version}"; |
76 |
| - src = null; |
77 |
| - dontUnpack = true; |
78 |
| - packageJSON = ./package.json; |
79 |
| - yarnLock = ./yarn.lock; |
80 |
| - preConfigure = '' |
81 |
| - mkdir ${package.name} |
82 |
| - cd ${package.name} |
83 |
| - ln -s ${packageJSON} ./package.json |
84 |
| - ln -s ${yarnLock} ./yarn.lock |
85 |
| - ''; |
86 |
| - yarnPreBuild = '' |
87 |
| - mkdir -p $HOME/.node-gyp/${pkgs.nodejs.version} |
88 |
| - echo 9 > $HOME/.node-gyp/${pkgs.nodejs.version}/installVersion |
89 |
| - ln -sfv ${pkgs.nodejs}/include $HOME/.node-gyp/${pkgs.nodejs.version} |
| 15 | + commonStylesAssets = |
| 16 | + pkgs.runCommandNoCCLocal |
| 17 | + "nixos-common-styles-assets-${self.lastModifiedDate}" |
| 18 | + { nativeBuildInputs = [ flake.packages."${system}".embedSVG ]; |
| 19 | + src = ./src/assets; |
| 20 | + } |
| 21 | + '' |
| 22 | + echo $src |
| 23 | + mkdir -p ./assets |
| 24 | + cp $src/* ./assets |
| 25 | + chmod -R +w ./assets |
| 26 | + embed-svg ./assets $out |
90 | 27 | '';
|
91 |
| - publishBinsFor = |
92 |
| - [ |
93 |
| - "@storybook/html" |
94 |
| - ]; |
95 |
| - postInstall = '' |
96 |
| - # XXX: this is a hacky way to get things working |
97 |
| - # we need to upstream this fixes |
98 | 28 |
|
99 |
| - # node_modules is ready only |
100 |
| - sed -i -e "s|node_modules/.cache/storybook|.cache/storybook|" \ |
101 |
| - $out/libexec/${package.name}/node_modules/@storybook/core/dist/server/utils/resolve-path-in-sb-cache.js |
| 29 | + flake = { |
102 | 30 |
|
103 |
| - # copied favicon.ico is not writable |
104 |
| - sed -i -e 's|await (0, _cpy.default)(defaultFavIcon, outputDir);|await (0, _cpy.default)(defaultFavIcon, outputDir);_fsExtra.default.chmod(_path.default.join(outputDir, _path.default.basename(defaultFavIcon)), 0o200);|' \ |
105 |
| - $out/libexec/${package.name}/node_modules/@storybook/core/dist/server/build-static.js |
106 |
| - ''; |
107 |
| - }; |
| 31 | + defaultPackage."${system}" = flake.packages."${system}".commonStyles; |
108 | 32 |
|
109 |
| - storyBook = pkgs.stdenv.mkDerivation { |
110 |
| - name = "${package.name}-${package.version}"; |
111 |
| - src = pkgs.lib.cleanSource ./.; |
112 |
| - |
113 |
| - buildInputs = |
114 |
| - [ |
115 |
| - storyBookYarnPkg |
116 |
| - ] ++ |
117 |
| - (with pkgs; [ |
118 |
| - nodejs |
119 |
| - ]) ++ |
120 |
| - (with pkgs.nodePackages; [ |
121 |
| - yarn |
122 |
| - ]); |
123 |
| - |
124 |
| - patchPhase = '' |
125 |
| - rm -rf node_modules |
126 |
| - ln -sf ${storyBookYarnPkg}/libexec/${package.name}/node_modules . |
127 |
| - ''; |
| 33 | + checks."${system}".build = flake.defaultPackage."${system}"; |
128 | 34 |
|
129 |
| - buildPhase = '' |
130 |
| - # Yarn writes cache directories etc to $HOME. |
131 |
| - export HOME=$PWD/yarn_home |
132 |
| - yarn run build-storybook |
133 |
| - ''; |
| 35 | + packages."${system}" = rec { |
134 | 36 |
|
135 |
| - installPhase = '' |
136 |
| - mkdir -p $out |
137 |
| - cp -R ./storybook-static/* $out/ |
138 |
| - cp netlify.toml $out/ |
139 |
| - ''; |
| 37 | + embedSVG = pkgs.writeScriptBin "embed-svg" |
| 38 | + '' |
| 39 | + #!${pkgs.bash}/bin/bash |
140 | 40 |
|
141 |
| - shellHook = '' |
142 |
| - rm -rf node_modules |
143 |
| - ln -sf ${storyBookYarnPkg}/libexec/${package.name}/node_modules . |
144 |
| - export PATH=$PWD/node_modules/.bin:$PATH |
145 |
| - echo "======================================" |
146 |
| - echo "= To develop run: yarn run storybook =" |
147 |
| - echo "======================================" |
148 |
| - ''; |
149 |
| - }; |
| 41 | + in=$1 |
| 42 | + out=$2 |
| 43 | +
|
| 44 | + mkdir -p $in.tmp |
150 | 45 |
|
| 46 | + cp $in/*.svg $in.tmp/ |
| 47 | + rm -f $in.tmp/*.src.svg |
| 48 | +
|
| 49 | + echo ":: Optimizing svg files" |
| 50 | + for f in $in.tmp/*.svg; do |
| 51 | + echo ":: - $f" |
| 52 | + ${pkgs.nodePackages.svgo}/bin/svgo $f & |
| 53 | + done |
| 54 | + # Wait until all `svgo` processes are done |
| 55 | + # According to light testing, it is twice as fast that way. |
| 56 | + wait |
| 57 | +
|
| 58 | + echo ":: Embedding SVG files" |
| 59 | + source ${pkgs.stdenv}/setup |
| 60 | + ls -la $in |
| 61 | + cp $in/svg.less $out |
| 62 | + for f in $in.tmp/*.svg; do |
| 63 | + echo ":: - $f" |
| 64 | + token=$(basename $f) |
| 65 | + token=''${token^^} |
| 66 | + token=''${token//[^A-Z0-9]/_} |
| 67 | + token=SVG_''${token/%_SVG/} |
| 68 | + substituteInPlace $out --replace "@$token" "'$(cat $f)'" |
| 69 | + done |
| 70 | +
|
| 71 | + rm -rf $in.tmp |
| 72 | + ''; |
| 73 | + |
| 74 | + commonStyles = pkgs.stdenv.mkDerivation { |
| 75 | + name = "nixos-common-styles-${self.lastModifiedDate}"; |
| 76 | + |
| 77 | + src = self; |
| 78 | + |
| 79 | + enableParallelBuilding = true; |
| 80 | + |
| 81 | + buildInputs = [ |
| 82 | + embedSVG |
| 83 | + ]; |
| 84 | + |
| 85 | + installPhase = '' |
| 86 | + mkdir $out |
| 87 | + cp -R src/* $out/ |
| 88 | +
|
| 89 | + rm -rf $out/assets |
| 90 | + mkdir -v $out/assets |
| 91 | + cp ${commonStylesAssets} $out/assets/svg.less |
| 92 | + ''; |
| 93 | + }; |
| 94 | + |
| 95 | + storyBookYarnPkg = pkgs.yarn2nix-moretea.mkYarnPackage rec { |
| 96 | + name = "${package.name}-yarn-${package.version}"; |
| 97 | + src = null; |
| 98 | + dontUnpack = true; |
| 99 | + packageJSON = ./package.json; |
| 100 | + yarnLock = ./yarn.lock; |
| 101 | + preConfigure = '' |
| 102 | + mkdir ${package.name} |
| 103 | + cd ${package.name} |
| 104 | + ln -s ${packageJSON} ./package.json |
| 105 | + ln -s ${yarnLock} ./yarn.lock |
| 106 | + ''; |
| 107 | + yarnPreBuild = '' |
| 108 | + mkdir -p $HOME/.node-gyp/${pkgs.nodejs.version} |
| 109 | + echo 9 > $HOME/.node-gyp/${pkgs.nodejs.version}/installVersion |
| 110 | + ln -sfv ${pkgs.nodejs}/include $HOME/.node-gyp/${pkgs.nodejs.version} |
| 111 | + ''; |
| 112 | + publishBinsFor = |
| 113 | + [ |
| 114 | + "@storybook/html" |
| 115 | + ]; |
| 116 | + postInstall = '' |
| 117 | + # XXX: this is a hacky way to get things working |
| 118 | + # we need to upstream this fixes |
| 119 | +
|
| 120 | + # node_modules is ready only |
| 121 | + sed -i -e "s|node_modules/.cache/storybook|.cache/storybook|" \ |
| 122 | + $out/libexec/${package.name}/node_modules/@storybook/core/dist/server/utils/resolve-path-in-sb-cache.js |
| 123 | +
|
| 124 | + # copied favicon.ico is not writable |
| 125 | + sed -i -e 's|await (0, _cpy.default)(defaultFavIcon, outputDir);|await (0, _cpy.default)(defaultFavIcon, outputDir);_fsExtra.default.chmod(_path.default.join(outputDir, _path.default.basename(defaultFavIcon)), 0o200);|' \ |
| 126 | + $out/libexec/${package.name}/node_modules/@storybook/core/dist/server/build-static.js |
| 127 | + ''; |
| 128 | + }; |
| 129 | + |
| 130 | + storyBook = pkgs.stdenv.mkDerivation { |
| 131 | + name = "${package.name}-${package.version}"; |
| 132 | + src = pkgs.lib.cleanSource ./.; |
| 133 | + |
| 134 | + buildInputs = |
| 135 | + [ |
| 136 | + storyBookYarnPkg |
| 137 | + ] ++ |
| 138 | + (with pkgs; [ |
| 139 | + nodejs |
| 140 | + ]) ++ |
| 141 | + (with pkgs.nodePackages; [ |
| 142 | + yarn |
| 143 | + ]); |
| 144 | + |
| 145 | + patchPhase = '' |
| 146 | + rm -rf node_modules |
| 147 | + ln -sf ${storyBookYarnPkg}/libexec/${package.name}/node_modules . |
| 148 | + ''; |
| 149 | + |
| 150 | + buildPhase = '' |
| 151 | + # Yarn writes cache directories etc to $HOME. |
| 152 | + export HOME=$PWD/yarn_home |
| 153 | + yarn run build-storybook |
| 154 | + ''; |
| 155 | + |
| 156 | + installPhase = '' |
| 157 | + mkdir -p $out |
| 158 | + cp -R ./storybook-static/* $out/ |
| 159 | + cp netlify.toml $out/ |
| 160 | + ''; |
| 161 | + |
| 162 | + shellHook = '' |
| 163 | + rm -rf node_modules |
| 164 | + ln -sf ${storyBookYarnPkg}/libexec/${package.name}/node_modules . |
| 165 | + export PATH=$PWD/node_modules/.bin:$PATH |
| 166 | + echo "======================================" |
| 167 | + echo "= To develop run: yarn run storybook =" |
| 168 | + echo "======================================" |
| 169 | + ''; |
| 170 | + }; |
| 171 | + |
| 172 | + }; |
151 | 173 | };
|
152 |
| - }; |
| 174 | + |
| 175 | + in flake; |
153 | 176 | }
|
0 commit comments