ByHershal Pandya,
a Vulture staff writer who covers comedy
Photo: Netflix
One of the standout sketches in season three of I Think You Should Leave involves a distracted office worker named Marcus (co-creator Tim Robinson) playing a rudimentary black-and-white computer game where the objective is to feed inanimate eggs to an anthropomorphic egg by dragging and dropping them into its mouth. Marcus is dutifully attending to this egg’s hunger when two of his co-workers wander into his office for a serious conversation about their working relationship. He half-listens to their concerns but continues to play the game, all the while growing confused by its arbitrary mechanics. (There appears to be no clear correlation between how many times he feeds the egg and how much progress he makes toward victory.) Eventually, Marcus interrupts his co-workers to express this confusion and invites them to look at his screen for a second opinion. Right as he does this, he “wins” the game.
“Congrats, big boy,” it wishes him before launching into a big animated finale. The anthropomorphic egg waddles into the middle of the screen, pulls down its previously unseen pants, and moons him, offering a clear view of its pubic hair and anus. “Oh my God, what are you looking at?” Marcus’s co-worker asks him. “You can’t look at porn while in the office.” “Porn?” Marcus replies. “That’s a nude egg I won from my game! I’m not in trouble at all.”
When ITYSL’sthird season dropped on May 30, fans immediately began referencing this sketch online. It’s why, when cartoonist, video-game designer, and TV-production coordinator Alec Robbins tweeted a thread about building the “fully playable” game featured in the sketch, the post racked up over 10,000 likes. “I want people to know I worked extremely hard on the butthole,” Robbins tweeted alongside a picture of himself sitting behind Marcus’s desk from the sketch. “Same for the bush.” He also linked to a widely shared version of the game, built by fan Matthew Barton, that approximates the gameplay of the version he built.
The “butthole” and “bush” are not the only things Robbins worked hard on. The sketch’s comedy is enhanced by all the little animation flourishes and gameplay quirks he programmed — all of which he went back and forth on with Robinson and co-creator Zach Kanin multiple times to get just right. One week after the release of season three, Robbins spoke about the specific considerations that went into these decisions, the more elaborate version of the game the world didn’t get to see, and his work in the emerging comedy-video game space.
How did you get the opportunity to work on this sketch? I worked on the first season of the show as a production coordinator, and I know Tim through that. He did a voice on a video game I write for called High on Life, so he knew I had ties to the video-game world. And then, at the same time, I’d worked on a bunch of stuff with one of the producers of the show, Jay Patumanoan. There was a show we worked on called The Dress Up Gang, where I was just practicing game development, and I made a game based on the show just for people who worked on the show to play. So he knew I could do something on this scale pretty quickly.
When they first came to you with the idea for the sketch, how much information did they give you? They had the idea for the game already. I knew it would be something you play at work where you drag eggs into a guy’s mouth, and that the game is nonsense and starts to fall apart the further you play. As soon as I read the script, I was like, Okay, I know what this needs to be. I understood that the first thing we’d have to figure out is what the basic game screen would look like. Those specific things weren’t described to me. I was like, “I think it would be good if there was a very clear visual target: a big open mouth makes sense, a basket of eggs makes sense.”
I sent over a bunch of different visual choices we could go with: an old 2000s Flash game, old ’90s PC edutainment games like Reader Rabbit, or even phone games full of microtransactions — because there was the whole thing about buying eggs and not getting the right amount in the script. We ended up settling on the old black-and-white vintage Mac look. It does feel like the sort of thing that would just be on an office computer, where you’re like, “What the hell is this? This is just on the desktop?”
An early mock-up of the game’s design.
Art: Alec Robbins
I know they edit these sketches down a lot to get to the final product. Were there other things you had to program the egg to do based on what was in the initial script? There was a lot more in the script! I would say 60 percent of the script remained in the final cut. I don’t know if I’m allowed to share what the cuts were, but I did have to design a lot more of the game than people got to see. I can say there was a credit sequence that had some jokes in it. The credits were also weird and jarring for a person’s co-workers to be looking at over their shoulder.
Why do you think it was important to make the game playable rather than just animate it? That’s huge! That didn’t actually come from me. Credit to everyone at I Think You Should Leave for thinking of doing it that way. But I agree with it, because I’ll watch a bunch of things with fake video games in them and they never look right. Or, even if they are real games, they’re not playing them the right way. I’ll see someone playing a two-player game by themself, or playing an online game and talking about high scores and lives. It’s an easy thing for Hollywood to mess up.
If you hire an animator to do it, that makes a lot of sense, because making a game seems insurmountable if you’re working in TV. But if you do it that way, you run the risk of not getting the feel of the game correct. I think a lot of the magic with I Think You Should Leave is getting that plausibility nailed down. This egg game is so much funnier if you can really envision yourself stumbling on it, like, Okay, so I drag the eggs and … Wait, the counter isn’t working right? Am I doing something wrong? Is the game being mean to me?
If I’m coming at it making a playable game, I’m making choices that an animator might not make. Making a big, circular mouth is game design! You’re saying, “This is the target.” In some shots, Tim was just going crazy with the mouse and slamming it onto the desk, and that’s not really playing anymore. The game is up and working, but he’s really just focusing on the mouse.
It’s funny that, when the game asks you if you want to buy more eggs, you have to physically type in “y-e-s.” Why did you make that choice? In the script, I think it specifically said he types it in, which is not how you would do that. That is insane. There are old text-adventure games that try to understand the syntax you type in, but you wouldn’t see that in an arcade game like this. I’m pretty sure that choice on their end came from understanding that that’s a strange thing for a video game. You start to wonder: What else could you type in? Would it respond to other prompts?
Yeah, if you write “no,” does the game just end? In reality, the secret is it doesn’t matter what you type in. In the version I built, you can just type nothing and hit enter, and it’ll progress. But I do love the idea of a game that accounts for the million different things you can type in: “no,” “yes,” “maybe?”
There’s this cannibalistic aspect of the game, where it’s about an egg that eats other eggs. Did you think a lot about the dynamic there? I think they might have known specifically what they wanted the egg to look like from the start, but I didn’t. I drew a bunch of different versions, including a humanoid one that was a guy with an egg head. In every single version, there’s a darkness to it: Why is this thing eating other eggs?
In the final product, we have a simple, dead-eyed egg. It wants the eggs and it doesn’t think too much about it, and that’s how it looks. But I drew one that was really scared; I had one that looks like it’s crying; and I had one that was a little horny and enjoyed it in a vaguely sexual manner. And all of those were playing with this idea of Why is it eating eggs?How can we illustrate that in the funniest way?
In case you’ve ever wondered what a “horny egg” looks like.
Art: Alec Robbins
You tweeted about the attention to detail you paid to the egg’s bush and butthole. Can you elaborate on that? I think the nature of the joke is that this is oddly explicit, like Why is this very minimalist, cutesy game suddenly so sexual? That meant the bush should be suggestive. I used this pixel brush — it was almost like a spray-paint brush — to do the bush. And I knew what I wanted with that right away.
The butthole, I credit Zach with that entirely, because I was trying too much stuff out. I tried a little x mark. I tried a classic circle. I did not know this before working on this, but he used to do New Yorker cartoons, so he knows how to do a visual gag. We were texting back and forth, and he had drawn a butthole that was just sort of a circle with a crescent crease. It had just a hint of depth to it. And that, to me, read as so realistic and specifically detailed. It tells a whole story. Then, it looks like someone’s spreading their cheeks open, so you can see tiny bits of skinfolds. The head peeking out from underneath is also really funny to me — you can see the egg’s eyes peeking out from the bottom as it bends over. That wasn’t always part of it.
The winning butthole.
Photo: Alec Robbins
Can you talk a little about your work in the world of comedy-video games? I’ve only ever made funny games. I made an indie game called Heartbreak High, which was a bit on dating simulators. It was a breakup simulator instead; you’re already dating everyone and you have to break up with everybody. Then, I also somehow found myself at this company, Squanch Games, which does some of the only comedy-forward video games I can think of in the industry.
Comedy in video games is pretty difficult to pull off, because unlike TV, movies, comics, or anything else, you don’t have full control over the comedic timing. The player can turn around and ruin the joke, or shoot something and ruin the joke. So a lot of it is almost like toy design, where you’re coming up with jokes that work in multiple dimensions — they have to account for the player doing different things that might interrupt the joke.
Can you think of comedy-video games like the one in the sketch, where they’re funny because they’re nonsensical or troll the user? At Squanch, we do a lot of what I call “hostile game design,” where it’s almost like you’re messing with the player a little bit. I learned a lot of it from Dark Souls. People don’t think of those as comedy games, but they’re very difficult. You’ll be asked to traverse a dungeon and you’ll step on a trap, and the trap will shoot an arrow at your head and you’ll die, and it’ll have this really funny comic timing. And you’ll be like, Okay, now I won’t step on that trap. Then, you step past the trap and a skeleton comes from around the corner and stabs you. And that’s a joke: The punch line is that if you avoid the trap, you still get killed.
We do a bunch of that at Squanch too. There’s a joke we did that I really like where there’s a guy standing next to a bicycle who tells you, “Hey, I need to go run an errand. Can you watch my bike for a second?” And you’re like, “Yeah, sure, I’ll watch your bike.” He runs off, and he’s like, “Make sure nobody takes it.” So you’re looking at the bike, and he never comes back. But the second you look away from the bike, it’s programmed to disappear. So if you look away for even a split second, it’ll be gone, and he’ll show right back up yelling at you, like, “Who stole my bike? You were supposed to watch it!” It’s designed to be an unwinnable task, and it’s very funny that way.
How closely does the fan-made version of the game you tweeted approximate the version you actually made? Here’s the thing: The fully playable real game is filled with things that no longer make sense because of the way the sketch was edited. And, by design, the game doesn’t really function. Even in the sketch, it doesn’t work. It’s playable, but it plays on a very guided path, where it mimics the events of the sketch. So there’s a bunch of work I would have to do to make it public-facing.
It’s really cool that a fan put this together! I’ve seen multiple fan-made versions at this point. The big one that’s going around, egggame.org, I talked to those people, and that one is great. It has the same text prompts we used, and it does the exact same thing I did, where no matter what you type, it works. They didn’t have the actual assets, so they had to re-create the egg drawings, and they’re slightly off from what I drew, but they really nailed it. I think the only thing that’s really missing is that I couldn’t get the dance to work. But maybe that’s in there. I think Tim actually thought I just uploaded that game. He was like, “Oh, you didn’t make that? That’s not the real one?” I was like “No, a fan made that!”
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(3),auth=require(12),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(1),appendLandingPageParams=require(136),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"1":1,"3":3,"12":12,"124":124,"136":136}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(408),Fingerprint2=require(407),DS=require(406),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(408),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"408":408,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]