Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
Message from discussion Dependency injection for Node.js. What do you think?

Received: by 10.224.177.12 with SMTP id bg12mr6296632qab.0.1343565897654;
        Sun, 29 Jul 2012 05:44:57 -0700 (PDT)
X-BeenThere: nodejs@googlegroups.com
Received: by 10.229.106.201 with SMTP id y9ls5332126qco.8.gmail; Sun, 29 Jul
 2012 05:44:35 -0700 (PDT)
Received: by 10.224.180.205 with SMTP id bv13mr6278306qab.8.1343565875869;
        Sun, 29 Jul 2012 05:44:35 -0700 (PDT)
Received: by 10.224.180.205 with SMTP id bv13mr6278305qab.8.1343565875832;
        Sun, 29 Jul 2012 05:44:35 -0700 (PDT)
Return-Path: <r...@vagg.org>
Received: from mail-qa0-f41.google.com (mail-qa0-f41.google.com [209.85.216.41])
        by gmr-mx.google.com with ESMTPS id g28si1285343qcq.2.2012.07.29.05.44.35
        (version=TLSv1/SSLv3 cipher=OTHER);
        Sun, 29 Jul 2012 05:44:35 -0700 (PDT)
Received-SPF: pass (google.com: domain of r...@vagg.org designates 209.85.216.41 as permitted sender) client-ip=209.85.216.41;
Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of r...@vagg.org designates 209.85.216.41 as permitted sender) smtp.mail=...@vagg.org
Received: by qabg27 with SMTP id g27so585266qab.0
        for <nodejs@googlegroups.com>; Sun, 29 Jul 2012 05:44:35 -0700 (PDT)
        d=google.com; s=20120113;
        h=mime-version:in-reply-to:references:from:date:message-id:subject:to
         :content-type:x-gm-message-state;
        bh=WLfWOAIDVGQbxfx6+4rBhxV5AEjN6gB7oZdpSOPtdRc=;
        b=K5IDpLX/Eh/t4cM9vZ/OoSwEqCay1ZsA9qYSzw72xcTlx1Fb+NTVOJWtPvXmPsFPiQ
         /c5AHovMEH/z8Xwk4g9eFv//dh02aS47U++S7cxeAvTCGaEXlV7s37m+sNJCe/BlsmNk
         maMXTcfyjqzYKvQxawnhvVyx7ZTr7XmW+v682mYDJYLKmV0F1JAER8lRD1FJyxRjCB8T
         VULdcmXtNsYn6i9xhp8FtYAFY11wnPM727mAIZS7EVjhUYCI8sfqTtAOhLtwQinBX4QS
         YP+q7jKcmtt4ddQSME2IJr4SC0FhS80Tk6NRyAqTGnpDRhSVWdKK8Bx1zste4X73aahk
         Y7OA==
Received: by 10.224.199.201 with SMTP id et9mr18359081qab.59.1343565875467;
 Sun, 29 Jul 2012 05:44:35 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.49.48.19 with HTTP; Sun, 29 Jul 2012 05:44:15 -0700 (PDT)
In-Reply-To: <CAMy9rDRns8Av8whL34tSezcMa2Hvh_7Z=YKM_sTU_o7_JAC...@mail.gmail.com>
References: <ef102c88-93e2-4fbe-b405-c9ba8c3ea5de@googlegroups.com>
 <CAMy9rDQa983En1e5u0=QFGPikv_J3=MMkZ5Lx+HdaeehyKm...@mail.gmail.com>
 <CAGEtHiKa=4MmyAkjT=CcQ7gC2+if8CGjt3uKVn12HOYERwd...@mail.gmail.com>
 <CAEG95pe8CjnEQMTwWkhZrHiqhv7OJf_ktheYC0QiKdYmK_U...@mail.gmail.com>
 <1428597985339663175@unknownmsgid> <CAHL2Ymoe8HOAKievE432utqtS5OOBcbo7g8hD56eQnf9YH0...@mail.gmail.com>
 <CAAPeUN=KqDXYroxA0iV4b-bFfXhsVG_nE2G-U-Z0Kdd1W82...@mail.gmail.com>
 <79fba4c7-c2fc-4f53-a486-0680dbb15235@googlegroups.com> <-6804855557930152104@unknownmsgid>
 <7a4232c0-b90d-46d1-bd05-a28d592ea1a3@googlegroups.com> <CAMy9rDRns8Av8whL34tSezcMa2Hvh_7Z=YKM_sTU_o7_JAC...@mail.gmail.com>
From: Rod Vagg <r...@vagg.org>
Date: Sun, 29 Jul 2012 22:44:15 +1000
Message-ID: <CAEdLpfhoFPkgecqaC-MfS_h5RKBtpQvNTViPxF8KguVzYiv...@mail.gmail.com>
Subject: Re: [nodejs] Dependency injection for Node.js. What do you think?
To: nodejs@googlegroups.com
Content-Type: multipart/alternative; boundary=20cf300fb103bd547b04c5f74ed2
X-Gm-Message-State: ALoCoQlXgUTZPBJz2G6bxx66rJLkN8hYYBkYffs0XL1iWl8M2ACU2yNRZneFuV5IdRJquRfIF4ic

--20cf300fb103bd547b04c5f74ed2
Content-Type: text/plain; charset=ISO-8859-1

On Sun, Jul 29, 2012 at 10:33 PM, Rob Ashton <robash...@codeofrob.com>wrote:


> On a side note I think we should be careful in this kind of conversation
> (if we're even going to have it) to separate the needs of testing, the
> needs of extensibility - and what we call dependency injection, dependency
> inversion and inversion of control containers.


+1

But, to go back to the discussion on testing, it seems that a lot of people
are unaware of how easy it is to mock modules in Node. Remember that
modules are cached by Node once loaded, so you can mess with them all you
like prior to calling the code that's going to use it (unless require.cache
is messed with afterwards)

