').addClass('col-md-12');
253 | row.loadTemplate('#member-notification-template', {
254 | status: message
255 | });
256 | tc.$messageList.append(row);
257 | scrollToMessageListBottom();
258 | }
259 |
260 | function showTypingStarted(member) {
261 | $typingPlaceholder.text(member.identity + ' is typing...');
262 | }
263 |
264 | function hideTypingStarted(member) {
265 | $typingPlaceholder.text('');
266 | }
267 |
268 | function scrollToMessageListBottom() {
269 | tc.$messageList.scrollTop(tc.$messageList[0].scrollHeight);
270 | }
271 |
272 | function updateChannelUI(selectedChannel) {
273 | var channelElements = $('.channel-element').toArray();
274 | var channelElement = channelElements.filter(function (element) {
275 | return $(element).data().sid === selectedChannel.sid;
276 | });
277 | channelElement = $(channelElement);
278 | if (tc.currentChannelContainer === undefined && selectedChannel.uniqueName === GENERAL_CHANNEL_UNIQUE_NAME) {
279 | tc.currentChannelContainer = channelElement;
280 | }
281 | tc.currentChannelContainer.removeClass('selected-channel').addClass('unselected-channel');
282 | channelElement.removeClass('unselected-channel').addClass('selected-channel');
283 | tc.currentChannelContainer = channelElement;
284 | tc.currentChannel = selectedChannel;
285 | tc.loadMessages();
286 | }
287 |
288 | function showAddChannelInput() {
289 | if (tc.messagingClient) {
290 | $newChannelInputRow.addClass('showing').removeClass('not-showing');
291 | $channelList.addClass('showing').removeClass('not-showing');
292 | $newChannelInput.focus();
293 | }
294 | }
295 |
296 | function hideAddChannelInput() {
297 | $newChannelInputRow.addClass('not-showing').removeClass('showing');
298 | $channelList.addClass('not-showing').removeClass('showing');
299 | $newChannelInput.val('');
300 | }
301 |
302 | function addChannel(channel) {
303 | if (channel.uniqueName === GENERAL_CHANNEL_UNIQUE_NAME) {
304 | tc.generalChannel = channel;
305 | }
306 | var rowDiv = $('
').addClass('row channel-row');
307 | rowDiv.loadTemplate('#channel-template', {
308 | channelName: channel.friendlyName
309 | });
310 |
311 | var channelP = rowDiv.children().children().first();
312 |
313 | rowDiv.on('click', selectChannel);
314 | channelP.data('sid', channel.sid);
315 | if (tc.currentChannel && channel.sid === tc.currentChannel.sid) {
316 | tc.currentChannelContainer = channelP;
317 | channelP.addClass('selected-channel');
318 | }
319 | else {
320 | channelP.addClass('unselected-channel')
321 | }
322 |
323 | $channelList.append(rowDiv);
324 | }
325 |
326 | function deleteCurrentChannel() {
327 | if (!tc.currentChannel) {
328 | return;
329 | }
330 |
331 | if (tc.currentChannel.sid === tc.generalChannel.sid) {
332 | alert('You cannot delete the general channel');
333 | return;
334 | }
335 |
336 | tc.currentChannel
337 | .delete()
338 | .then(function (channel) {
339 | console.log('channel: ' + channel.friendlyName + ' deleted');
340 | setupChannel(tc.generalChannel);
341 | });
342 | }
343 |
344 | function selectChannel(event) {
345 | var target = $(event.target);
346 | var channelSid = target.data().sid;
347 | var selectedChannel = tc.channelArray.filter(function (channel) {
348 | return channel.sid === channelSid;
349 | })[0];
350 | if (selectedChannel === tc.currentChannel) {
351 | return;
352 | }
353 | setupChannel(selectedChannel);
354 | };
355 |
356 | function disconnectClient() {
357 | leaveCurrentChannel();
358 | $channelList.text('');
359 | tc.$messageList.text('');
360 | channels = undefined;
361 | $statusRow.addClass('disconnected').removeClass('connected');
362 | tc.$messageList.addClass('disconnected').removeClass('connected');
363 | $connectPanel.addClass('disconnected').removeClass('connected');
364 | $inputText.removeClass('with-shadow');
365 | $typingRow.addClass('disconnected').removeClass('connected');
366 | }
367 |
368 | tc.sortChannelsByName = function (channels) {
369 | return channels.sort(function (a, b) {
370 | if (a.friendlyName === GENERAL_CHANNEL_NAME) {
371 | return -1;
372 | }
373 | if (b.friendlyName === GENERAL_CHANNEL_NAME) {
374 | return 1;
375 | }
376 | return a.friendlyName.localeCompare(b.friendlyName);
377 | });
378 | };
379 |
380 | return tc;
381 | })();
382 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Scripts/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "twiliochat",
3 | "version": "1.0.0",
4 | "description": "Twilio Chat",
5 | "main": "tests.html",
6 | "directories": {
7 | "test": "tests"
8 | },
9 | "scripts": {
10 | "test": "node_modules/.bin/karma start"
11 | },
12 | "author": "",
13 | "license": "MIT",
14 | "devDependencies": {
15 | "babel-polyfill": "^6.26.0",
16 | "chai": "^4.2.0",
17 | "jquery": "^2.2.0",
18 | "karma": "^4.4.1",
19 | "karma-chai": "^0.1.0",
20 | "karma-chrome-launcher": "^3.1.0",
21 | "karma-html2js-preprocessor": "^1.1.0",
22 | "karma-mocha": "^1.3.0",
23 | "karma-mocha-reporter": "^2.2.5",
24 | "karma-sinon": "^1.0.5",
25 | "mocha": "^6.2.2",
26 | "moment": "^2.24.0",
27 | "puppeteer": "^2.0.0",
28 | "sinon": "^7.5.0"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Scripts/tests/tests.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
Twilio Chat Tests
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |

15 |
16 |
17 |
18 | Connected as
19 | x Leave
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |

32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |

49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
67 |
68 |
69 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Scripts/tests/tests.js:
--------------------------------------------------------------------------------
1 | var indexPageAsHtml = window.__html__['tests/tests.html'].trim();
2 | document.body.innerHTML = indexPageAsHtml;
3 |
4 |
5 | describe('TwilioChat', function() {
6 | context('#sortChannelsByName()', function() {
7 | it('sorts channels by name', function() {
8 | var channels = [
9 | {friendlyName: 'BBB'},
10 | {friendlyName: 'BBA'},
11 | {friendlyName: 'BBA'},
12 | ];
13 | var result = twiliochat.sortChannelsByName(channels);
14 | assert.deepEqual(result,
15 | [{friendlyName: 'BBA'}, {friendlyName: 'BBA'},
16 | {friendlyName: 'BBB'}]
17 | );
18 | });
19 |
20 | it('sorts an empty list', function() {
21 | var channels = [];
22 | var result = twiliochat.sortChannelsByName(channels);
23 | assert.deepEqual(result, []);
24 | });
25 | });
26 |
27 | context('#addMessageToList()', function() {
28 | it('adds a message to chat', function() {
29 | var message = {
30 | body: 'test message',
31 | author: 'me',
32 | dateCreated: new Date(),
33 | };
34 | var messageList = twiliochat.$messageList;
35 | twiliochat.addMessageToList(message);
36 | assert.isOk(messageList.html().includes('test message'));
37 | });
38 | });
39 |
40 | context('#joinGeneralChannel()', function() {
41 | it('creates a general channel if not present', function() {
42 | var messagingClientMock = {createChannel: function() {}};
43 | var mock = sinon.mock(messagingClientMock);
44 | twiliochat.messagingClient = messagingClientMock;
45 | mock.expects('createChannel').once().returns({then: function() {}});
46 | twiliochat.generalChannel = undefined;
47 | twiliochat.joinGeneralChannel();
48 | mock.verify();
49 | });
50 |
51 | it('creates a new channel', function() {
52 | var messagingClientMock = {createChannel: function() {}};
53 | var mock = sinon.mock(messagingClientMock);
54 | twiliochat.messagingClient = messagingClientMock;
55 | mock.expects('createChannel').once().returns({then: function() {}});
56 | twiliochat.handleNewChannelInputKeypress(
57 | {keyCode: 13, preventDefault: function() {}}
58 | );
59 | mock.verify();
60 | });
61 | });
62 |
63 | context('#loadChannelList()', function() {
64 | it('gets a list of channels', function() {
65 | var messagingClientMock = {getPublicChannelDescriptors: function() {}};
66 | var mock = sinon.mock(messagingClientMock);
67 | twiliochat.messagingClient = messagingClientMock;
68 | mock.expects('getPublicChannelDescriptors').once().returns({then: function() {}});
69 | twiliochat.loadChannelList();
70 | mock.verify();
71 | });
72 | });
73 | });
74 |
--------------------------------------------------------------------------------
/TwilioChat.Web/TwilioChat.Web.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Debug
8 | AnyCPU
9 |
10 |
11 | 2.0
12 | {942E20FA-B7F7-4B1E-99D7-CA5DE688EE91}
13 | {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
14 | Library
15 | Properties
16 | TwilioChat.Web
17 | TwilioChat.Web
18 | v4.5
19 | false
20 | true
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | true
32 | full
33 | false
34 | bin\
35 | DEBUG;TRACE
36 | prompt
37 | 4
38 |
39 |
40 | pdbonly
41 | true
42 | bin\
43 | TRACE
44 | prompt
45 | 4
46 |
47 |
48 |
49 | False
50 | ..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll
51 |
52 |
53 | ..\packages\Portable.BouncyCastle.1.8.0\lib\net45\crypto.dll
54 | True
55 |
56 |
57 | ..\packages\Faker.1.2\lib\Faker.dll
58 |
59 |
60 | ..\packages\Portable.JWT.1.0.5\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+xamarinios10+MonoTouch10\JWT.dll
61 | True
62 |
63 |
64 |
65 | ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll
66 | True
67 |
68 |
69 | ..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll
70 |
71 |
72 | ..\packages\RestSharp.105.2.2\lib\net45\RestSharp.dll
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 | False
85 | ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll
86 |
87 |
88 | False
89 | ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll
90 |
91 |
92 | False
93 | ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll
94 |
95 |
96 | False
97 | ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll
98 |
99 |
100 | False
101 | ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll
102 |
103 |
104 | False
105 | ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 | True
118 | ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll
119 |
120 |
121 |
122 |
123 |
124 |
125 | ..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll
126 |
127 |
128 | ..\packages\Twilio.5.36.0\lib\net35\Twilio.dll
129 |
130 |
131 | False
132 | ..\packages\WebGrease.1.6.0\lib\WebGrease.dll
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 | Global.asax
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 | Web.config
202 |
203 |
204 | Web.config
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 | 10.0
221 | $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 | True
234 | True
235 | 1398
236 | /
237 | http://localhost:1398/
238 | False
239 | False
240 |
241 |
242 | False
243 |
244 |
245 |
246 |
247 |
248 |
249 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
250 |
251 |
252 |
253 |
254 |
260 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Views/Home/Index.cshtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |

7 |
8 |
9 |
10 |
11 | Delete current channel
12 |
13 |
14 | Connected as
15 | x Leave
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |

28 |
29 |
30 |
31 |
32 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |

48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
66 |
71 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Views/Shared/Error.cshtml:
--------------------------------------------------------------------------------
1 | @{
2 | Layout = null;
3 | }
4 |
5 |
6 |
7 |
8 |
9 |
Error
10 |
11 |
12 |
13 | Error.
14 | An error occurred while processing your request.
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Views/Shared/_Layout.cshtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
Twilio Chat
7 |
8 | @Styles.Render("~/Content/css")
9 | @Scripts.Render("~/bundles/modernizr")
10 |
11 |
12 | @RenderBody()
13 |
14 | @Scripts.Render("~/bundles/jquery")
15 | @Scripts.Render("~/bundles/bootstrap")
16 |
17 |
18 | @Scripts.Render("~/bundles/twiliochat")
19 | @RenderSection("scripts", required: false)
20 |
21 |
22 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Views/Web.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Views/_ViewStart.cshtml:
--------------------------------------------------------------------------------
1 | @{
2 | Layout = "~/Views/Shared/_Layout.cshtml";
3 | }
4 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Web.Debug.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
17 |
18 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Web.Release.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
17 |
18 |
19 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/TwilioChat.Web/Web.config:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/TwilioChat.Web/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TwilioDevEd/twiliochat-csharp/a1c252a088b11de29442339c86014bdb44489617/TwilioChat.Web/favicon.ico
--------------------------------------------------------------------------------
/TwilioChat.Web/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TwilioDevEd/twiliochat-csharp/a1c252a088b11de29442339c86014bdb44489617/TwilioChat.Web/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/TwilioChat.Web/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TwilioDevEd/twiliochat-csharp/a1c252a088b11de29442339c86014bdb44489617/TwilioChat.Web/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/TwilioChat.Web/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TwilioDevEd/twiliochat-csharp/a1c252a088b11de29442339c86014bdb44489617/TwilioChat.Web/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/TwilioChat.Web/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TwilioDevEd/twiliochat-csharp/a1c252a088b11de29442339c86014bdb44489617/TwilioChat.Web/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/TwilioChat.Web/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TwilioDevEd/twiliochat-csharp/a1c252a088b11de29442339c86014bdb44489617/TwilioChat.Web/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/TwilioChat.Web/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TwilioDevEd/twiliochat-csharp/a1c252a088b11de29442339c86014bdb44489617/TwilioChat.Web/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/TwilioChat.Web/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TwilioDevEd/twiliochat-csharp/a1c252a088b11de29442339c86014bdb44489617/TwilioChat.Web/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/TwilioChat.Web/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TwilioDevEd/twiliochat-csharp/a1c252a088b11de29442339c86014bdb44489617/TwilioChat.Web/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/TwilioChat.Web/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TwilioDevEd/twiliochat-csharp/a1c252a088b11de29442339c86014bdb44489617/TwilioChat.Web/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/TwilioChat.Web/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/TwilioChat.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 2015
4 | VisualStudioVersion = 14.0.25123.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwilioChat.Web", "TwilioChat.Web\TwilioChat.Web.csproj", "{942E20FA-B7F7-4B1E-99D7-CA5DE688EE91}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwilioChat.Tests", "TwilioChat.Tests\TwilioChat.Tests.csproj", "{53EEC683-EB81-4466-B9A3-FEB99EF671C9}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Release|Any CPU = Release|Any CPU
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {942E20FA-B7F7-4B1E-99D7-CA5DE688EE91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {942E20FA-B7F7-4B1E-99D7-CA5DE688EE91}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {942E20FA-B7F7-4B1E-99D7-CA5DE688EE91}.Release|Any CPU.ActiveCfg = Release|Any CPU
19 | {942E20FA-B7F7-4B1E-99D7-CA5DE688EE91}.Release|Any CPU.Build.0 = Release|Any CPU
20 | {53EEC683-EB81-4466-B9A3-FEB99EF671C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {53EEC683-EB81-4466-B9A3-FEB99EF671C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {53EEC683-EB81-4466-B9A3-FEB99EF671C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {53EEC683-EB81-4466-B9A3-FEB99EF671C9}.Release|Any CPU.Build.0 = Release|Any CPU
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | EndGlobal
29 |
--------------------------------------------------------------------------------
/appveyor.yml:
--------------------------------------------------------------------------------
1 | version: 1.0.{build}
2 | environment:
3 | nodejs_version: "12.13.1"
4 | branches:
5 | except:
6 | - gh-pages
7 | install:
8 | - ps: Install-Product node $env:nodejs_version
9 | - node --version
10 | - npm --version
11 | - cd TwilioChat.Web/Scripts/ && npm install
12 | before_build:
13 | - ps: nuget restore
14 |
15 | test_script:
16 | - cd TwilioChat.Web/Scripts/ && npm test
17 | - nunit3-console "C:\projects\twiliochat-csharp\TwilioChat.Tests\bin\Debug\TwilioChat.Tests.dll"
18 | build:
19 | verbosity: minimal
20 |
--------------------------------------------------------------------------------