diff --git a/.babelrc b/.babelrc index f3ada77c00c..48839bcdea4 100644 --- a/.babelrc +++ b/.babelrc @@ -18,6 +18,8 @@ "plugins": [ "@babel/plugin-proposal-class-properties", "@babel/plugin-transform-runtime", + "@babel/plugin-proposal-optional-chaining", + "@babel/plugin-proposal-nullish-coalescing-operator", [ "babel-plugin-styled-components", { diff --git a/package.json b/package.json index 764948ff759..f50fceaa486 100644 --- a/package.json +++ b/package.json @@ -74,9 +74,9 @@ "dependencies": { "@artsy/express-reloadable": "1.4.7", "@artsy/gemup": "0.0.3", - "@artsy/palette": "7.1.0", + "@artsy/palette": "7.1.1", "@artsy/passport": "1.1.11", - "@artsy/reaction": "25.18.0", + "@artsy/reaction": "25.18.1", "@artsy/stitch": "6.1.6", "@babel/core": "7.6.0", "@babel/node": "7.6.1", @@ -142,6 +142,7 @@ "embedly-view-helpers": "artsy/embedly-view-helpers", "es7-object-polyfill": "0.0.7", "express": "4.16.4", + "express-http-context": "1.2.3", "express-ipfilter": "0.2.1", "express-request-id": "1.4.0", "factor-bundle": "2.5.0", @@ -242,6 +243,8 @@ }, "devDependencies": { "@artsy/antigravity": "0.2.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.8.3", + "@babel/plugin-proposal-optional-chaining": "7.8.3", "@babel/plugin-transform-modules-commonjs": "7.6.0", "@graphql-inspector/core": "1.14.0", "@loadable/babel-plugin": "5.12.0", diff --git a/src/desktop/apps/experimental-app-shell/apps/artwork/artworkClient.tsx b/src/desktop/apps/experimental-app-shell/apps/artwork/artworkClient.tsx index 3c53aae1a75..7f4ab5503d4 100644 --- a/src/desktop/apps/experimental-app-shell/apps/artwork/artworkClient.tsx +++ b/src/desktop/apps/experimental-app-shell/apps/artwork/artworkClient.tsx @@ -11,9 +11,12 @@ export const artworkClient = () => { const ViewInRoomView = require("desktop/components/view_in_room/view.coffee") const $ = require("jquery") const mediator = require("desktop/lib/mediator.coffee") + const pageType = window.location.pathname.split("/")[1] - const artworkSlug = location.pathname.replace(/\/artwork\//, "") - recordArtworkView(artworkSlug, sd.CURRENT_USER) + if (pageType === "artwork") { + const artworkSlug = location.pathname.replace(/\/artwork\//, "") + recordArtworkView(artworkSlug, sd.CURRENT_USER) + } const openInquireableModal = ( artworkId: string, diff --git a/src/desktop/apps/experimental-app-shell/client.tsx b/src/desktop/apps/experimental-app-shell/client.tsx index 99ef02bd1d8..677b76bc298 100644 --- a/src/desktop/apps/experimental-app-shell/client.tsx +++ b/src/desktop/apps/experimental-app-shell/client.tsx @@ -17,20 +17,12 @@ buildClientApp({ } as any, }) .then(({ ClientApp }) => { - const pageType = window.location.pathname.split("/")[1] as - | "artist" - | "artwork" - /** * Mount route-specific client code here */ const mountClientAppSupport = () => { - switch (pageType) { - case "artist": - return artistClient() - case "artwork": - return artworkClient() - } + artistClient() + artworkClient() } loadableReady(() => { diff --git a/src/desktop/apps/experimental-app-shell/server.tsx b/src/desktop/apps/experimental-app-shell/server.tsx index b02a99f40ac..507db1f31e4 100644 --- a/src/desktop/apps/experimental-app-shell/server.tsx +++ b/src/desktop/apps/experimental-app-shell/server.tsx @@ -3,8 +3,8 @@ import express, { Request } from "express" import { buildServerApp } from "@artsy/reaction/dist/Artsy/Router/server" import { getAppRoutes } from "reaction/Apps/getAppRoutes" import { stitch } from "@artsy/stitch" -import { buildServerAppContext } from "desktop/lib/buildServerAppContext" +import { buildServerAppContext } from "desktop/lib/buildServerAppContext" import { handleArtworkImageDownload } from "./apps/artwork/artworkMiddleware" import { artistMiddleware } from "./apps/artist/artistMiddleware" import { bidderRegistrationMiddleware } from "./apps/auction/bidderRegistrationMiddleware" diff --git a/src/desktop/assets/main_layout.styl b/src/desktop/assets/main_layout.styl index 1d0825ffdf7..fe7c3dc6109 100644 --- a/src/desktop/assets/main_layout.styl +++ b/src/desktop/assets/main_layout.styl @@ -8,6 +8,7 @@ @require '../components/clock' @require '../components/recently_viewed_artworks' @require '../components/inquiry_questionnaire/stylesheets' +@require '../components/view_in_room' // TODO: Remove once Buyers Premium modal has been rebuilt in Reaction .artwork-auction-buyers-premium-modal diff --git a/src/desktop/components/split_test/middleware.coffee b/src/desktop/components/split_test/middleware.coffee index 3b93d088796..822d8819a78 100644 --- a/src/desktop/components/split_test/middleware.coffee +++ b/src/desktop/components/split_test/middleware.coffee @@ -1,6 +1,7 @@ SplitTest = require './server_split_test.coffee' runningTests = require './running_tests' qs = require 'qs' +{ setSplitTest } = require './splitTestContext' module.exports = (req, res, next) -> for key, configuration of runningTests @@ -15,4 +16,11 @@ module.exports = (req, res, next) -> test.set v res.locals.sd[k.toUpperCase()] = v + # TODO: Remove when the client nav AB test ends. + if runningTests['client_navigation_v3'] + res.locals.sd['EXPERIMENTAL_APP_SHELL'] = Boolean(res.locals.sd['CLIENT_NAVIGATION_V3'] is 'experiment') + + # Store value in globally available location. + setSplitTest('EXPERIMENTAL_APP_SHELL', res.locals.sd['EXPERIMENTAL_APP_SHELL']) + next() diff --git a/src/desktop/components/split_test/running_tests.coffee b/src/desktop/components/split_test/running_tests.coffee index 0d72add1a6a..2924c6fa55e 100644 --- a/src/desktop/components/split_test/running_tests.coffee +++ b/src/desktop/components/split_test/running_tests.coffee @@ -1,5 +1,7 @@ # Centralizes configuration for currently running split tests # +# USE: Append `?split_test[test_name]=experiment` query param in url. +# # eg. # header_design: # key: 'header_design' @@ -24,4 +26,10 @@ # this should export empty Object # module.exports = {} -module.exports = {} +module.exports = { + client_navigation_v3: + key: "client_navigation_v3" + outcomes: + control: 50 + experiment: 50 +} diff --git a/src/desktop/components/split_test/skipIfClientSideRoutingEnabled.ts b/src/desktop/components/split_test/skipIfClientSideRoutingEnabled.ts index 8ff62de1d69..334542f95e1 100644 --- a/src/desktop/components/split_test/skipIfClientSideRoutingEnabled.ts +++ b/src/desktop/components/split_test/skipIfClientSideRoutingEnabled.ts @@ -1,7 +1,9 @@ +import { getSplitTest } from "./splitTestContext" + export const skipIfClientSideRoutingEnabled = (_req, _res, next) => { if ( + getSplitTest("EXPERIMENTAL_APP_SHELL") || process.env.EXPERIMENTAL_APP_SHELL - // && res.locals.sd.CLIENT_NAVIGATION_V2 === "experiment" ) { return next("route") } else { diff --git a/src/desktop/components/split_test/splitTestContext.ts b/src/desktop/components/split_test/splitTestContext.ts new file mode 100644 index 00000000000..42ac72bc4eb --- /dev/null +++ b/src/desktop/components/split_test/splitTestContext.ts @@ -0,0 +1,10 @@ +import httpContext from "express-http-context" + +export function getSplitTest(ENV_VAR) { + const envVar = httpContext.get(ENV_VAR) + return envVar +} + +export function setSplitTest(ENV_VAR, value) { + httpContext.set(ENV_VAR, value) +} diff --git a/src/desktop/components/view_in_room/index.styl b/src/desktop/components/view_in_room/index.styl index 4b04055d108..b7c6923d0b3 100644 --- a/src/desktop/components/view_in_room/index.styl +++ b/src/desktop/components/view_in_room/index.styl @@ -32,7 +32,7 @@ view-in-room = { text-align center background-color gray-darker-color z-index 2 - opacity 0.6 + opacity 0 transition opacity 0.25s text-decoration none diff --git a/src/desktop/components/view_in_room/view.coffee b/src/desktop/components/view_in_room/view.coffee index ea55c845499..bf68db0004f 100644 --- a/src/desktop/components/view_in_room/view.coffee +++ b/src/desktop/components/view_in_room/view.coffee @@ -80,6 +80,8 @@ module.exports = class ViewInRoom extends Backbone.View artworkTransformCSS[key] = Math.abs artworkTransformCSS[key] * @roomScalingFactor() artworkTransformCSS['left'] = Math.floor ($(window).innerWidth() - artworkTransformCSS['width']) / 2 + $('.js-view-in-room-close').css('opacity', 1) + @$artwork .addClass 'is-transition' .css artworkTransformCSS @@ -161,6 +163,7 @@ module.exports = class ViewInRoom extends Backbone.View }) remove: -> + $('.js-view-in-room-close').remove() $(window).off 'resize.view-in-room' @transitionOut() .one $.support.transition.end, => diff --git a/src/desktop/index.js b/src/desktop/index.js index 47010101c1d..bed1f3edd70 100644 --- a/src/desktop/index.js +++ b/src/desktop/index.js @@ -1,5 +1,6 @@ import { middleware as stitchMiddleware } from "@artsy/stitch/dist/internal/middleware" import * as globalReactModules from "desktop/components/react/stitch_components" +import { getSplitTest } from "desktop/components/split_test/splitTestContext" const app = (module.exports = require("express")()) @@ -94,6 +95,9 @@ app.use(require("./apps/user")) // Used to test various SSR configurations app.use(require("./apps/ssr-experiments/server").app) -if (process.env.EXPERIMENTAL_APP_SHELL) { +if ( + getSplitTest("EXPERIMENTAL_APP_SHELL") || + process.env.EXPERIMENTAL_APP_SHELL +) { app.use(require("./apps/experimental-app-shell/server").app) } diff --git a/src/index.js b/src/index.js index 75787a0a1bd..3a816f503e4 100644 --- a/src/index.js +++ b/src/index.js @@ -33,9 +33,13 @@ const path = require("path") const { setAliases } = require("require-control") // Force resolution of potentially `yarn link`'d modules to the local node_modules -// folder. This gets around SSR issues involving single react context requirements. -// This is server-side only. Client-side must be resolved via webpack. +// folder. This gets around SSR issues involving single react context requirements, +// amongst other things. This is server-side only. Client-side must be resolved +// via webpack. setAliases({ + "express-http-context": path.resolve( + path.join(__dirname, "../node_modules/express-http-context") + ), react: path.resolve(path.join(__dirname, "../node_modules/react")), "react-dom": path.resolve(path.join(__dirname, "../node_modules/react-dom")), "styled-components": path.resolve( diff --git a/src/lib/setup.js b/src/lib/setup.js index e898f451702..225b541e44f 100644 --- a/src/lib/setup.js +++ b/src/lib/setup.js @@ -24,6 +24,7 @@ import siteAssociation from "artsy-eigen-web-association" import superSync from "backbone-super-sync" import { IpFilter as ipfilter } from "express-ipfilter" import timeout from "connect-timeout" +import httpContext from "express-http-context" import "./setup_sharify" import cache from "./cache" import downcase from "./middleware/downcase" @@ -208,6 +209,18 @@ export default function(app) { ) app.use("/(.well-known/)?apple-app-site-association", siteAssociation) + /** + * Add support for request-scoped contexts; meaning, a variable set in the + * scope of a request can be accessed outside of the express chain. Think, + * A/B tests. + * + * NOTE: some popular middlewares (such as body-parser, express-jwt) may cause + * context to get lost. To workaround such issues, you are advised to use any + * third party middleware that does NOT need the context BEFORE you use this + * middleware. + */ + app.use(httpContext.middleware) + // Redirect requests before they even have to deal with Force routing app.use(downcase) app.use(hardcodedRedirects) @@ -217,6 +230,7 @@ export default function(app) { app.use(escapedFragmentMiddleware) app.use(logger) app.use(unsupportedBrowserCheck) + if (NODE_ENV !== "test") app.use(splitTestMiddleware) app.use(addIntercomUserHash) app.use(pageCacheMiddleware) diff --git a/yarn.lock b/yarn.lock index d8708fff19e..9d2c7cbff45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,10 +35,10 @@ resolved "https://registry.yarnpkg.com/@artsy/gemup/-/gemup-0.0.3.tgz#0397a472bb69432dab3d2d66ca30556815aa96e7" integrity sha512-W///stXDTz3jSQw8UtT0BClVk4DLOsVp7a8v12efsEZvrZNT+85YBqPWq2DP1EX3ILZR1hGZhbKr/Gl5uti56Q== -"@artsy/palette@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@artsy/palette/-/palette-7.1.0.tgz#bd96b3e9825888ee89287d347f08b2a2f081b939" - integrity sha512-JgGbIuYRMSEBqP0dUfv1ACjPrrQXN8HDuyoNZnAxl+6KugaYIIHrlGB39nAK/Sc5Wrz/6vrHrnlryKsiShhsWw== +"@artsy/palette@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@artsy/palette/-/palette-7.1.1.tgz#22a4088ddf4d0efe0af97aac40ecca849450b70c" + integrity sha512-XS5uPczGgscy5LKMxK/oB6WWHcxBdoH7SDgVjsoSdsq6yzJ07PhVnJ8hsqQYRoFYNG6f0d8W7MS/cEZstwYfvg== dependencies: babel-plugin-styled-components "^1.10.0" d3-interpolate "^1.3.2" @@ -76,10 +76,10 @@ resolved "https://registry.yarnpkg.com/@artsy/react-html-parser/-/react-html-parser-3.0.2.tgz#6213d662441acf0bd8c9ee953aa77ac8d9cf1cdd" integrity sha512-FXiRSqfSvwpz/QgwaqFvjJsbDmo9qMGpvUp/0p1V6muaJbGnfxkTSxAYWmYlFst6bmjhVxCYKxvgQhEVE03Wfg== -"@artsy/reaction@25.18.0": - version "25.18.0" - resolved "https://registry.yarnpkg.com/@artsy/reaction/-/reaction-25.18.0.tgz#d5b0b6f432bd526e037c5906cc55abb7816c79b7" - integrity sha512-65cXbo3vDBHMkuGZjsyZJmRtWx7jk/BtKDkUJ82eTIShx7tUQVsXQULtwmXmiVsXa5nVb70E1Myv+dEJm2d8Nw== +"@artsy/reaction@25.18.1": + version "25.18.1" + resolved "https://registry.yarnpkg.com/@artsy/reaction/-/reaction-25.18.1.tgz#0d167c5872a64d9d6fd3d7c4382b8f622026cc8f" + integrity sha512-XOEKiuMPeCx114bWLghACFiQfHT0FVrl3h9sHNTBEY/eBM339fTlypFPeUhlp6E7/E8LXnXw2EmZoCn/TqIXEg== dependencies: "@artsy/detect-responsive-traits" "^0.0.5" "@artsy/fresnel" "^1.0.13" @@ -350,7 +350,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== @@ -495,6 +495,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" +"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-proposal-object-rest-spread@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" @@ -511,6 +519,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" +"@babel/plugin-proposal-optional-chaining@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" + integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" @@ -562,6 +578,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" @@ -576,6 +599,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-typescript@^7.2.0": version "7.3.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" @@ -1365,6 +1395,13 @@ resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.7.tgz#4a92eafedfb2b9f4437d3a4410006d81114c66ce" integrity sha512-+T9qBbqe/jXtTjzVddArZExahoPPmt8eq3O1ZuCKZXjBVxf/ciUYNXrIDZJEVgYvpELnv6VlPRCfLzufRxpAag== +"@types/cls-hooked@^4.2.1": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@types/cls-hooked/-/cls-hooked-4.3.0.tgz#290fa14946b88b11e65d68e487eda78a4d5a927e" + integrity sha512-H2ov/zMqgs7b66dkfufx3SXMnYFn6u9IOMEY7JZYWXJhE/WVZogedXsQIgM/504DyvtbNNXMiofaRr1E0+3yZA== + dependencies: + "@types/node" "*" + "@types/dd-trace@0.6.0": version "0.6.0" resolved "https://registry.yarnpkg.com/@types/dd-trace/-/dd-trace-0.6.0.tgz#6323324e6f1228290dac84df15da2267dc87ac4a" @@ -1401,6 +1438,15 @@ "@types/express-serve-static-core" "*" "@types/serve-static" "*" +"@types/express@^4.16.0": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.2.tgz#a0fb7a23d8855bac31bc01d5a58cadd9b2173e6c" + integrity sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -3744,6 +3790,15 @@ clone@^2.1.1: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= +cls-hooked@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/cls-hooked/-/cls-hooked-4.2.2.tgz#ad2e9a4092680cdaffeb2d3551da0e225eae1908" + integrity sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw== + dependencies: + async-hook-jl "^1.7.6" + emitter-listener "^1.0.1" + semver "^5.4.1" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -5336,6 +5391,13 @@ emitter-component@~1.1.0: resolved "https://registry.yarnpkg.com/emitter-component/-/emitter-component-1.1.1.tgz#065e2dbed6959bf470679edabeaf7981d1003ab6" integrity sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY= +emitter-listener@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/emitter-listener/-/emitter-listener-1.1.2.tgz#56b140e8f6992375b3d7cb2cab1cc7432d9632e8" + integrity sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ== + dependencies: + shimmer "^1.2.0" + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -6113,6 +6175,15 @@ expect@^23.6.0: jest-message-util "^23.4.0" jest-regex-util "^23.3.0" +express-http-context@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/express-http-context/-/express-http-context-1.2.3.tgz#780c96006e5b6f0a384a175afb35b40411d4f331" + integrity sha512-Cde8XZJ8qYc4ACZSwn2NxuBG6mnPfXDtJUW+Ppgb2AhyNP4ttESK2SrYfAk6CluFADbxy24C5mVP25sOeBAgbQ== + dependencies: + "@types/cls-hooked" "^4.2.1" + "@types/express" "^4.16.0" + cls-hooked "^4.2.2" + express-ipfilter@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/express-ipfilter/-/express-ipfilter-0.2.1.tgz#356736a38d06561f31478e089f773dfee585bb57"