Nx Office Hours: Workspace Automation with Nx Devkit

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hello everyone welcome to nx office hours um i will be hosting the office hours today my name is isaac mann i'm an architect with narwhal i've been here a couple years and uh yeah it's exciting this first time where i'm like behind the controls i've been a guest a few times and so you know if you get if you get you know weird things happening things bouncing around in different ways uh that's because i'm new to this and or i'm just you know playing with new toys uh so that i'll be fun uh and uh i have with me column uh column is uh new to narwhal and i'm i'm excited to have him on here with me um could you give your give the viewers a little intro to who you are colin yeah sure i'm colin i'm a city engineer marvel and i've been working on the angular vertical for the nxt since i've joined narwhal so that's involved kind of what we're talking about today where myself and the this fellow have been vibrating the normal angular program they use nx dev kit instead of angular dev kit so i guess should we just do something interesting today great um oh sorry i should have said uh i am located in columbus ohio in the united states and uh column where are you located oh yeah i'm i'm in derry or maryland northern ireland okay uh hello wick um so column so you've been using nx dev kit um what uh what do you like about nx dev kit and like what do you like what what is it like actually working with it yeah it's backtrack a little bit uh what is nx step kit and then we'll talk about what you like about it yeah so uh in concept and expected is very similar to angular dev kit so it's basically a set of tools and apis that we can use to create generators and executors that will help us build create workspace automation in a sense where we can generate files we can modify files update them remove them we can basically control our code base our workspace just through some cli tools and it makes composing cli tools like that a lot easier and then it can also take our code and build it in specific ways that might help so that's where we've getting some like magical powers where people are building like java apps using nx because of these uh there's an nx dev kit and the uh provides it so you said that people are developing java um using annex yeah like so we can there's like much uh workspaces now in the sense that people have uh java plugins or c-sharp programs for learn x devtools which allows people to write c sharp code and uh java code will run the same mono repo as their front end apps and build it all using nx so they can get the same benefits of like the computation cache and things like that just from the plug engine from the next dev kit that is really cool um neat uh so yeah so the uh the topic today is all about nx dev kit and i'll be going through a little demo of trying to use nx dev kit to make some generators and executors and we'll see how much we can actually uh actually get through the demo in an hour but i plan to have like four or five different examples of of generators and executors today um and uh also obviously we're you know we welcome questions and uh we'll we'll answer as many of those questions as as we can um at closer to the end um but column is going to be watching the the comments and uh interrupting me when i you know when uh when there's a question to answer um cool uh let's see column is there anything else that we should talk about before we go to the demo i think maybe one of the key differences between the next dev kit and angular dev kit and that would be that the nx deck it aims to use like primitives about the javascript language whereas anger kit relies a lot on rxjs because a lot it can be a lot more difficult to debug and thought that was difficult to understand whereas the dev kit just keeps things nice and simple and very intense very easy to like read easily debug then afterwards yeah yeah i definitely like that it um yeah when i first started using the angular dev kit i it was it it was it was a hurdle for me to get over to to be able to actually use it um but uh but the dev nx dev kit is uh like as soon as i saw it i was like oh i know exactly what all this code is doing um so so that is cool there are some more complex use cases that uh i saw some example code that that's using javascript generators and those are still kind of confusing to me um but we will uh we'll do lots of examples that that don't need javascript generators and then maybe one that that uses one um but and so and you know if you're used to generators you'll say oh isaac that's that's that's old hat everyone knows how to use generators everyone knows what the yield keyword means and what it does so um all right let's uh let's do this let's let's make some okay i'm going to share my screen here there we go all right so i have here the uh the nx examples repository uh which is i just downloaded from github narwhal narwhal slash nx-examples on github and i've i've done done yarn install and that's all i've done so this is just master off of here and what i want to do is i want to create some workspace generators in here and see what we can do with the nx devkit so let's go here and we're going to make a generator all right so column i need your help here um we are going to make the first generator to make make a static file uh in a library um so what kind of static file should we put in here um let's so like a boring example would be like a license file or a readme file um do you have a um like a favorite song or something that we can uh put lyrics in here that uh so because every code base needs some song lyrics in it um oh they're fantastic uh well here wrap sweater okay bohemian rhapsody all right let's do that so let's do um let's see we'll call it uh is okay let's this is annoying here we'll call our generator is this the real life and we'll create that and while we're here i need to i need to look up the lyrics to bohemian rhapsody yeah i'm not saying lyrics okay it's um we'll copy that and so we'll we'll make a rhapsody.txt file and we'll put that at the base of your library so let's let's go in here is this the real life let's make a files folder here and make a new file call it rhapsody.txt and i copied this off screen there should be a space there carry on we'll do some karaoke off stream later and then there's a space here or you can do uh you can do your karaoke you know in the privacy of yourselves while you're listening yeah i like i like how how me is extra long is that emphasis yeah uh hold on we gotta do like uh head banging here uh okay all right so we gotta we got our rhapsody.txt this is a you know a a marvelous uh text file that that should be in you know every every code base out there [Music] we go right so let's see so our default workspace generator here has a it takes in a name from our our schema so right right off the bat you can basically tell what's going on just by reading the code so you can see this is they said exporting a default function it's async so that just means it's returning a promise um this uh host here let's let's rename this to tree there it is so this this tree is a um virtual tree representing the the file system so that lets you um if if some if one of these steps fails um it will the whole thing will stop and nothing will actually affect your file system so like if this step here fails then you won't be left with this partial change and then some weird state so if this second step fails the whole thing will will revert back to where it was so that's that's the main value of this virtual tree um yeah and that's in contrast to the angular stack kit angus deck it will actually do partial application so if someone fails halfway along then everything before that will still apply which can lead to some difficulties when you're spacing all them like these and test some way oh okay i i did not actually know that i thought the angular dev kit did the same thing so i learned something today um so then this the second parameter here is your um your input options um let's give that a an actual type here export interface schema names string okay um and so in this case all it's giving us is the name of a library that we're going to use um so this default generator all it does is it creates a library using the uh narwhal workspace uh library generator so this is using an existing index device generator it's formatting the files to using prettier and then at the end it's uh running like yarn install or npm install depending on what you have what you're using in your workspace um but that's not actually what we don't want to do we want to get rid of all of these so actually so it's important to notice that this this step here um it's returning a function everything before the func before the return statement here happens in the virtual file system and it happens before the changes have been made to your file system uh this part inside the callback happens after the file changes have been made so your tool like yarn or npm has no understanding of what this virtual tree is or does so it needs to actually work with the real file system so anything that has to work with the real file system should be inside this this callback here um but we'll uh we'll get to that a little bit later so what we want to do first is let me check my notes here we go okay so we want to first we need to get the location of this of the library specified by the name so let's get the um we need read project configuration and this is under narwhal dev kit so let's go in here so there's a bunch of useful uh utility functions inside of normal dev kit one of them is read project configuration and what that's going to do is it's going to look in your workspace.json or angularjs.json and give you basically everything in here so you you give it products and it will give you everything inside of here so that tells you like the route where the root of the library is your source the project type all everything in here all this information what we mainly care about is this is the source root so we know where to drop our file uh so let's do that so we'll do read project configuration and we're gonna give it the tree and the project name so that's going to be schema.name okay so that's going to be config at and then inside of here we've got root and source root so let's call this uh it's called the source root because that's really all we care about okay so now we have the the location of where where our file is going to be dropped and then we need a to actually create a file so let's use another utility here on generate files and we'll make a generate files all right and so pass in the virtual tree again the source full source folder is our source route that we just got up above okay and now let's see target target is going to be [Music] um oh never mind actually uh source folder is the the folder that contains the um the files that we're going to copy into the source of the copy command so in this case uh we need to do let's see join path fragments um and here we're going to do let's see what is it okay yeah this is the question node magic go ahead column yeah large ask a question with the read project configuration i mentioned about how it also turns ties from the next thenx json file and it does so it merges the workspace configuration and the annex.json configuration oh perfect uh let's see if we can demo that so projects products so it has tags and implicit dependencies let's see if we can get that yeah it has tags and implicit dependencies as well so yeah that's that's great so i'm glad column is here to tell me all these things i didn't know um okay so so dura name is a special node um uh reserved keyword i don't know a lot about it other than it magically knows where where this file is so it's basically the path to files this index.ts and so i'm going to do use the dura name and then i'm going to add files because i want the the contents of this files folder here to be the our source and then the target that's where the source route goes that's where it's getting uh dropped so let's let's instead of calling this source let's call this um library so we don't get confused between this is the source of the files and this is the destination of the files um and then what is our last parameter here oh and this is all the in this case this is where we would put values that we want to substitute into our into our file in this case it's just a static file so we're going to make that an empty object but later on we will uh we'll actually um use that and and make a templated file that we can replace values inside of so this this returns a void so this doesn't uh doesn't return a promise so you don't need to do in a wait here um if it was a if it was a promise you'd do an await but in this case it's just a it's a synchronous call so you can leave it without the await um okay so we've got generate files um i think that should be it let's yeah let's try running this and let me get rid of extra okay get rid of unused imports all right now let's see i'm going to run generate um is this the real life oh nx console picked up that this uh new generator exists without me having to do anything special um and let's see where am i gonna drop this what library should i put it in we'll put it in cart because cart needs some more more musicality all right so that's the dry run it's putting in apps cart source um let's see all right because cart is under is under apps so if we want th this one here this is cart cart page let's see if we can cart page is that a real one there we go so that's a dry run let's let's run it for real and see if we get a rhapsody.txt file all right there we go so now we have a very useful new file in our system here yes we've got we've got two questions on the code so one of them was do we need to return a function and we don't this is the same later this generator doesn't so you can see we don't have to refer the function and then our question was is there a benefit between using join path fragments and just using the standard node path i'm not sure i saw this in um so joint path fragments is a utility provided by normal dev kit and so i wonder what it's doing under the hood uh i'm pretty sure it joins them with uh forward slashes or things like that needs to be and it doesn't it's os and uh agnostic i believe and does node node path not do that i think it's just a little bit more involved okay um i'm just going to try looking this up but that's fine i'll take your word for it colin um awesome okay so now we have uh now we have a blank a blank um file here or a static file so let's see let's do let's do something else let's make a templated file so let's do let's stay on the um something kind of whimsical um let's do um [Music] i am a what one of my one of the poems that i like is oh captain my captain by walt whitman and so i'm gonna make a new um a new generator here and let's see let's we'll commit these changes we'll call that static um hold on let me let me switch branches so i don't mess with jason's examples repo um nx office all right so we'll make a new generator here um generator and we're going to call this um who is the captain run it uh so going along the same same theme of i don't want a new file i want a new folder called file so this the name of this folder it doesn't have to be files obviously we we just we just referenced it in here with whatever the name is so you can change the name as long as this matches um so that's not hard-coded anywhere but i'm gonna make a new file and we're gonna call it um captain txt or we'll make it a markdown um and that's not what i want i'm going to copy so oh captain my captain is a poem by by walt whitman and it was written shortly after abraham lincoln was shot um and he's you know lamenting the fact that abraham lincoln was shot just after the civil war was one equipment all right so we've copied this in okay we lose some of the spacing that's fine um and what i'm gonna do is uh this is also if you watch the dead poet society this this poem uh plays a big role in that one too um in that movie um so what i'm gonna do is we're gonna copy this file because we're basically going to start from the same place but then we're going to add in the um some more information so we're going to add captain in here so we're going to replace the the string captain with whatever you know whatever name you want to pass in there so we're going to do captain is schema dot captain what we're doing is we're passing into into this generate files function we're saying you know this this string value here is going to be um is going to be passed in to our um our file uh template templates so um there's a couple places we can do this let's do um well let's let's do a few things besides the captain let's do um author here and um let's do a boolean what kind of boolean should we do here um um let's do uh is short uh shortened we'll make that a blue again all right so how are we gonna actually use these values um so what we i was thinking so let's take this and inside of our our template here this uh percent equals syntax here says to replace whatever's inside here like to print out whatever is inside here um from the from the template so we can do author here and it will print out whatever the author is let's see what else can we do in here um captain my captain where should we do um let's do wherever it says my captain will replace that with the name equals percent and i'm kind of winging this um let's do name that one no it's not name it's it's captain captain yeah yeah so we'll do this and do this these are these are silly examples but um hopefully hopefully you can see how this would be useful in actual real code um okay and so this this is if you just want to print out a value that that you can you set up so you can also do any javascript you want inside of here um so let's see how can we do i want to make the first character of this uppercase um and uh column do you know a good way offhand to do that i could write a function myself um there's also probably yeah go ahead if you have a good i just think the string isn't uh although it's going to say it doesn't do an uppercase but that's not a capitalized function uh yeah that's true so let's we'll just do it uh so here we'll do it in here um [Music] so function um capitalize what does it uh okay so we will call this function capitalize um this is a string and it returns a string and so we can do first letter equals um here um first letter we're going to use some fancy uh restructuring here yep rest and then valves there we go and then we're going to return first letter dot okay to uppercase we'll go to local uppercase because we might be fancy um plus rest if that'll work so we're gonna actually we're gonna pass in here the capitalize function so you don't you don't have to just pass in like static values you can pass in functions or um you know whatever other javascript you want in here so then in here i'm going to do i'm going to do equalizer and then there's another spot where it's supposed to be capitalized i think it's here epitomize okay let's let's try this out and see if this works so capitalize it's passing the captain okay i'm going to try this and there's probably going to be a bunch of errors so here goes nothing uh who is the captain so we already we don't have a we don't have a captain specified here so let's fix that so the reason the reason it it doesn't have a captain is because this this interface here um even though typescript knows that it that this function needs it the annex console does not know that and uh you know the cli wouldn't know that either so what we want to do is we want to add a captain here so we've got a library name being passed in his name what else do we need here i'll just copy this okay so let's do this so properties we've got name um i'm just going to copy this part um so we've got type here the type of name is a string description this is just some text that's going to be displayed up here um this dollar default the source is argv which says that if you were to run this from the the cli you could do um generate who is the captain and then space and then the next text would default to being the the library name here um or you could do dash dash name equals library name so that this lets you do it both places so the first the first non-flag after the um after the generate command will be passed into name here that's what that's what this text is um [Music] so i'm gonna do instead of name this is going to be captain and we're going to get rid of dollar default i'm going to say what captains name and i'm gonna make this be defaulting to my captain like that um and then what else do we need we got name taken care of i need author [Music] here author author's name default to walt whitman then do is this is going to be a boolean shorten the poem and we'll default that to let's see do you need yeah okay okay so we we have uh only one required field here which is name um and all the rest of these values if we if we took this default off here let me let me just do that and i'll run this let's let's reopen that to see if it picks up the so we need to have annex console refresh okay right i'm gonna hit it with a hammer reload the window there we go there's the captain there we go all right so we're going to run this and let's see if this works so let's do card card page again put in the default of my captain which is nice let's try running this is this going to work all right type string is not an array type oh i was being too faced there is a capitalized function that's exported by a normal workspace package if you want to use that all right let's do that um so my my live coding didn't work so we'll just get that and it's a normal workspace um string utils i think it goes capitalize i think capitalize okay do that all right we'll use code that someone else wrote not code that i wrote i'm sure we could have figured it out but all right so let's try this generate command again okay so there's a problem here author is not defined so it's trying to to put it in here um and we don't have a a default specified so we got that we got that error um so i didn't i didn't fill anything in here for author and there's no default so that by the time i got to got to here it's trying to put author in and it says hey i can't do anything so are you plus an author and substitutions uh i am i am also not doing that um so we could do that author but i think i think we would still get the same error even if i did this from the scan oh it did work okay um let's see what did it would it generate was it an empty string yeah likewise all the fines right there captain.md that's the empty string okay all right so let's uh let me okay that's fine so in this case it's defaulting to to an empty string but let's say we don't want that let's say we want uh to have a default of walt whitman so let's do that put that in here and i'm going to run this again now is it going to complain that the file is already there i think it overwrites so what about that yeah it says it says update here so instead of create it's doing an update so great so it's overwriting it and there's our there's our default all right let's see if we can change these values now um i'm gonna say column wrote this and if i can call your name and captain's name let's we'll say victor is the captain all right we'll run this again okay so victor is replaced in here and it's by column with a space that's interesting why did it i think this is an nx console issue i think i think it's not putting this in in uh quotes yeah it's right here so let me um let me copy this out and see if we can run it ourselves from the terminal that's that's in quotes there i shouldn't be so quick to uh to blame index console um yeah so that's that's a problem with us so let's uh let's debug this okay let's uh let's do that actually um let's go here and i'm going to so i've copied this this command here and i'm going to do debug javascript debug terminal um and so what that's going to do is anything executed inside of here is going to be in in debug mode so i'm going to paste that in and it should hit this this debugger okay um okay i'm going to run this oops paste there we go yes okay so now let's see what is schema.name is that schema has so the author is column without the fairy afterwards um uh gregory asked if we were on the latest version of nx i found that this was a unknown ball and was less than 12.3.4 okay uh let's uh let's see it is 12.3 rc1 so let's uh let's nx update that's narwhal is that what we do no it's not an accepted index i think oh we don't need to do this in the debug terminal i'm enjoying this i'm having fun uh doing debug debugging my code and trying to figure out what's going on the the value of this over um having a a pre-written uh blog post or uh tutorial you follow is you get to see how to actually find problems in your code and you know because you're going to run into problems yourself and you're going to want to um figure out how to actually you know get past them um yeah i think an incredible thing about watching people's life go doesn't it seeing how they deal with the problems that arise yeah all right so we're gonna let that run for a little bit and um uh keep on moving forward and just just assume that that uh that will resolve eventually i wanna show how to do more javascript code in here more than just uh printing out a value so if you get rid of the if you get rid of the the equal sign here you can do any javascript code you want in here so in particular we can do an if statement and if is shortened um i guess if not is shortened if it's not shortened then we want to print out the rest of this so we can do this and then close our if statement here and so now everything in here will only be print and printed if is shortened is false um if it's if it's shortened then it'll only print what's up here so you can do all sorts of you know you can do a four state four loop or whatever else you want to do um whatever logic you need to to print out uh whatever code you want so let's see if uh let's let's try that let's see is make sure we add is shortened to the dot is shortened and then if we go to generator this is going to do weird things if i run it while the migrate has happened we're gonna do trued is shortened let's try running it i think the nx migrate is not actually changing those modules right now it's just uh steps into the migrations yeah it's just fetching them so let's see what happens so shortened worked so it's shortened perfect all right so that's um that's how we can that's how we can do you know whatever custom logics i mean you could you could even inside of this percent you could write your own function here function you could write your capitalize inside of your template file um i not that i would recommend doing that um but you can if you need to that this is you know equivalent to putting your logic in your um in your component templates um which we don't need to do but it's possible just so you know what what this what this does um i did also see and a column i'm going to put you on the spot here um it's okay to say if you don't you don't know um i i saw this this symbol as well and some of the uh the narwhal templates do you know what that does dash it's honest hit error is on escape values with the template unescaped values okay yeah this follows the javascript syntax so i can send a link on that uh okay let me see if i can uh okay uh ejs.co i'm gonna put that in the uh in the chat quickly quaker said that exclusively escaping html is that the link yep all right so if you need to look at that you can learn all the syntax here cool um let's see if our migration worked uh we'll close that close that terminal [Music] okay migrations.json has been generated we're just going to pretend that migrations don't need to be run and we're going to run yarn all right let's see what else do we have to all right we have 15 minutes and we want to leave some time for you know other questions that aren't directly related to nxdev kit so i think i want to jump to making some executors here um well okay i'm going to try and squeeze in a little bit more um so that's running i'm gonna commit uh and let's make um okay we're gonna actually just work on the same file here um if you wanted to modify some files um the easiest kind of file to modify is the is is json files so modifying your package json modifying the workspace.json or nx.json um you can do see uh right it's not gonna auto complete because it's doing an npm install this is the uh the riveting content you come to annex office hours for watching spinners yeah it's all so i think um okay let's see we want uh jason update json let's draw that let's say we have um and we want um [Music] well you know we could so if we're going to update the project configuration itself there's a dedicated command for that update json is when you have a path to a json file and you want to update that that um that file directly update project configuration is similar to read project configuration so you can you can just pass in the um let's see yeah you you just pass in the the name of the project that you want to update and then uh well let's let's do that you can do update project configuration pass in your tree your schema.name and then and then here you're going to pass in a new a new value for your project configuration um so if we did this is how you could modify your your project config you know change change some value that you want in your project config and then you pass that modified object back into this update project configuration um and so update json is is pretty similar um [Music] you can do a tree path to the file and then the updater function so this is the json object itself and then in here you can set set your value so json dot p equals new value and then you'll return your modified object here this is you know a nice helper function for for modifying json um let's see we're running short on time if you want to update a file directly that's not a json file so update let's see update source file i believe no i think it's right right yes oh you're right yes tree dot great there you go so here you do some file and then new contents um let's let's actually try that if we did copy that nope library root and then add [Music] nd comment this out this is completely overwriting the contents of that of that file um so if we were to run this generate run this again uh let's declare okay so it doesn't like that i commented out some things some harsh lint rolls here okay and so here it completely modified the contents here um let's uh let's just double check that our that that bug is no longer there now that yarn install is finished point out this line this again hey there we go great so that's been fixed um awesome all right so let's do let's do some executors uh before we get um before we run out of time here um there are you could do all sorts of other things when you're when you're modifying a file um you can you can do a um you can do a read and you do a tree.read um here and then you know modify that you know process that somehow and then spit out the the new contents here um in between here you can do all sorts of things you can you can do regex you can do you know find replace you can do regex you can do ast uh parsing and uh you know modification um so i don't have time in eight minutes to do all that but um you can get as complex as you want in here um but to do to do simple things it's it's pretty straightforward uh let's do some executors so um the for the most part if you want to do executors um i would recommend using run commands um so that would be going in here not even really using nx devkit directly but just going in here and let's do make a new target blah and options here you can either do um you can either do a single command like this um so this is this could be you know uh and any any any terminal command here can go here um or if you need to do multiple multiple commands in parallel you can do this and do uh nx run uh what is this products ete colon et or whatever whatever else you want to do if you want to chain together multiple targets like that you can um so for the for the most part um custom executor commands can can pretty easily fall be taken care of with this with this run commands option um however if you do want to write your own um we can make an executor's folder here going to you know what i'm going to for the sake of time i'm gonna pull over my notes here and just kind of walk you through the code because otherwise i don't think we'll get through it all um [Music] so um here i made a file a folder called echo and you can look on on nx.dev it actually walks you through this if i can pull it up using generators creating custom builders so this this code that that's in here is the same as this this article on index.dev um so in here it walks you through how to make your own executor fill out the schema this in this case the schema.json is the same as what we did um for the generators and once again it's you're exporting a default function and it passes in some options and the context you can either do context.logger or you can do just console.log inside of here and see so this is this is making a child process but there is a simpler version oh so this this is this is sorry this part here was with the angular dev kit so an nx executor using the nx dev kit um looks like this um so here you're exporting a function that just returns a promise and so this is spawning a child process but you could do you know whatever you want inside of here um and then you can you reference it in your workspace.json file with a a relative path to the to the folder that is created in and then after the colon you put the the name of the executor so then once you once you have that all set up you can you can run nx run just like you would any other executor like that all right let's let's pause there and go back to seeing the two of us cool yes work is definitely being done to improve the nx dev kit docs that's what i have on my plate for the end of this week um and so there should be new content coming up uh to this week or next week uh whenever we whenever we deploy that yeah it'll be awesome yeah that's you know updating the docs is always on the list of things to do you you just barely catch up before there's something new to document and yeah so you it's it's always a triage situation finding the most you know the most out of date thing that most people are interested in and trying to update that cool are there uh other questions that we should talk about before i do the the outro um uh before we started there was some one question that came on through the google phone that we have that was what uh well nx support module federation and fairly interested it does our list of things that will be being supported uh we're trying to work on how we're gonna best implement it such that the developer experience is like top-notch i know that manfred stayer's done quite a lot of work on module federation and he does have a very good plugin which has builders and schematics that will help you just use model federation with an anger right now so i think that's gonna be hot topics then cool yeah there are lots of interesting things going on um great so we're getting to the end of our time here um if you are uh if you want to know more you want to ask more questions um so be sure to be following nxdev tools on if i can click show there we go on twitter here um also look up the uh you know nx on on github uh you can subscribe to the to the youtube channel here also if you want to get a newsletter let me paste that in here you want to sign up for an email newsletter you can sign up for that um also you can check out nxcloud on nx.app and there is a community slack if you uh let's copy that link based all this stuff in here so brandon knows i did my job right uh so yeah so that if you you know want to ask not just us but you know other people in the community that are helpful and friendly join the nx community slack and if you want to get your questions on you know answered on nx office hours there is a form that you can submit directly to us and it is right here so this is for asking questions where that we we can answer live on the nx office hours here all right so i just threw a bunch of stuff out um thank you column this was a lot of fun i really appreciated you you know guiding me and answering questions that i didn't know about um i spend more of my time on documentation and less time on actually working with nx uh actually in the nx code base itself so it's great to have you be uh be there to give me some pointers and uh yeah so thank you to everyone who came and um and watched us and i hope we will uh we'll see you again next time and uh hope you enjoy nx dev kit and uh you know if uh yeah be be kind to each other and uh enjoy the the cool things that that nx gives us all right see y'all next time all right bye
Info
Channel: Nrwl - Narwhal Technologies Inc.
Views: 934
Rating: 4.8333335 out of 5
Keywords:
Id: ki2eOXvh2Sw
Channel Id: undefined
Length: 61min 9sec (3669 seconds)
Published: Mon May 24 2021
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.