You can take a module and throw Sinon at it and mock out all you need; a
technique I'm using extensively for unit tests to isolate just the
component I want. I find it particularly handy for 'fs' calls as they are
annoying to set up fixtures for and make a mess if actually executed.
Consider the following unit test in Ender that is only testing a small *
write* module that needs to take an object that will provide some source
text and write it to an appropriate location:
https://github.com/ender-js/Ender/blob/1.0-wip/test/unit/write-test.js --
the source object is mocked, as is 'fs', so the only active code is the
module being tested. The mocks are provided by Sinon which is built in to
the BusterJS test framework in this case (which is why they are initialised
with `this` and there is no explicit mock verify or clean up, it's all done
automatically). And note, these are mocks, not stubs, so they contain test
logic which must be conformed to.

Back to the issue of IoC/DI frameworks, here's a few more that may be worth
a look: http://microjs.com/#IOC

 -- Rod



>
>
>
> On Sun, Jul 29, 2012 at 2:12 PM, henry.osw...@sharelatex.com <
> henry.osw...@sharelatex.com> wrote:
>
>> The problem basically comes down to being able to mock/stub out the
>> require module system, I am yet to see a nice simple way of doing it (if
>> you have one please let me know!). This is solved in other languages like
>> C# which uses Dependency injection with a container but in ruby you don't
>> need to inject dependencies as its possible to directly mock things out (if
>> I remember correctly). So DI is not it is not necessarily the best
>> technique for javascript.
>>
>> @Oliver Leics that looks a bit like how node-sandboxed<https://github.com/felixge/node-sandboxed-module>
>>  works
>>
>> @Rob Ashton For a unit test I don't really want to be hitting an
>> external environment. A good example is if you make a http call to another
>> api, at the unit test level you just want to make sure you are hitting the
>> right url with the correct data. You can then write an integration test
>> against this api to make sure you know how it behaves.
>>
>>
>> On Saturday, July 28, 2012 10:26:59 AM UTC+1, Rob Ashton wrote:
>>>
>>> Well, I think if you're writing code against fs, you should test against
>>> fs
>>>
>>> If you want the rest of your tests to go fast, you should fake out the
>>> bit which uses fs, not fs itself
>>>
>>> Speaking in a general tone anyway, more context required for specific
>>> scenarios
>>>
>>> Sent from my iPhone
>>>
>>> On 28 Jul 2012, at 09:02, Eldar <eldar...@gmail.com> wrote:
>>>
>>> Thank you for pointing to Broadway.
>>>
>>> But yeah there are situations where hooks were not planed. For example:
>>>
>>> Once I tried to mock the file system. The goal were to define directory
>>> layout right in test. That's much more better and cleaner then having
>>> separate fixtures dir created by hand.  You have all information right were
>>> it used, you have instant understanding of what's going on, etc. But you
>>> can't mock file system if you need real IO right in the test and at the
>>> same time you are using third party! Anyway, even if you don't have such
>>> case, isn't it better to just use  "require" for things that semantically
>>> are nothing more then just a "require", rather then introduce  artificial
>>> hooks?
>>>
>>> That's the reason why I'd like such thing to be officially supported.
>>> Actually the title of the topic is wrong. I had in mind feedback
>>> for proposal.
>>>
>>> On Saturday, July 28, 2012 2:02:05 AM UTC+4, Marak Squires wrote:
>>>>
>>>> Yeah, that's pretty much the whole point of Broadway.
>>>>
>>>> I use Broadway a lot of "plugin systems". Essentially, where you are
>>>> requiring files as node.js modules, but you want programmatic hooks into
>>>> the initialization and attachment process of the module.
>>>>
>>>> On Fri, Jul 27, 2012 at 2:57 PM, Joshua Holbrook <
>>>> josh.holbr...@gmail.com> wrote:
>>>>
>>>>> You might like this, Eldar:
>>>>>
>>>>> https://github.com/flatiron/**broadway<https://github.com/flatiron/broadway>
>>>>>
>>>>> It gives you dependency injection and IoC. We use it a lot in
>>>>> flatiron, it's pretty sweet.
>>>>>
>>>>> --Josh
>>>>>
>>>>> On Fri, Jul 27, 2012 at 2:27 PM, Rob Ashton
>>>>> <robashtondevelo...@gmail.com> wrote:
>>>>> > Yeah, sorry
>>>>> >
>>>>> > Not a real developer, never worked on a real project, excuse me for
>>>>> my
>>>>> > ignorance.
>>>>> >
>>>>> > Lol jking
>>>>> >
>>>>> > Sigh
>>>>> >
>>>>> > Sent from my iPhone
>>>>> >
>>>>> > On 27 Jul 2012, at 20:33, Joe Developer <joe.d.develo...@gmail.com>
>>>>> wrote:
>>>>> >
>>>>> > Erm, outside of the amateur hour projects just such functionality
>>>>> exists:
>>>>> > http://blog.endpoint.com/2011/**02/locally-served-yui3.html<http://blog.endpoint.com/2011/02/locally-served-yui3.html>
>>>>> >
>>>>> > And yes, once you have had the pleasure of using it on non-trivial
>>>>> apps you
>>>>> > miss it dearly when dealing with the ad-hoc structured or 'good
>>>>> enough
>>>>> > rolled' alternatives.
>>>>> >
>>>>> > On Fri, Jul 27, 2012 at 11:47 PM, Martin Cooper <mfncoo...@gmail.com>
>>>>> wrote:
>>>>> >>
>>>>> >> On Fri, Jul 27, 2012 at 8:07 AM, Rob Ashton <
>>>>> robash...@codeofrob.com>
>>>>> >> wrote:
>>>>> >> > Do we need dependency injection in nodejs? Well - if you mean
>>>>> dependency
>>>>> >> > injection literally, we have it already, it looks like this
>>>>> >> >
>>>>> >> > function doSomething(dependency) {
>>>>> >> >
>>>>> >> > }
>>>>> >> >
>>>>> >> > doSomething(new FooDependency())
>>>>> >> >
>>>>> >> > or
>>>>> >> >
>>>>> >> > doSomething(new BarDependency())
>>>>> >> >
>>>>> >> > or
>>>>> >> >
>>>>> >> > var Animal = function(vocals) {
>>>>> >> >   this.vocals = vocals
>>>>> >> > }
>>>>> >> >
>>>>> >> > var cat = new Animal(miaow)
>>>>> >> > cat dog = new Animal(woof)
>>>>> >> >
>>>>> >> > etc
>>>>> >> >
>>>>> >> > ----------
>>>>> >> >
>>>>> >> > If you're talking about  'container' support to support this,
>>>>> it's a
>>>>> >> > road
>>>>> >> > that has been trodden well by .NET and Java devs, and has been
>>>>> shown
>>>>> >> > time
>>>>> >> > and time again to lead full circle to the very beginning where
>>>>> you just
>>>>> >> > build your object graphs manually and introduce extensibility
>>>>> points
>>>>> >> > where
>>>>> >> > you need them for either mocking out slow dependencies for
>>>>> testing or
>>>>> >> > allowing consumers to control something about your code.
>>>>> >> >
>>>>> >> > Trying to bake in support to this as part of the require system
>>>>> seems
>>>>> >> > like
>>>>> >> > asking for trouble, keep it explicit, keep it as needed and let
>>>>> the
>>>>> >> > goodness
>>>>> >> > follow.
>>>>> >>
>>>>> >> I agree with this. If you need dependency injection, design it into
>>>>> >> your system. Don't force it on unsuspecting modules.
>>>>> >>
>>>>> >> A couple of things that come to mind off the top of my head:
>>>>> >>
>>>>> >> * If I compel some module to use, say, 'my-funky-fs' instead of 'fs'
>>>>> >> without knowing it, will that cause *its* dependencies to have their
>>>>> >> usage of 'fs' replaced too? What if one of them was already
>>>>> replacing
>>>>> >> it with something of its own choosing, perhaps using a different
>>>>> >> mechanism (like maybe graceful-fs)?
>>>>> >>
>>>>> >> * If someone reports an issue with one of my packages, and I spend a
>>>>> >> bunch of my time debugging it, only to discover that the reporter
>>>>> >> replaced one of my dependencies with some other flaky substitute and
>>>>> >> that's the culprit, I'm not going to be happy about that. I design
>>>>> my
>>>>> >> packages to work with their declared dependencies, or I specifically
>>>>> >> design for dependency injection if it's needed.
>>>>> >>
>>>>> >> > My two cents.
>>>>> >>
>>>>> >> And mine. :)
>>>>> >>
>>>>> >> --
>>>>> >> Martin Cooper
>>>>> >>
>>>>> >>
>>>>> >> > On Fri, Jul 27, 2012 at 4:45 PM, Eldar <eldar...@gmail.com>
>>>>> wrote:
>>>>> >> >>
>>>>> >> >> Do we need this in Node?
>>>>> >> >>
>>>>> >> >> My answer is yes we need some (simple) way to specify the app
>>>>> level
>>>>> >> >> dependencies  at runtime. Here is my take on this. Please
>>>>> checkout and
>>>>> >> >> let
>>>>> >> >> me know how do you feel about.
>>>>> >> >>
>>>>> >> >> But the idea is very simple:
>>>>> >> >>
>>>>> >> >>
>>>>> >> >> // inside any index.js
>>>>> >> >> var R = require('runtime').**patchNative()
>>>>> >> >> var use = R(module).use
>>>>> >> >>
>>>>> >> >> use('fs', 'node_modules/third/party', require('./smart-fs'))
>>>>> >> >>
>>>>> >> >> That's it. Third party module just uses our smart file system
>>>>> >> >>
>>>>> >> >> --
>>>>> >> >> Job Board: http://jobs.nodejs.org/
>>>>> >> >> Posting guidelines:
>>>>> >> >> https://github.com/joyent/**node/wiki/Mailing-List-**
>>>>> Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>>> >> >> You received this message because you are subscribed to the
>>>>> Google
>>>>> >> >> Groups "nodejs" group.
>>>>> >> >> To post to this group, send email to nodejs@googlegroups.com
>>>>> >> >> To unsubscribe from this group, send email to
>>>>> >> >> nodejs+unsubscribe@**googlegroups.com<nodejs%2Bunsubscribe@googlegroups.com>
>>>>> >> >> For more options, visit this group at
>>>>> >> >> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>> >> >
>>>>> >> >
>>>>> >> > --
>>>>> >> > Job Board: http://jobs.nodejs.org/
>>>>> >> > Posting guidelines:
>>>>> >> > https://github.com/joyent/**node/wiki/Mailing-List-**
>>>>> Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>>> >> > You received this message because you are subscribed to the Google
>>>>> >> > Groups "nodejs" group.
>>>>> >> > To post to this group, send email to nodejs@googlegroups.com
>>>>> >> > To unsubscribe from this group, send email to
>>>>> >> > nodejs+unsubscribe@**googlegroups.com<nodejs%2Bunsubscribe@googlegroups.com>
>>>>> >> > For more options, visit this group at
>>>>> >> > http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>> >>
>>>>> >> --
>>>>> >> Job Board: http://jobs.nodejs.org/
>>>>> >> Posting guidelines:
>>>>> >> https://github.com/joyent/**node/wiki/Mailing-List-**
>>>>> Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>>> >> You received this message because you are subscribed to the Google
>>>>> >> Groups "nodejs" group.
>>>>> >> To post to this group, send email to nodejs@googlegroups.com
>>>>> >> To unsubscribe from this group, send email to
>>>>> >> nodejs+unsubscribe@**googlegroups.com<nodejs%2Bunsubscribe@googlegroups.com>
>>>>> >> For more options, visit this group at
>>>>> >> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>> >
>>>>> >
>>>>> > --
>>>>> > Job Board: http://jobs.nodejs.org/
>>>>> > Posting guidelines:
>>>>> > https://github.com/joyent/**node/wiki/Mailing-List-**
>>>>> Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>>> > You received this message because you are subscribed to the Google
>>>>> > Groups "nodejs" group.
>>>>> > To post to this group, send email to nodejs@googlegroups.com
>>>>> > To unsubscribe from this group, send email to
>>>>> > nodejs+unsubscribe@**googlegroups.com<nodejs%2Bunsubscribe@googlegroups.com>
>>>>> > For more options, visit this group at
>>>>> > http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>> >
>>>>> > --
>>>>> > Job Board: http://jobs.nodejs.org/
>>>>> > Posting guidelines:
>>>>> > https://github.com/joyent/**node/wiki/Mailing-List-**
>>>>> Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>>> > You received this message because you are subscribed to the Google
>>>>> > Groups "nodejs" group.
>>>>> > To post to this group, send email to nodejs@googlegroups.com
>>>>> > To unsubscribe from this group, send email to
>>>>> > nodejs+unsubscribe@**googlegroups.com<nodejs%2Bunsubscribe@googlegroups.com>
>>>>> > For more options, visit this group at
>>>>> > http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Joshua Holbrook
>>>>> Head of Support
>>>>> Nodejitsu Inc.
>>>>> j...@nodejitsu.com
>>>>>
>>>>> --
>>>>> Job Board: http://jobs.nodejs.org/
>>>>> Posting guidelines: https://github.com/joyent/**
>>>>> node/wiki/Mailing-List-**Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "nodejs" group.
>>>>> To post to this group, send email to nodejs@googlegroups.com
>>>>> To unsubscribe from this group, send email to
>>>>> nodejs+unsubscribe@**googlegroups.com<nodejs%2Bunsubscribe@googlegroups.com>
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>>
>>>>
>>>>  --
>>> Job Board: http://jobs.nodejs.org/
>>> Posting guidelines: https://github.com/joyent/**node/wiki/Mailing-List-*
>>> *Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>> You received this message because you are subscribed to the Google
>>> Groups "nodejs" group.
>>> To post to this group, send email to nodejs@googlegroups.com
>>> To unsubscribe from this group, send email to
>>> nodejs+unsubscribe@**googlegroups.com<nodejs+unsubscribe@googlegroups.com>
>>> For more options, visit this group at
>>> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>
>>>  --
>> Job Board: http://jobs.nodejs.org/
>> Posting guidelines:
>> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> You received this message because you are subscribed to the Google
>> Groups "nodejs" group.
>> To post to this group, send email to nodejs@googlegroups.com
>> To unsubscribe from this group, send email to
>> nodejs+unsubscribe@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/nodejs?hl=en?hl=en
>>
>
>  --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines:
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to nodejs@googlegroups.com
> To unsubscribe from this group, send email to
> nodejs+unsubscribe@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en
>

