Show More
The requested changes are too big and content was truncated. Show full diff
@@ -0,0 +1,15 b'' | |||||
|
1 | # This file has been generated by node2nix 1.0.0. Do not edit! | |||
|
2 | ||||
|
3 | {pkgs ? import <nixpkgs> { | |||
|
4 | inherit system; | |||
|
5 | }, system ? builtins.currentSystem}: | |||
|
6 | ||||
|
7 | let | |||
|
8 | nodeEnv = import ./node-env.nix { | |||
|
9 | inherit (pkgs) stdenv python utillinux runCommand writeTextFile nodejs; | |||
|
10 | }; | |||
|
11 | in | |||
|
12 | import ./node-packages.nix { | |||
|
13 | inherit (pkgs) fetchurl fetchgit; | |||
|
14 | inherit nodeEnv; | |||
|
15 | } No newline at end of file |
@@ -0,0 +1,292 b'' | |||||
|
1 | # This file originates from node2nix | |||
|
2 | ||||
|
3 | {stdenv, python, nodejs, utillinux, runCommand, writeTextFile}: | |||
|
4 | ||||
|
5 | let | |||
|
6 | # Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise | |||
|
7 | tarWrapper = runCommand "tarWrapper" {} '' | |||
|
8 | mkdir -p $out/bin | |||
|
9 | ||||
|
10 | cat > $out/bin/tar <<EOF | |||
|
11 | #! ${stdenv.shell} -e | |||
|
12 | $(type -p tar) "\$@" --warning=no-unknown-keyword | |||
|
13 | EOF | |||
|
14 | ||||
|
15 | chmod +x $out/bin/tar | |||
|
16 | ''; | |||
|
17 | ||||
|
18 | # Function that generates a TGZ file from a NPM project | |||
|
19 | buildNodeSourceDist = | |||
|
20 | { name, version, src, ... }: | |||
|
21 | ||||
|
22 | stdenv.mkDerivation { | |||
|
23 | name = "node-tarball-${name}-${version}"; | |||
|
24 | inherit src; | |||
|
25 | buildInputs = [ nodejs ]; | |||
|
26 | buildPhase = '' | |||
|
27 | export HOME=$TMPDIR | |||
|
28 | tgzFile=$(npm pack) | |||
|
29 | ''; | |||
|
30 | installPhase = '' | |||
|
31 | mkdir -p $out/tarballs | |||
|
32 | mv $tgzFile $out/tarballs | |||
|
33 | mkdir -p $out/nix-support | |||
|
34 | echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products | |||
|
35 | ''; | |||
|
36 | }; | |||
|
37 | ||||
|
38 | includeDependencies = {dependencies}: | |||
|
39 | stdenv.lib.optionalString (dependencies != []) | |||
|
40 | (stdenv.lib.concatMapStrings (dependency: | |||
|
41 | '' | |||
|
42 | # Bundle the dependencies of the package | |||
|
43 | mkdir -p node_modules | |||
|
44 | cd node_modules | |||
|
45 | ||||
|
46 | # Only include dependencies if they don't exist. They may also be bundled in the package. | |||
|
47 | if [ ! -e "${dependency.name}" ] | |||
|
48 | then | |||
|
49 | ${composePackage dependency} | |||
|
50 | fi | |||
|
51 | ||||
|
52 | cd .. | |||
|
53 | '' | |||
|
54 | ) dependencies); | |||
|
55 | ||||
|
56 | # Recursively composes the dependencies of a package | |||
|
57 | composePackage = { name, packageName, src, dependencies ? [], ... }@args: | |||
|
58 | let | |||
|
59 | fixImpureDependencies = writeTextFile { | |||
|
60 | name = "fixDependencies.js"; | |||
|
61 | text = '' | |||
|
62 | var fs = require('fs'); | |||
|
63 | var url = require('url'); | |||
|
64 | ||||
|
65 | /* | |||
|
66 | * Replaces an impure version specification by * | |||
|
67 | */ | |||
|
68 | function replaceImpureVersionSpec(versionSpec) { | |||
|
69 | var parsedUrl = url.parse(versionSpec); | |||
|
70 | ||||
|
71 | if(versionSpec == "latest" || versionSpec == "unstable" || | |||
|
72 | versionSpec.substr(0, 2) == ".." || dependency.substr(0, 2) == "./" || dependency.substr(0, 2) == "~/" || dependency.substr(0, 1) == '/') | |||
|
73 | return '*'; | |||
|
74 | else if(parsedUrl.protocol == "git:" || parsedUrl.protocol == "git+ssh:" || parsedUrl.protocol == "git+http:" || parsedUrl.protocol == "git+https:" || | |||
|
75 | parsedUrl.protocol == "http:" || parsedUrl.protocol == "https:") | |||
|
76 | return '*'; | |||
|
77 | else | |||
|
78 | return versionSpec; | |||
|
79 | } | |||
|
80 | ||||
|
81 | var packageObj = JSON.parse(fs.readFileSync('./package.json')); | |||
|
82 | ||||
|
83 | /* Replace dependencies */ | |||
|
84 | if(packageObj.dependencies !== undefined) { | |||
|
85 | for(var dependency in packageObj.dependencies) { | |||
|
86 | var versionSpec = packageObj.dependencies[dependency]; | |||
|
87 | packageObj.dependencies[dependency] = replaceImpureVersionSpec(versionSpec); | |||
|
88 | } | |||
|
89 | } | |||
|
90 | ||||
|
91 | /* Replace development dependencies */ | |||
|
92 | if(packageObj.devDependencies !== undefined) { | |||
|
93 | for(var dependency in packageObj.devDependencies) { | |||
|
94 | var versionSpec = packageObj.devDependencies[dependency]; | |||
|
95 | packageObj.devDependencies[dependency] = replaceImpureVersionSpec(versionSpec); | |||
|
96 | } | |||
|
97 | } | |||
|
98 | ||||
|
99 | /* Replace optional dependencies */ | |||
|
100 | if(packageObj.optionalDependencies !== undefined) { | |||
|
101 | for(var dependency in packageObj.optionalDependencies) { | |||
|
102 | var versionSpec = packageObj.optionalDependencies[dependency]; | |||
|
103 | packageObj.optionalDependencies[dependency] = replaceImpureVersionSpec(versionSpec); | |||
|
104 | } | |||
|
105 | } | |||
|
106 | ||||
|
107 | /* Write the fixed JSON file */ | |||
|
108 | fs.writeFileSync("package.json", JSON.stringify(packageObj)); | |||
|
109 | ''; | |||
|
110 | }; | |||
|
111 | in | |||
|
112 | '' | |||
|
113 | DIR=$(pwd) | |||
|
114 | cd $TMPDIR | |||
|
115 | ||||
|
116 | unpackFile ${src} | |||
|
117 | ||||
|
118 | # Make the base dir in which the target dependency resides first | |||
|
119 | mkdir -p "$(dirname "$DIR/${packageName}")" | |||
|
120 | ||||
|
121 | if [ -f "${src}" ] | |||
|
122 | then | |||
|
123 | # Figure out what directory has been unpacked | |||
|
124 | packageDir=$(find . -type d -maxdepth 1 | tail -1) | |||
|
125 | ||||
|
126 | # Restore write permissions to make building work | |||
|
127 | chmod -R u+w "$packageDir" | |||
|
128 | ||||
|
129 | # Move the extracted tarball into the output folder | |||
|
130 | mv "$packageDir" "$DIR/${packageName}" | |||
|
131 | elif [ -d "${src}" ] | |||
|
132 | then | |||
|
133 | # Restore write permissions to make building work | |||
|
134 | chmod -R u+w $strippedName | |||
|
135 | ||||
|
136 | # Move the extracted directory into the output folder | |||
|
137 | mv $strippedName "$DIR/${packageName}" | |||
|
138 | fi | |||
|
139 | ||||
|
140 | # Unset the stripped name to not confuse the next unpack step | |||
|
141 | unset strippedName | |||
|
142 | ||||
|
143 | # Some version specifiers (latest, unstable, URLs, file paths) force NPM to make remote connections or consult paths outside the Nix store. | |||
|
144 | # The following JavaScript replaces these by * to prevent that | |||
|
145 | cd "$DIR/${packageName}" | |||
|
146 | node ${fixImpureDependencies} | |||
|
147 | ||||
|
148 | # Include the dependencies of the package | |||
|
149 | ${includeDependencies { inherit dependencies; }} | |||
|
150 | cd .. | |||
|
151 | ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} | |||
|
152 | ''; | |||
|
153 | ||||
|
154 | # Extract the Node.js source code which is used to compile packages with | |||
|
155 | # native bindings | |||
|
156 | nodeSources = runCommand "node-sources" {} '' | |||
|
157 | tar --no-same-owner --no-same-permissions -xf ${nodejs.src} | |||
|
158 | mv node-* $out | |||
|
159 | ''; | |||
|
160 | ||||
|
161 | # Builds and composes an NPM package including all its dependencies | |||
|
162 | buildNodePackage = { name, packageName, version, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, preRebuild ? "", ... }@args: | |||
|
163 | ||||
|
164 | stdenv.lib.makeOverridable stdenv.mkDerivation (builtins.removeAttrs args [ "dependencies" ] // { | |||
|
165 | name = "node-${name}-${version}"; | |||
|
166 | buildInputs = [ tarWrapper python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ args.buildInputs or []; | |||
|
167 | dontStrip = args.dontStrip or true; # Striping may fail a build for some package deployments | |||
|
168 | ||||
|
169 | inherit dontNpmInstall preRebuild; | |||
|
170 | ||||
|
171 | unpackPhase = args.unpackPhase or "true"; | |||
|
172 | ||||
|
173 | buildPhase = args.buildPhase or "true"; | |||
|
174 | ||||
|
175 | compositionScript = composePackage args; | |||
|
176 | passAsFile = [ "compositionScript" ]; | |||
|
177 | ||||
|
178 | installPhase = args.installPhase or '' | |||
|
179 | # Create and enter a root node_modules/ folder | |||
|
180 | mkdir -p $out/lib/node_modules | |||
|
181 | cd $out/lib/node_modules | |||
|
182 | ||||
|
183 | # Compose the package and all its dependencies | |||
|
184 | source $compositionScriptPath | |||
|
185 | ||||
|
186 | # Patch the shebangs of the bundled modules to prevent them from | |||
|
187 | # calling executables outside the Nix store as much as possible | |||
|
188 | patchShebangs . | |||
|
189 | ||||
|
190 | # Deploy the Node.js package by running npm install. Since the | |||
|
191 | # dependencies have been provided already by ourselves, it should not | |||
|
192 | # attempt to install them again, which is good, because we want to make | |||
|
193 | # it Nix's responsibility. If it needs to install any dependencies | |||
|
194 | # anyway (e.g. because the dependency parameters are | |||
|
195 | # incomplete/incorrect), it fails. | |||
|
196 | # | |||
|
197 | # The other responsibilities of NPM are kept -- version checks, build | |||
|
198 | # steps, postprocessing etc. | |||
|
199 | ||||
|
200 | export HOME=$TMPDIR | |||
|
201 | cd "${packageName}" | |||
|
202 | runHook preRebuild | |||
|
203 | npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild | |||
|
204 | ||||
|
205 | if [ "$dontNpmInstall" != "1" ] | |||
|
206 | then | |||
|
207 | npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install | |||
|
208 | fi | |||
|
209 | ||||
|
210 | # Create symlink to the deployed executable folder, if applicable | |||
|
211 | if [ -d "$out/lib/node_modules/.bin" ] | |||
|
212 | then | |||
|
213 | ln -s $out/lib/node_modules/.bin $out/bin | |||
|
214 | fi | |||
|
215 | ||||
|
216 | # Create symlinks to the deployed manual page folders, if applicable | |||
|
217 | if [ -d "$out/lib/node_modules/${packageName}/man" ] | |||
|
218 | then | |||
|
219 | mkdir -p $out/share | |||
|
220 | for dir in "$out/lib/node_modules/${packageName}/man/"* | |||
|
221 | do | |||
|
222 | mkdir -p $out/share/man/$(basename "$dir") | |||
|
223 | for page in "$dir"/* | |||
|
224 | do | |||
|
225 | ln -s $page $out/share/man/$(basename "$dir") | |||
|
226 | done | |||
|
227 | done | |||
|
228 | fi | |||
|
229 | ''; | |||
|
230 | }); | |||
|
231 | ||||
|
232 | # Builds a development shell | |||
|
233 | buildNodeShell = { name, packageName, version, src, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, ... }@args: | |||
|
234 | let | |||
|
235 | nodeDependencies = stdenv.mkDerivation { | |||
|
236 | name = "node-dependencies-${name}-${version}"; | |||
|
237 | ||||
|
238 | buildInputs = [ tarWrapper python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ args.buildInputs or []; | |||
|
239 | ||||
|
240 | includeScript = includeDependencies { inherit dependencies; }; | |||
|
241 | passAsFile = [ "includeScript" ]; | |||
|
242 | ||||
|
243 | buildCommand = '' | |||
|
244 | mkdir -p $out/lib | |||
|
245 | cd $out/lib | |||
|
246 | source $includeScriptPath | |||
|
247 | ||||
|
248 | # Create fake package.json to make the npm commands work properly | |||
|
249 | cat > package.json <<EOF | |||
|
250 | { | |||
|
251 | "name": "${packageName}", | |||
|
252 | "version": "${version}" | |||
|
253 | } | |||
|
254 | EOF | |||
|
255 | ||||
|
256 | # Patch the shebangs of the bundled modules to prevent them from | |||
|
257 | # calling executables outside the Nix store as much as possible | |||
|
258 | patchShebangs . | |||
|
259 | ||||
|
260 | export HOME=$TMPDIR | |||
|
261 | npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild | |||
|
262 | ||||
|
263 | ${stdenv.lib.optionalString (!dontNpmInstall) '' | |||
|
264 | npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install | |||
|
265 | ''} | |||
|
266 | ||||
|
267 | ln -s $out/lib/node_modules/.bin $out/bin | |||
|
268 | ''; | |||
|
269 | }; | |||
|
270 | in | |||
|
271 | stdenv.lib.makeOverridable stdenv.mkDerivation { | |||
|
272 | name = "node-shell-${name}-${version}"; | |||
|
273 | ||||
|
274 | buildInputs = [ python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ args.buildInputs or []; | |||
|
275 | buildCommand = '' | |||
|
276 | mkdir -p $out/bin | |||
|
277 | cat > $out/bin/shell <<EOF | |||
|
278 | #! ${stdenv.shell} -e | |||
|
279 | $shellHook | |||
|
280 | exec ${stdenv.shell} | |||
|
281 | EOF | |||
|
282 | chmod +x $out/bin/shell | |||
|
283 | ''; | |||
|
284 | ||||
|
285 | # Provide the dependencies in a development shell through the NODE_PATH environment variable | |||
|
286 | inherit nodeDependencies; | |||
|
287 | shellHook = stdenv.lib.optionalString (dependencies != []) '' | |||
|
288 | export NODE_PATH=$nodeDependencies/lib/node_modules | |||
|
289 | ''; | |||
|
290 | }; | |||
|
291 | in | |||
|
292 | { inherit buildNodeSourceDist buildNodePackage buildNodeShell; } |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
General Comments 0
You need to be logged in to leave comments.
Login now