Skip to content

Commit

Permalink
feat(dat): support dat dependency as an experimental feature
Browse files Browse the repository at this point in the history
  • Loading branch information
watilde committed Aug 1, 2017
1 parent b2e0883 commit 7001781
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 2 deletions.
7 changes: 6 additions & 1 deletion lib/install/installer.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const mkdirp = require('mkdirp')
const path = require('path')
const nm = require('../utils/nm')
const bin = require('./installer/bin')
const dat = require('./installer/dat')
const git = require('./installer/git')
const local = require('./installer/local')
const remote = require('./installer/remote')
Expand All @@ -20,7 +21,12 @@ const installer = (dep, deps, base, resolve, reject) => {
const pkg = deps[dep]
var fetch

if (pkg.type === 'git') console.log('\n\n\n\n123\n\n\n\n')

switch (pkg.type) {
case 'dat':
fetch = dat(pkg, target)
break
case 'git':
fetch = git(pkg, target)
break
Expand All @@ -31,7 +37,6 @@ const installer = (dep, deps, base, resolve, reject) => {
fetch = local(pkg, target)
break
case 'registry':
default:
fetch = registry(pkg, target)
break
}
Expand Down
19 changes: 19 additions & 0 deletions lib/install/installer/dat.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const Dat = require('dat-node')

module.exports = (pkg, cwd) => {
return new Promise((resolve, reject) => {
Dat(cwd, {key: pkg.url, sparse: true}, function (e, dat) {
if (e) return reject(e)
dat.joinNetwork()
dat.archive.readFile('/package.json', function (e, content) {
if (e) {
dat.leaveNetwork()
reject(e)
}
if (!content || !content.toString()) return
dat.leaveNetwork()
resolve()
})
})
})
}
17 changes: 16 additions & 1 deletion lib/install/resolver/fetcher.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const npa = require('npm-package-arg')
const dat = require('./fetchers/dat')
const git = require('./fetchers/git')
const local = require('./fetchers/local')
const remote = require('./fetchers/remote')
Expand All @@ -7,11 +8,25 @@ const registry = require('./fetchers/registry')
module.exports = (name, spec) => {
var result
try {
result = npa.resolve(name, spec, process.cwd())
if (spec.startsWith('dat:')) {
result = {
type: 'dat',
fetchSpec: spec
}
} else {
result = npa.resolve(name, spec, process.cwd())
}
} catch (e) { throw new Error(e) }

switch (result.type) {
// type git
case 'dat':
process.stdout.write(
'Using dat as deps is an experimental feature.\n' +
'It could be changed at any time.\n\n'
)
return dat(name, result.fetchSpec, result)
// type git
case 'git':
return git(name, result.fetchSpec, result)
// type remote
Expand Down
31 changes: 31 additions & 0 deletions lib/install/resolver/fetchers/dat.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
const os = require('os')
const path = require('path')
const Dat = require('dat-node')

module.exports = (name, spec, result) => {
return new Promise((resolve, reject) => {
Dat(path.join(os.tmpdir(), encodeURIComponent(spec)), {key: spec, sparse: true}, function (e, dat) {
if (e) return reject(e)
dat.joinNetwork()
dat.archive.readFile('/package.json', function (e, content) {
if (e) {
dat.leaveNetwork()
reject(e)
}
if (!content) return
dat.leaveNetwork()
try {
const pkg = JSON.parse(content.toString())
resolve({
type: 'dat',
version: pkg.version,
dependencies: pkg.dependencies,
url: spec
})
} catch (e) {
reject(e)
}
})
})
})
}

0 comments on commit 7001781

Please sign in to comment.