--20cf300fb103bd547b04c5f74ed2
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<br><br><div class=3D"gmail_quote">On Sun, Jul 29, 2012 at 10:33 PM, Rob As=
hton <span dir=3D"ltr">&lt;<a href=3D"mailto:robash...@codeofrob.com" targe=
t=3D"_blank">robash...@codeofrob.com</a>&gt;</span> wrote:<br><div>=A0</div=
><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1=
px #ccc solid;padding-left:1ex">

On a side note I think we should be careful in this kind of conversation (i=
f we&#39;re even going to have it) to separate the needs of testing, the ne=
eds of extensibility - and what we call dependency injection, dependency in=
version and inversion of control containers.</blockquote>

<div><br>+1<br><br>But, to go back to the discussion on testing, it seems t=
hat a lot of people are unaware of how easy it is to mock modules in Node. =
Remember that modules are cached by Node once=20
loaded, so you can mess with them all you like prior to calling the code
 that&#39;s going to use it (unless require.cache is messed with afterwards=
)<br><br>You can take a module and throw Sinon at
 it and mock out all you need; a technique I&#39;m using extensively for=20
unit tests to isolate just the component I want. I find it particularly=20
handy for &#39;fs&#39; calls as they are annoying to set up fixtures for an=
d=20
make a mess if actually executed. Consider the following unit test in=20
Ender that is only testing a small <i>write</i> module that needs to=20
take an object that will provide some source text and write it to an=20
appropriate location:=20
<a href=3D"https://github.com/ender-js/Ender/blob/1.0-wip/test/unit/write-t=
est.js">https://github.com/ender-js/Ender/blob/1.0-wip/test/unit/write-test=
.js</a>=20
-- the source object is mocked, as is &#39;fs&#39;, so the only active code=
 is the module
 being tested. The mocks are provided by Sinon which is built in to the=20
