diff --git a/.vscode/settings.json b/.vscode/settings.json index 25fa6215fdd..e01d2a45bb7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,12 @@ { - "typescript.tsdk": "node_modules/typescript/lib" -} + "typescript.tsdk": "node_modules/typescript/lib", + "deno.enablePaths": [ + "./templates/deno/", + "./templates/netlify/remix.init/edge-server.js", + "./packages/remix-netlify-edge/mod.ts", + "./packages/remix-netlify-edge/server.ts", + "./packages/remix-netlify-edge/remix-deno/" + ], + "deno.unstable": true, + "deno.importMap": "deno-import-map.json" +} \ No newline at end of file diff --git a/deno-import-map.json b/deno-import-map.json new file mode 100644 index 00000000000..59f1b452fc9 --- /dev/null +++ b/deno-import-map.json @@ -0,0 +1,9 @@ +{ + "imports": { + "netlify:edge": "https://edge-bootstrap.netlify.app/v1/index.ts", + "@remix-run/netlify-edge": "./packages/remix-netlify-edge/mod.ts", + "@remix-run/netlify-edge/deno": "./packages/remix-netlify-edge/remix-deno/mod.ts", + "@remix-run/dev/server-build": "https://esm.sh/@remix-run/dev/server-build", + "@remix-run/server-runtime": "https://esm.sh/@remix-run/server-runtime@1.4.1?pin=v77" + } +} diff --git a/package.json b/package.json index 02c35e32277..0ffbcea16e3 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "packages/remix-eslint-config", "packages/remix-express", "packages/remix-netlify", + "packages/remix-netlify-edge", "packages/remix-node", "packages/remix-react", "packages/remix-serve", diff --git a/packages/remix-dev/compiler.ts b/packages/remix-dev/compiler.ts index ac165fe9b7a..9442aec7c14 100644 --- a/packages/remix-dev/compiler.ts +++ b/packages/remix-dev/compiler.ts @@ -353,7 +353,10 @@ async function createBrowserBuild( NodeModulesPolyfillPlugin(), ]; - if (config.serverBuildTarget === "deno") { + if ( + config.serverBuildTarget === "deno" || + config.serverBuildTarget === "netlify-edge" + ) { // @ts-expect-error let { cache } = await import("esbuild-plugin-cache"); plugins.unshift( @@ -431,6 +434,58 @@ function createServerBuild( plugins.unshift(NodeModulesPolyfillPlugin()); } + if (config.serverBuildTarget === "netlify-edge") { + let edgeManifest = { + functions: [{ function: "server", path: "/*" }], + import_map: "../remix-import-map.json", + version: 1, + }; + let edgeDir = path.dirname(config.serverBuildPath); + + fse.ensureDirSync(edgeDir); + fse.writeJSONSync(path.join(edgeDir, "manifest.json"), edgeManifest); + + // This generated import map is processed by the netlify CLI and combined with the internal map + let importMapPath = path.join( + config.rootDirectory, + ".netlify", + "remix-import-map.json" + ); + + let runtimePath: string | undefined; + + try { + // If the user has it locally-installed, use that + runtimePath = `file://${require.resolve( + "@remix-run/netlify-edge/mod.ts", + { + paths: [config.rootDirectory], + } + )}`; + } catch { + // ...otherwise, load it from the package URL. The env var is so we can override in dev. + runtimePath = + process.env.NETLIFY_EDGE_RUNTIME_PATH ?? + "https://unpkg.com/@remix-run/netlify-edge@experimental-netlify-edge/mod.ts"; + } + + let buildPath = require.resolve("./server-build.d.ts"); + + if (runtimePath) { + let importMap = { + imports: { + "@remix-run/netlify-edge": runtimePath, + "@remix-run/dev/server-build": `file://${buildPath}`, + "@remix-run/server-runtime": + "https://esm.sh/@remix-run/server-runtime@1.4.1?pin=v77", + }, + }; + + fse.ensureDirSync(path.dirname(importMapPath)); + fse.writeJSONSync(importMapPath, importMap); + } + } + return esbuild .build({ absWorkingDir: config.rootDirectory, diff --git a/packages/remix-dev/compiler/plugins/serverBareModulesPlugin.ts b/packages/remix-dev/compiler/plugins/serverBareModulesPlugin.ts index eea09649103..cbe39c4d484 100644 --- a/packages/remix-dev/compiler/plugins/serverBareModulesPlugin.ts +++ b/packages/remix-dev/compiler/plugins/serverBareModulesPlugin.ts @@ -11,6 +11,12 @@ import { } from "../virtualModules"; import { createMatchPath } from "../utils/tsconfig"; +// Modules that have Deno import mappings +const denoModules = new Set([ + "@remix-run/netlify-edge", + "@remix-run/server-runtime", +]); + /** * A plugin responsible for resolving bare module ids based on server target. * This includes externalizing for node based plaforms, and bundling for single file @@ -80,10 +86,19 @@ export function serverBareModulesPlugin( } switch (remixConfig.serverBuildTarget) { - // Always bundle everything for cloudflare. + // Always bundle everything for Cloudflare case "cloudflare-pages": case "cloudflare-workers": return undefined; + case "netlify-edge": + // Bundle everything except URL imports and aliased modules for Netlify Edge + if ( + !path.startsWith("https:") && + !path.startsWith("file:") && + !denoModules.has(path) + ) { + return undefined; + } } for (let pattern of remixConfig.serverDependenciesToBundle) { diff --git a/packages/remix-dev/config.ts b/packages/remix-dev/config.ts index 3214b27bcae..92b4d2f4ab5 100644 --- a/packages/remix-dev/config.ts +++ b/packages/remix-dev/config.ts @@ -21,6 +21,7 @@ export type ServerBuildTarget = | "node-cjs" | "arc" | "netlify" + | "netlify-edge" | "vercel" | "cloudflare-pages" | "cloudflare-workers" @@ -290,6 +291,7 @@ export async function readConfig( case "cloudflare-pages": case "cloudflare-workers": case "deno": + case "netlify-edge": serverModuleFormat = "esm"; serverPlatform = "neutral"; break; @@ -328,6 +330,9 @@ export async function readConfig( case "netlify": serverBuildPath = ".netlify/functions-internal/server.js"; break; + case "netlify-edge": + serverBuildPath = ".netlify/edge-functions/server.js"; + break; case "vercel": serverBuildPath = "api/index.js"; break; diff --git a/packages/remix-netlify-edge/README.md b/packages/remix-netlify-edge/README.md new file mode 100644 index 00000000000..40685a7476f --- /dev/null +++ b/packages/remix-netlify-edge/README.md @@ -0,0 +1,13 @@ +# Welcome to Remix! + +[Remix](https://remix.run) is a web framework that helps you build better websites with React. + +To get started, open a new shell and run: + +```sh +npx create-remix@latest +``` + +Then follow the prompts you see in your terminal. + +For more information about Remix, [visit remix.run](https://remix.run)! diff --git a/packages/remix-netlify-edge/index.d.ts b/packages/remix-netlify-edge/index.d.ts new file mode 100644 index 00000000000..3428a5ec5bc --- /dev/null +++ b/packages/remix-netlify-edge/index.d.ts @@ -0,0 +1,33 @@ +import type { + CreateCookieFunction, + CreateCookieSessionStorageFunction, + CreateSessionStorageFunction, + CreateMemorySessionStorageFunction, + ServerBuild, +} from "@remix-run/server-runtime"; + +interface BaseContext { + next: (options?: { sendConditionalRequest?: boolean }) => Promise; +} +export declare function createRequestHandler< + Context extends BaseContext = BaseContext +>({ + build, + mode, + getLoadContext, +}: { + build: ServerBuild; + mode?: string; + getLoadContext?: ( + request: Request, + context?: Context + ) => Promise | Context; +}): (request: Request, context: Context) => Promise; +export {}; + +export * from "@remix-run/server-runtime"; + +export const createCookie: CreateCookieFunction; +export const createCookieSessionStorage: CreateCookieSessionStorageFunction; +export const createSessionStorage: CreateSessionStorageFunction; +export const createMemorySessionStorage: CreateMemorySessionStorageFunction; diff --git a/packages/remix-netlify-edge/index.js b/packages/remix-netlify-edge/index.js new file mode 100644 index 00000000000..64ae914463b --- /dev/null +++ b/packages/remix-netlify-edge/index.js @@ -0,0 +1,12 @@ +/** + * @remix-run/netlify-edge + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */ + +// This package is meant to be imported by Deno, but includes types for Node diff --git a/packages/remix-netlify-edge/mod.ts b/packages/remix-netlify-edge/mod.ts new file mode 100644 index 00000000000..1db3cc9e501 --- /dev/null +++ b/packages/remix-netlify-edge/mod.ts @@ -0,0 +1,48 @@ +export { createRequestHandler } from "./server.ts"; +export type { + ActionFunction, + AppData, + AppLoadContext, + CreateRequestHandlerFunction, + Cookie, + CookieOptions, + CookieParseOptions, + CookieSerializeOptions, + CookieSignatureOptions, + DataFunctionArgs, + EntryContext, + ErrorBoundaryComponent, + HandleDataRequestFunction, + HandleDocumentRequestFunction, + HeadersFunction, + HtmlLinkDescriptor, + HtmlMetaDescriptor, + LinkDescriptor, + LinksFunction, + LoaderFunction, + MetaDescriptor, + MetaFunction, + PageLinkDescriptor, + RequestHandler, + RouteComponent, + RouteHandle, + ServerBuild, + ServerEntryModule, + Session, + SessionData, + SessionIdStorageStrategy, + SessionStorage, +} from "https://esm.sh/@remix-run/server-runtime@1.4.1"; +export { + createSession, + isCookie, + isSession, + json, + redirect, +} from "https://esm.sh/@remix-run/server-runtime@1.4.1"; +export { + createCookie, + createCookieSessionStorage, + createMemorySessionStorage, + createSessionStorage, +} from "./remix-deno/implementations.ts"; diff --git a/packages/remix-netlify-edge/package.json b/packages/remix-netlify-edge/package.json new file mode 100644 index 00000000000..69410e22323 --- /dev/null +++ b/packages/remix-netlify-edge/package.json @@ -0,0 +1,29 @@ +{ + "name": "@remix-run/netlify-edge", + "description": "Netlify Edge platform abstractions for Remix", + "version": "1.0.0", + "license": "MIT", + "type": "module", + "main": "./index.js", + "types": "./index.d.ts", + "exports": { + ".": "./index.js", + "./mod.ts": "./mod.ts", + "./deno": "./remix-deno/mod.ts" + }, + "repository": { + "type": "git", + "url": "https://github.com/remix-run/remix", + "directory": "packages/remix-netlify-edge" + }, + "bugs": { + "url": "https://github.com/remix-run/remix/issues" + }, + "files": [ + "**/*.ts", + "index.js" + ], + "peerDependencies": { + "@remix-run/server-runtime": "*" + } +} diff --git a/packages/remix-netlify-edge/remix-deno/README.md b/packages/remix-netlify-edge/remix-deno/README.md new file mode 100644 index 00000000000..a591d709a98 --- /dev/null +++ b/packages/remix-netlify-edge/remix-deno/README.md @@ -0,0 +1,4 @@ +# @remix-run/deno + +`@remix-run/deno` package is temporarily inlined within this directory while Deno support is experimental. +In the future, this directory would be removed and Remix + Deno apps would import `@remix-run/deno` from some URL. \ No newline at end of file diff --git a/packages/remix-netlify-edge/remix-deno/crypto.ts b/packages/remix-netlify-edge/remix-deno/crypto.ts new file mode 100644 index 00000000000..70fb5fd7033 --- /dev/null +++ b/packages/remix-netlify-edge/remix-deno/crypto.ts @@ -0,0 +1,54 @@ +import type { + SignFunction, + UnsignFunction, +} from "https://esm.sh/@remix-run/server-runtime?pin=v77"; + +const encoder = new TextEncoder(); + +export const sign: SignFunction = async (value, secret) => { + let key = await crypto.subtle.importKey( + "raw", + encoder.encode(secret), + { name: "HMAC", hash: "SHA-256" }, + false, + ["sign"] + ); + + let data = encoder.encode(value); + let signature = await crypto.subtle.sign("HMAC", key, data); + let hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace( + /=+$/, + "" + ); + + return value + "." + hash; +}; + +export const unsign: UnsignFunction = async (cookie, secret) => { + let key = await crypto.subtle.importKey( + "raw", + encoder.encode(secret), + { name: "HMAC", hash: "SHA-256" }, + false, + ["verify"] + ); + + let value = cookie.slice(0, cookie.lastIndexOf(".")); + let hash = cookie.slice(cookie.lastIndexOf(".") + 1); + + let data = encoder.encode(value); + let signature = byteStringToUint8Array(atob(hash)); + let valid = await crypto.subtle.verify("HMAC", key, signature, data); + + return valid ? value : false; +}; + +function byteStringToUint8Array(byteString: string): Uint8Array { + let array = new Uint8Array(byteString.length); + + for (let i = 0; i < byteString.length; i++) { + array[i] = byteString.charCodeAt(i); + } + + return array; +} diff --git a/packages/remix-netlify-edge/remix-deno/globals.d.ts b/packages/remix-netlify-edge/remix-deno/globals.d.ts new file mode 100644 index 00000000000..b63800669a0 --- /dev/null +++ b/packages/remix-netlify-edge/remix-deno/globals.d.ts @@ -0,0 +1,10 @@ +export {}; +declare global { + interface ProcessEnv { + NODE_ENV: "development" | "production" | "test"; + } + interface Process { + env: ProcessEnv; + } + let process: Process; +} diff --git a/packages/remix-netlify-edge/remix-deno/implementations.ts b/packages/remix-netlify-edge/remix-deno/implementations.ts new file mode 100644 index 00000000000..c7ca5aae404 --- /dev/null +++ b/packages/remix-netlify-edge/remix-deno/implementations.ts @@ -0,0 +1,15 @@ +import { + createCookieFactory, + createCookieSessionStorageFactory, + createMemorySessionStorageFactory, + createSessionStorageFactory, +} from "https://esm.sh/@remix-run/server-runtime?pin=v77"; + +import { sign, unsign } from "./crypto.ts"; + +export const createCookie = createCookieFactory({ sign, unsign }); +export const createCookieSessionStorage = + createCookieSessionStorageFactory(createCookie); +export const createSessionStorage = createSessionStorageFactory(createCookie); +export const createMemorySessionStorage = + createMemorySessionStorageFactory(createSessionStorage); diff --git a/packages/remix-netlify-edge/remix-deno/mod.ts b/packages/remix-netlify-edge/remix-deno/mod.ts new file mode 100644 index 00000000000..0ca12806659 --- /dev/null +++ b/packages/remix-netlify-edge/remix-deno/mod.ts @@ -0,0 +1,50 @@ +import "./globals.d.ts"; +export { + createCookie, + createCookieSessionStorage, + createMemorySessionStorage, + createSessionStorage, +} from "./implementations.ts"; + +export { + createSession, + isCookie, + isSession, + json, + redirect, +} from "https://esm.sh/@remix-run/server-runtime?pin=v77"; + +export type { + ActionFunction, + AppData, + AppLoadContext, + CreateRequestHandlerFunction, + Cookie, + CookieOptions, + CookieParseOptions, + CookieSerializeOptions, + CookieSignatureOptions, + DataFunctionArgs, + EntryContext, + ErrorBoundaryComponent, + HandleDataRequestFunction, + HandleDocumentRequestFunction, + HeadersFunction, + HtmlLinkDescriptor, + HtmlMetaDescriptor, + LinkDescriptor, + LinksFunction, + LoaderFunction, + MetaDescriptor, + MetaFunction, + PageLinkDescriptor, + RequestHandler, + RouteComponent, + RouteHandle, + ServerBuild, + ServerEntryModule, + Session, + SessionData, + SessionIdStorageStrategy, + SessionStorage, +} from "https://esm.sh/@remix-run/server-runtime?pin=v77"; diff --git a/packages/remix-netlify-edge/server.ts b/packages/remix-netlify-edge/server.ts new file mode 100644 index 00000000000..616a36a1ff3 --- /dev/null +++ b/packages/remix-netlify-edge/server.ts @@ -0,0 +1,58 @@ +import type { ServerBuild } from "https://esm.sh/@remix-run/server-runtime@1.3.5?pin=v77"; +import { createRequestHandler as createRemixRequestHandler } from "https://esm.sh/@remix-run/server-runtime@1.3.5?pin=v77"; + +// This can be replaced with the full context type when that is published +interface BaseContext { + next: (options?: { sendConditionalRequest?: boolean }) => Promise; +} + +export function createRequestHandler< + Context extends BaseContext = BaseContext +>({ + build, + mode, + getLoadContext, +}: { + build: ServerBuild; + mode?: string; + getLoadContext?: ( + request: Request, + context?: Context + ) => Promise | Context; +}) { + let remixHandler = createRemixRequestHandler(build, mode); + + let assetPath = build.assets.url.split("/").slice(0, -1).join("/"); + + return async ( + request: Request, + context: Context + ): Promise => { + let { pathname } = new URL(request.url); + // Skip the handler for static files + if (pathname.startsWith(`${assetPath}/`)) { + return; + } + try { + let loadContext = getLoadContext + ? await getLoadContext(request, context) + : context; + + let response = await remixHandler(request, loadContext); + if (response.status === 404) { + // Check if there is a matching static file + let originResponse = await context.next({ + sendConditionalRequest: true, + }); + if (originResponse.status !== 404) { + return originResponse; + } + } + return response; + } catch (e) { + console.error(e); + + return new Response("Internal Error", { status: 500 }); + } + }; +} diff --git a/packages/remix-netlify-edge/tsconfig.json b/packages/remix-netlify-edge/tsconfig.json new file mode 100644 index 00000000000..a0733d92d28 --- /dev/null +++ b/packages/remix-netlify-edge/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": [ + "**/*.ts" + ], + "compilerOptions": { + "lib": [ + "ES2019", + "WebWorker" + ], + "target": "ES2019", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "strict": true, + "declaration": true, + "emitDeclarationOnly": true, + "outDir": "../../build/node_modules/@remix-run/netlify-edge", + "rootDir": ".", + // Avoid naming conflicts between history and react-router-dom relying on + // lib.dom.d.ts Window and this being a WebWorker env. + "skipLibCheck": true + } +} \ No newline at end of file diff --git a/packages/remix-netlify/package.json b/packages/remix-netlify/package.json index 0dbb9dc25c6..58561ca6ac8 100644 --- a/packages/remix-netlify/package.json +++ b/packages/remix-netlify/package.json @@ -15,9 +15,9 @@ "@remix-run/node": "1.4.1" }, "peerDependencies": { - "@netlify/functions": "^0.10.0" + "@netlify/functions": "^1.0.0" }, "devDependencies": { - "@netlify/functions": "^0.10.0" + "@netlify/functions": "^1.0.0" } } diff --git a/scripts/publish.js b/scripts/publish.js index b723471d2b7..b7d1862618d 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -35,6 +35,8 @@ async function run() { // Publish eslint config directly from the package directory publish(path.join(packageDir, "remix-eslint-config"), tag); + publish(path.join(packageDir, "remix-netlify-edge"), tag); + // Publish all @remix-run/* packages for (let name of [ "dev", diff --git a/templates/netlify/app/entry.server.tsx b/templates/netlify/app/entry.server.tsx index aa0aa0978b1..ff25f886acc 100644 --- a/templates/netlify/app/entry.server.tsx +++ b/templates/netlify/app/entry.server.tsx @@ -1,4 +1,4 @@ -import type { EntryContext } from "@remix-run/node"; +import type { EntryContext } from "@remix-run/server-runtime"; import { RemixServer } from "@remix-run/react"; import { renderToString } from "react-dom/server"; diff --git a/templates/netlify/app/root.tsx b/templates/netlify/app/root.tsx index 927a0f745df..0a2fa73ee38 100644 --- a/templates/netlify/app/root.tsx +++ b/templates/netlify/app/root.tsx @@ -1,4 +1,4 @@ -import type { MetaFunction } from "@remix-run/node"; +import type { MetaFunction } from "@remix-run/server-runtime"; import { Links, LiveReload, diff --git a/templates/netlify/netlify.toml b/templates/netlify/netlify.toml index fd51b27efe4..ea741ab4ac8 100644 --- a/templates/netlify/netlify.toml +++ b/templates/netlify/netlify.toml @@ -1,17 +1,18 @@ [build] - command = "remix build" - publish = "public" +command = "remix build" +publish = "public" [dev] - command = "remix watch" - port = 3000 +command = "remix watch" +port = 3000 [[redirects]] - from = "/*" - to = "/.netlify/functions/server" - status = 200 +from = "/*" +to = "/.netlify/functions/server" +status = 200 [[headers]] - for = "/build/*" - [headers.values] - "Cache-Control" = "public, max-age=31536000, s-maxage=31536000" +for = "/build/*" + +[headers.values] +"Cache-Control" = "public, max-age=31536000, s-maxage=31536000" diff --git a/templates/netlify/package.json b/templates/netlify/package.json index 8312d22b611..07de55870b7 100644 --- a/templates/netlify/package.json +++ b/templates/netlify/package.json @@ -10,7 +10,7 @@ "start": "cross-env NODE_ENV=production netlify dev" }, "dependencies": { - "@netlify/functions": "^0.10.0", + "@netlify/functions": "latest", "@remix-run/netlify": "*", "@remix-run/node": "*", "@remix-run/react": "*", diff --git a/templates/netlify/remix.init/README.md b/templates/netlify/remix.init/README.md new file mode 100644 index 00000000000..93a398ad5ca --- /dev/null +++ b/templates/netlify/remix.init/README.md @@ -0,0 +1,51 @@ +# Welcome to Remix! + +- [Remix Docs](https://remix.run/docs) + +## Netlify Setup + +1. Install the [Netlify CLI](https://www.netlify.com/products/dev/): + +```sh +npm i -g netlify-cli +``` + +If you have previously installed the Netlify CLI, you should update it to the latest version: + +```sh +npm i -g netlify-cli@latest +``` + +2. Sign up and log in to Netlify: + +```sh +netlify login +``` + +3. Create a new site: + +```sh +netlify init +``` + +## Development + +The Netlify CLI starts your app in development mode, rebuilding assets on file changes. + +```sh +npm run dev +``` + +Open up [http://localhost:3000](http://localhost:3000), and you should be ready to go! + +## Deployment + +There are two ways to deploy your app to Netlify, you can either link your app to your git repo and have it auto deploy changes to Netlify, or you can deploy your app manually. If you've followed the setup instructions already, all you need to do is run this: + +```sh +# preview deployment +netlify deploy --build + +# production deployment +netlify deploy --build --prod +``` diff --git a/templates/netlify/remix.init/edge-server.js b/templates/netlify/remix.init/edge-server.js new file mode 100644 index 00000000000..71434d0c297 --- /dev/null +++ b/templates/netlify/remix.init/edge-server.js @@ -0,0 +1,8 @@ +// Import path interpreted by the Remix compiler +import * as build from "@remix-run/dev/server-build"; +import { createRequestHandler } from "@remix-run/netlify-edge"; +export default createRequestHandler({ + build, + // process.env.NODE_ENV is provided by Remix at compile time + mode: process.env.NODE_ENV, +}); diff --git a/templates/netlify/remix.init/index.js b/templates/netlify/remix.init/index.js new file mode 100644 index 00000000000..5fcbaadcab2 --- /dev/null +++ b/templates/netlify/remix.init/index.js @@ -0,0 +1,47 @@ +const inquirer = require("inquirer"); +const fs = require("fs/promises"); +const { join } = require("path"); + +const files = [ + ["README.md"], + ["netlify.toml"], + ["edge-server.js", "server.js"], + ["remix.config-edge.js", "remix.config.js"], + ["vscode.json", join(".vscode", "settings.json")], +]; + +async function main({ rootDirectory }) { + if (await shouldUseEdge()) { + await fs.mkdir(join(rootDirectory, ".vscode")); + + for (let [file, target] of files) { + await fs.copyFile( + join(__dirname, file), + join(rootDirectory, target || file) + ); + } + } +} + +async function shouldUseEdge() { + let { edge } = await inquirer.prompt([ + { + name: "edge", + type: "list", + message: "Run your Remix site with:", + choices: [ + { + name: "Netlify Functions - Choose this for stable support for production sites", + value: false, + }, + { + name: "Netlify Edge Functions (beta) - Try this for improved performance on non-critical sites", + value: true, + }, + ], + }, + ]); + return edge; +} + +module.exports = main; diff --git a/templates/netlify/remix.init/netlify.toml b/templates/netlify/remix.init/netlify.toml new file mode 100644 index 00000000000..e6ee338bd9a --- /dev/null +++ b/templates/netlify/remix.init/netlify.toml @@ -0,0 +1,13 @@ +[build] +command = "remix build" +publish = "public" + +[dev] +command = "remix watch" +port = 3000 + +[[headers]] +for = "/build/*" + +[headers.values] +"Cache-Control" = "public, max-age=31536000, s-maxage=31536000" diff --git a/templates/netlify/remix.init/package-lock.json b/templates/netlify/remix.init/package-lock.json new file mode 100644 index 00000000000..16e380761cc --- /dev/null +++ b/templates/netlify/remix.init/package-lock.json @@ -0,0 +1,917 @@ +{ + "name": "remix.init", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "remix.init", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "inquirer": "^8.2.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inquirer": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.2.tgz", + "integrity": "sha512-pG7I/si6K/0X7p1qU+rfWnpTE1UIkTONN1wxtzh0d+dHXtT/JG6qBgLxoyHVsQa8cFABxAPh0pD6uUUHiAoaow==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dependencies": { + "defaults": "^1.0.3" + } + } + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "inquirer": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.2.tgz", + "integrity": "sha512-pG7I/si6K/0X7p1qU+rfWnpTE1UIkTONN1wxtzh0d+dHXtT/JG6qBgLxoyHVsQa8cFABxAPh0pD6uUUHiAoaow==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + } + } +} diff --git a/templates/netlify/remix.init/package.json b/templates/netlify/remix.init/package.json new file mode 100644 index 00000000000..18c0e439ea6 --- /dev/null +++ b/templates/netlify/remix.init/package.json @@ -0,0 +1,10 @@ +{ + "name": "remix.init", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "private": true, + "dependencies": { + "inquirer": "^8.2.2" + } +} diff --git a/templates/netlify/remix.init/remix.config-edge.js b/templates/netlify/remix.init/remix.config-edge.js new file mode 100644 index 00000000000..17a92d956ae --- /dev/null +++ b/templates/netlify/remix.init/remix.config-edge.js @@ -0,0 +1,8 @@ +/** + * @type {import('@remix-run/dev').AppConfig} + */ +module.exports = { + serverBuildTarget: "netlify-edge", + server: "./server.js", + ignoredRouteFiles: [".*"], +}; diff --git a/templates/netlify/remix.init/vscode.json b/templates/netlify/remix.init/vscode.json new file mode 100644 index 00000000000..7e1abd18a1a --- /dev/null +++ b/templates/netlify/remix.init/vscode.json @@ -0,0 +1,10 @@ +{ + "deno.enablePaths": [ + "server.js", + "server.ts", + "netlify/edge-functions/", + ".netlify/edge-functions/" + ], + "deno.unstable": true, + "deno.importMap": ".netlify/edge-functions-import-map.json" +} diff --git a/yarn.lock b/yarn.lock index 4b519f4cc93..854bd4a4219 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1371,10 +1371,10 @@ outvariant "^1.2.1" strict-event-emitter "^0.2.0" -"@netlify/functions@^0.10.0": - version "0.10.0" - resolved "https://registry.npmjs.org/@netlify/functions/-/functions-0.10.0.tgz" - integrity sha512-NNFADTPnokuoMY1OUhaXlE/Jrzk5lHOl1uB4L/8pw1UJ/CaectZJACMExijbJnqaKIhOQG0WmbBQUh1lgnK/Qg== +"@netlify/functions@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@netlify/functions/-/functions-1.0.0.tgz#5b6c02fafc567033c93b15a080cc021e5f10f254" + integrity sha512-7fnJv3vr8uyyyOYPChwoec6MjzsCw1CoRUO2DhQ1BD6bOyJRlD4DUaOOGlMILB2LCT8P24p5LexEGx8AJb7xdA== dependencies: is-promise "^4.0.0" @@ -3727,6 +3727,13 @@ core-util-is@~1.0.0: resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" @@ -3738,7 +3745,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==