Advertisement
Guest User

Untitled

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