BusterJS test framework in this case (which is why they are initialised wit=
h `this`=20
and there is no explicit mock verify or clean up, it&#39;s all done=20
automatically). And note, these are mocks, not stubs, so they contain=20
test logic which must be conformed to.<br><br>Back to the issue of IoC/DI f=
rameworks, here&#39;s a few more that may be worth a look: <a href=3D"http:=
//microjs.com/#IOC">http://microjs.com/#IOC</a><br><br>=A0-- Rod<br><br>=A0=
</div>

<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><div class=3D"HOEnZb"><div class=3D"h5"><div=
></div><div><br></div><div><div><br><br><div class=3D"gmail_quote">On Sun, =
Jul 29, 2012 at 2:12 PM, <a href=3D"mailto:henry.osw...@sharelatex.com" tar=
get=3D"_blank">henry.osw...@sharelatex.com</a> <span dir=3D"ltr">&lt;<a hre=
f=3D"mailto:henry.osw...@sharelatex.com" target=3D"_blank">henry.oswald@sha=
relatex.com</a>&gt;</span> wrote:<br>



<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><div>The problem basically comes down to bei=
ng able to mock/stub out the require module system, I am yet to see a nice =
simple way of doing it (if you have one please let me know!). This is solve=
d in other=A0languages=A0like C# which uses Dependency injection with a=A0c=
ontainer=A0but in ruby you don&#39;t need to inject=A0dependencies as its p=
ossible to=A0directly=A0mock things out (if I remember correctly). So DI=A0=
is not it is not necessarily the best technique for javascript.</div>



<div><br></div><div>@Oliver Leics that looks a bit like how=A0<a href=3D"ht=
tps://github.com/felixge/node-sandboxed-module" target=3D"_blank">node-sand=
boxed</a>=A0works</div><div><br></div>@Rob Ashton<font color=3D"#000000"><s=
pan style=3D"text-align:left;white-space:nowrap">=A0</span></font>For a uni=
t test I don&#39;t really want to be hitting an external=A0environment. A g=
ood example is if you make a http call to another api, at the unit test lev=
el you just want to make sure you are hitting the right url with the correc=
t data. You can then write an=A0integration=A0test against this api to make=
 sure you know how it behaves.=A0<div>



<div><br><br>On Saturday, July 28, 2012 10:26:59 AM UTC+1, Rob Ashton wrote=
:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div bgcolor=3D"#FFFFFF">

<div>Well, I think if you&#39;re writing code against fs, you should test a=
gainst fs</div><div><br></div><div>If you want the rest of your tests to go=
 fast, you should fake out the bit which uses fs, not fs itself</div>
<div><br></div><div>Speaking in a general tone anyway, more context require=
d for specific scenarios</div><div><br>Sent from my iPhone</div><div><br>On=
 28 Jul 2012, at 09:02, Eldar &lt;<a href=3D"mailto:eldar...@gmail.com" tar=
get=3D"_blank">eldar...@gmail.com</a>&gt; wrote:<br>




<br></div><div></div><blockquote type=3D"cite"><div>Thank you for pointing =
to Broadway.<div><br></div><div>But yeah there are situations where hooks w=
ere not planed. For example:=A0</div><div><br></div><div>Once I tried to mo=
ck the file system. The goal were to define directory layout right in test.=
 That&#39;s much more better and cleaner then having separate fixtures dir =
created by hand. =A0You have all information right were it used, you have i=
nstant understanding of what&#39;s going on, etc. But you can&#39;t mock fi=
le system if you need real IO right in the test and at the same time you ar=
e using third party! Anyway, even if you don&#39;t have such case, isn&#39;=
t it better to just use =A0&quot;require&quot; for things that semantically=
 are nothing more then just a &quot;require&quot;, rather then introduce =
=A0artificial hooks?</div>




<div><br></div><div>That&#39;s the reason why I&#39;d like such thing to be=
=A0officially=A0supported. Actually the title of the topic is wrong. I had =
in mind feedback for=A0proposal.=A0</div><br>On Saturday, July 28, 2012 2:0=
2:05 AM UTC+4, Marak Squires wrote:<blockquote class=3D"gmail_quote" style=
=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"=
>




Yeah, that&#39;s pretty much the whole point of Broadway.<div><br></div><di=
v>I use Broadway a lot of &quot;plugin systems&quot;. Essentially, where yo=
u are requiring files as node.js modules, but you want programmatic hooks i=
nto the=A0initialization=A0and attachment process of the module.<br>





<br><div class=3D"gmail_quote">On Fri, Jul 27, 2012 at 2:57 PM, Joshua Holb=
rook <span dir=3D"ltr">&lt;<a href=3D"mailto:josh.holbr...@gmail.com" targe=
t=3D"_blank">josh.holbr...@gmail.com</a>&gt;</span> wrote:<br><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;=
padding-left:1ex">





You might like this, Eldar:<br>
<br>
<a href=3D"https://github.com/flatiron/broadway" target=3D"_blank">https://=
github.com/flatiron/<u></u>broadway</a><br>
<br>
It gives you dependency injection and IoC. We use it a lot in<br>
flatiron, it&#39;s pretty sweet.<br>
<br>
--Josh<br>
<div><div><br>
On Fri, Jul 27, 2012 at 2:27 PM, Rob Ashton<br>
&lt;<a href=3D"mailto:robashtondevelo...@gmail.com" target=3D"_blank">robas=
htondevelo...@gmail.com</a>&gt; wrote:<br>
&gt; Yeah, sorry<br>
&gt;<br>
&gt; Not a real developer, never worked on a real project, excuse me for my=
<br>
&gt; ignorance.<br>
&gt;<br>
&gt; Lol jking<br>
&gt;<br>
&gt; Sigh<br>
&gt;<br>
&gt; Sent from my iPhone<br>
&gt;<br>
&gt; On 27 Jul 2012, at 20:33, Joe Developer &lt;<a href=3D"mailto:joe.d.de=
velo...@gmail.com" target=3D"_blank">joe.d.develo...@gmail.com</a>&gt; wrot=
e:<br>
&gt;<br>
&gt; Erm, outside of the amateur hour projects just such functionality exis=
ts:<br>
&gt; <a href=3D"http://blog.endpoint.com/2011/02/locally-served-yui3.html" =
target=3D"_blank">http://blog.endpoint.com/2011/<u></u>02/locally-served-yu=
i3.html</a><br>
&gt;<br>
&gt; And yes, once you have had the pleasure of using it on non-trivial app=
s you<br>
&gt; miss it dearly when dealing with the ad-hoc structured or &#39;good en=
ough<br>
&gt; rolled&#39; alternatives.<br>
&gt;<br>
&gt; On Fri, Jul 27, 2012 at 11:47 PM, Martin Cooper &lt;<a href=3D"mailto:=
mfncoo...@gmail.com" target=3D"_blank">mfncoo...@gmail.com</a>&gt; wrote:<b=
r>
&gt;&gt;<br>
&gt;&gt; On Fri, Jul 27, 2012 at 8:07 AM, Rob Ashton &lt;<a href=3D"mailto:=
robash...@codeofrob.com" target=3D"_blank">robash...@codeofrob.com</a>&gt;<=
br>
&gt;&gt; wrote:<br>
&gt;&gt; &gt; Do we need dependency injection in nodejs? Well - if you mean=
 dependency<br>
&gt;&gt; &gt; injection literally, we have it already, it looks like this<b=
r>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; function doSomething(dependency) {<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; }<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; doSomething(new FooDependency())<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; or<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; doSomething(new BarDependency())<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; or<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; var Animal =3D function(vocals) {<br>
&gt;&gt; &gt; =A0 this.vocals =3D vocals<br>
&gt;&gt; &gt; }<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; var cat =3D new Animal(miaow)<br>
&gt;&gt; &gt; cat dog =3D new Animal(woof)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; etc<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ----------<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; If you&#39;re talking about =A0&#39;container&#39; support to=
 support this, it&#39;s a<br>
&gt;&gt; &gt; road<br>
&gt;&gt; &gt; that has been trodden well by .NET and Java devs, and has bee=
n shown<br>
&gt;&gt; &gt; time<br>
&gt;&gt; &gt; and time again to lead full circle to the very beginning wher=
e you just<br>
&gt;&gt; &gt; build your object graphs manually and introduce extensibility=
 points<br>
&gt;&gt; &gt; where<br>
&gt;&gt; &gt; you need them for either mocking out slow dependencies for te=
sting or<br>
&gt;&gt; &gt; allowing consumers to control something about your code.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Trying to bake in support to this as part of the require syst=
em seems<br>
&gt;&gt; &gt; like<br>
&gt;&gt; &gt; asking for trouble, keep it explicit, keep it as needed and l=
et the<br>
&gt;&gt; &gt; goodness<br>
&gt;&gt; &gt; follow.<br>
&gt;&gt;<br>
&gt;&gt; I agree with this. If you need dependency injection, design it int=
o<br>
&gt;&gt; your system. Don&#39;t force it on unsuspecting modules.<br>
&gt;&gt;<br>
&gt;&gt; A couple of things that come to mind off the top of my head:<br>
&gt;&gt;<br>
&gt;&gt; * If I compel some module to use, say, &#39;my-funky-fs&#39; inste=
ad of &#39;fs&#39;<br>
&gt;&gt; without knowing it, will that cause *its* dependencies to have the=
ir<br>
&gt;&gt; usage of &#39;fs&#39; replaced too? What if one of them was alread=
y replacing<br>
&gt;&gt; it with something of its own choosing, perhaps using a different<b=
r>
&gt;&gt; mechanism (like maybe graceful-fs)?<br>
&gt;&gt;<br>
&gt;&gt; * If someone reports an issue with one of my packages, and I spend=
 a<br>
&gt;&gt; bunch of my time debugging it, only to discover that the reporter<=
br>
&gt;&gt; replaced one of my dependencies with some other flaky substitute a=
nd<br>
&gt;&gt; that&#39;s the culprit, I&#39;m not going to be happy about that. =
I design my<br>
&gt;&gt; packages to work with their declared dependencies, or I specifical=
ly<br>
&gt;&gt; design for dependency injection if it&#39;s needed.<br>
&gt;&gt;<br>
&gt;&gt; &gt; My two cents.<br>
&gt;&gt;<br>
&gt;&gt; And mine. :)<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; Martin Cooper<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; &gt; On Fri, Jul 27, 2012 at 4:45 PM, Eldar &lt;<a href=3D"mailto:=
eldar...@gmail.com" target=3D"_blank">eldar...@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Do we need this in Node?<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; My answer is yes we need some (simple) way to specify the=
 app level<br>
&gt;&gt; &gt;&gt; dependencies =A0at runtime. Here is my take on this. Plea=
se checkout and<br>
&gt;&gt; &gt;&gt; let<br>
&gt;&gt; &gt;&gt; me know how do you feel about.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; But the idea is very simple:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; // inside any index.js<br>
&gt;&gt; &gt;&gt; var R =3D require(&#39;runtime&#39;).<u></u>patchNative()=
<br>
&gt;&gt; &gt;&gt; var use =3D R(module).use<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; use(&#39;fs&#39;, &#39;node_modules/third/party&#39;, req=
uire(&#39;./smart-fs&#39;))<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; That&#39;s it. Third party module just uses our smart fil=
e system<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; --<br>
&gt;&gt; &gt;&gt; Job Board: <a href=3D"http://jobs.nodejs.org/" target=3D"=
_blank">http://jobs.nodejs.org/</a><br>
&gt;&gt; &gt;&gt; Posting guidelines:<br>
&gt;&gt; &gt;&gt; <a href=3D"https://github.com/joyent/node/wiki/Mailing-Li=
st-Posting-Guidelines" target=3D"_blank">https://github.com/joyent/<u></u>n=
ode/wiki/Mailing-List-<u></u>Posting-Guidelines</a><br>
&gt;&gt; &gt;&gt; You received this message because you are subscribed to t=
he Google<br>
&gt;&gt; &gt;&gt; Groups &quot;nodejs&quot; group.<br>
&gt;&gt; &gt;&gt; To post to this group, send email to <a href=3D"mailto:no=
dejs@googlegroups.com" target=3D"_blank">nodejs@googlegroups.com</a><br>
&gt;&gt; &gt;&gt; To unsubscribe from this group, send email to<br>
&gt;&gt; &gt;&gt; <a href=3D"mailto:nodejs%2Bunsubscribe@googlegroups.com" =
target=3D"_blank">nodejs+unsubscribe@<u></u>googlegroups.com</a><br>
&gt;&gt; &gt;&gt; For more options, visit this group at<br>
&gt;&gt; &gt;&gt; <a href=3D"http://groups.google.com/group/nodejs?hl=3Den?=
hl=3Den" target=3D"_blank">http://groups.google.com/<u></u>group/nodejs?hl=
=3Den?hl=3Den</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; --<br>
&gt;&gt; &gt; Job Board: <a href=3D"http://jobs.nodejs.org/" target=3D"_bla=
nk">http://jobs.nodejs.org/</a><br>
&gt;&gt; &gt; Posting guidelines:<br>
&gt;&gt; &gt; <a href=3D"https://github.com/joyent/node/wiki/Mailing-List-P=
osting-Guidelines" target=3D"_blank">https://github.com/joyent/<u></u>node/=
wiki/Mailing-List-<u></u>Posting-Guidelines</a><br>
&gt;&gt; &gt; You received this message because you are subscribed to the G=
oogle<br>
&gt;&gt; &gt; Groups &quot;nodejs&quot; group.<br>
&gt;&gt; &gt; To post to this group, send email to <a href=3D"mailto:nodejs=
@googlegroups.com" target=3D"_blank">nodejs@googlegroups.com</a><br>
&gt;&gt; &gt; To unsubscribe from this group, send email to<br>
&gt;&gt; &gt; <a href=3D"mailto:nodejs%2Bunsubscribe@googlegroups.com" targ=
et=3D"_blank">nodejs+unsubscribe@<u></u>googlegroups.com</a><br>
&gt;&gt; &gt; For more options, visit this group at<br>
&gt;&gt; &gt; <a href=3D"http://groups.google.com/group/nodejs?hl=3Den?hl=
=3Den" target=3D"_blank">http://groups.google.com/<u></u>group/nodejs?hl=3D=
en?hl=3Den</a><br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; Job Board: <a href=3D"http://jobs.nodejs.org/" target=3D"_blank">h=
ttp://jobs.nodejs.org/</a><br>
&gt;&gt; Posting guidelines:<br>
&gt;&gt; <a href=3D"https://github.com/joyent/node/wiki/Mailing-List-Postin=
g-Guidelines" target=3D"_blank">https://github.com/joyent/<u></u>node/wiki/=
Mailing-List-<u></u>Posting-Guidelines</a><br>
&gt;&gt; You received this message because you are subscribed to the Google=
<br>
&gt;&gt; Groups &quot;nodejs&quot; group.<br>
&gt;&gt; To post to this group, send email to <a href=3D"mailto:nodejs@goog=
legroups.com" target=3D"_blank">nodejs@googlegroups.com</a><br>
&gt;&gt; To unsubscribe from this group, send email to<br>
&gt;&gt; <a href=3D"mailto:nodejs%2Bunsubscribe@googlegroups.com" target=3D=
"_blank">nodejs+unsubscribe@<u></u>googlegroups.com</a><br>
&gt;&gt; For more options, visit this group at<br>
&gt;&gt; <a href=3D"http://groups.google.com/group/nodejs?hl=3Den?hl=3Den" =
target=3D"_blank">http://groups.google.com/<u></u>group/nodejs?hl=3Den?hl=
=3Den</a><br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Job Board: <a href=3D"http://jobs.nodejs.org/" target=3D"_blank">http:=
//jobs.nodejs.org/</a><br>
&gt; Posting guidelines:<br>
&gt; <a href=3D"https://github.com/joyent/node/wiki/Mailing-List-Posting-Gu=
idelines" target=3D"_blank">https://github.com/joyent/<u></u>node/wiki/Mail=
ing-List-<u></u>Posting-Guidelines</a><br>
&gt; You received this message because you are subscribed to the Google<br>
&gt; Groups &quot;nodejs&quot; group.<br>
&gt; To post to this group, send email to <a href=3D"mailto:nodejs@googlegr=
oups.com" target=3D"_blank">nodejs@googlegroups.com</a><br>
&gt; To unsubscribe from this group, send email to<br>
&gt; <a href=3D"mailto:nodejs%2Bunsubscribe@googlegroups.com" target=3D"_bl=
ank">nodejs+unsubscribe@<u></u>googlegroups.com</a><br>
&gt; For more options, visit this group at<br>
&gt; <a href=3D"http://groups.google.com/group/nodejs?hl=3Den?hl=3Den" targ=
et=3D"_blank">http://groups.google.com/<u></u>group/nodejs?hl=3Den?hl=3Den<=
/a><br>
&gt;<br>
&gt; --<br>
&gt; Job Board: <a href=3D"http://jobs.nodejs.org/" target=3D"_blank">http:=
//jobs.nodejs.org/</a><br>
&gt; Posting guidelines:<br>
&gt; <a href=3D"https://github.com/joyent/node/wiki/Mailing-List-Posting-Gu=
idelines" target=3D"_blank">https://github.com/joyent/<u></u>node/wiki/Mail=
ing-List-<u></u>Posting-Guidelines</a><br>
&gt; You received this message because you are subscribed to the Google<br>
&gt; Groups &quot;nodejs&quot; group.<br>
&gt; To post to this group, send email to <a href=3D"mailto:nodejs@googlegr=
oups.com" target=3D"_blank">nodejs@googlegroups.com</a><br>
&gt; To unsubscribe from this group, send email to<br>
&gt; <a href=3D"mailto:nodejs%2Bunsubscribe@googlegroups.com" target=3D"_bl=
ank">nodejs+unsubscribe@<u></u>googlegroups.com</a><br>
&gt; For more options, visit this group at<br>
&gt; <a href=3D"http://groups.google.com/group/nodejs?hl=3Den?hl=3Den" targ=
et=3D"_blank">http://groups.google.com/<u></u>group/nodejs?hl=3Den?hl=3Den<=
/a><br>
<br>
<br>
<br>
</div></div><span><font color=3D"#888888">--<br>
Joshua Holbrook<br>
Head of Support<br>
Nodejitsu Inc.<br>
<a href=3D"mailto:j...@nodejitsu.com" target=3D"_blank">j...@nodejitsu.com<=
/a><br>
</font></span><div><div><br>
--<br>
Job Board: <a href=3D"http://jobs.nodejs.org/" target=3D"_blank">http://job=
s.nodejs.org/</a><br>
Posting guidelines: <a href=3D"https://github.com/joyent/node/wiki/Mailing-=
List-Posting-Guidelines" target=3D"_blank">https://github.com/joyent/<u></u=
>node/wiki/Mailing-List-<u></u>Posting-Guidelines</a><br>
You received this message because you are subscribed to the Google<br>
Groups &quot;nodejs&quot; group.<br>
To post to this group, send email to <a href=3D"mailto:nodejs@googlegroups.=
com" target=3D"_blank">nodejs@googlegroups.com</a><br>
To unsubscribe from this group, send email to<br>
<a href=3D"mailto:nodejs%2Bunsubscribe@googlegroups.com" target=3D"_blank">=
nodejs+unsubscribe@<u></u>googlegroups.com</a><br>
For more options, visit this group at<br>
<a href=3D"http://groups.google.com/group/nodejs?hl=3Den?hl=3Den" target=3D=
"_blank">http://groups.google.com/<u></u>group/nodejs?hl=3Den?hl=3Den</a><b=
r>
</div></div></blockquote></div><br></div>
</blockquote>

<p></p>

-- <br>
Job Board: <a href=3D"http://jobs.nodejs.org/" target=3D"_blank">http://job=
s.nodejs.org/</a><br>
Posting guidelines: <a href=3D"https://github.com/joyent/node/wiki/Mailing-=
List-Posting-Guidelines" target=3D"_blank">https://github.com/joyent/<u></u=
>node/wiki/Mailing-List-<u></u>Posting-Guidelines</a><br>
You received this message because you are subscribed to the Google<br>
Groups &quot;nodejs&quot; group.<br>
To post to this group, send email to <a href=3D"mailto:nodejs@googlegroups.=
com" target=3D"_blank">nodejs@googlegroups.com</a><br>
To unsubscribe from this group, send email to<br>
<a href=3D"mailto:nodejs+unsubscribe@googlegroups.com" target=3D"_blank">no=
dejs+unsubscribe@<u></u>googlegroups.com</a><br>
For more options, visit this group at<br>
<a href=3D"http://groups.google.com/group/nodejs?hl=3Den?hl=3Den" target=3D=
"_blank">http://groups.google.com/<u></u>group/nodejs?hl=3Den?hl=3Den</a><b=
r>
</div></blockquote></div>
</blockquote>

<p></p>

-- <br>
Job Board: <a href=3D"http://jobs.nodejs.org/" target=3D"_blank">http://job=
s.nodejs.org/</a><br>
Posting guidelines: <a href=3D"https://github.com/joyent/node/wiki/Mailing-=
List-Posting-Guidelines" target=3D"_blank">https://github.com/joyent/node/w=
iki/Mailing-List-Posting-Guidelines</a><br>
You received this message because you are subscribed to the Google<br>
Groups &quot;nodejs&quot; group.<br>
To post to this group, send email to <a href=3D"mailto:nodejs@googlegroups.=
com" target=3D"_blank">nodejs@googlegroups.com</a><br>
To unsubscribe from this group, send email to<br>
<a href=3D"mailto:nodejs%2Bunsubscribe@googlegroups.com" target=3D"_blank">=
nodejs+unsubscribe@googlegroups.com</a><br>
For more options, visit this group at<br>
<a href=3D"http://groups.google.com/group/nodejs?hl=3Den?hl=3Den" target=3D=
"_blank">http://groups.google.com/group/nodejs?hl=3Den?hl=3Den</a><br>
</div></div></blockquote></div><br></div></div>

<p></p>

-- <br>
Job Board: <a href=3D"http://jobs.nodejs.org/" target=3D"_blank">http://job=
s.nodejs.org/</a><br>
Posting guidelines: <a href=3D"https://github.com/joyent/node/wiki/Mailing-=
List-Posting-Guidelines" target=3D"_blank">https://github.com/joyent/node/w=
iki/Mailing-List-Posting-Guidelines</a><br>
You received this message because you are subscribed to the Google<br>
Groups &quot;nodejs&quot; group.<br>
To post to this group, send email to <a href=3D"mailto:nodejs@googlegroups.=
com" target=3D"_blank">nodejs@googlegroups.com</a><br>
To unsubscribe from this group, send email to<br>
<a href=3D"mailto:nodejs%2Bunsubscribe@googlegroups.com" target=3D"_blank">=
nodejs+unsubscribe@googlegroups.com</a><br>
For more options, visit this group at<br>
<a href=3D"http://groups.google.com/group/nodejs?hl=3Den?hl=3Den" target=3D=
"_blank">http://groups.google.com/group/nodejs?hl=3Den?hl=3Den</a><br>
</div></div></blockquote></div><br>

--20cf300fb103bd547b04c5f74ed2--