| #
46f023fa |
| 15-Sep-2023 |
Evan Bacon <[email protected]> |
[RFC] API Routes in Expo Router (#24429)
# Why
Servers are an important part of developing many different types of
apps, but they're much harder to configure than they need to be.
API Routes
[RFC] API Routes in Expo Router (#24429)
# Why
Servers are an important part of developing many different types of
apps, but they're much harder to configure than they need to be.
API Routes will enable users to express some abstract JavaScript code
that runs in a server by simply creating a file in the app directory,
and adding the `+api.js` suffix. For example, to securely interact with
OpenAI, simply:
```ts
// app/generate+api.ts
import { ExpoRequest, ExpoResponse } from 'expo-router/server';
export async function POST(req: ExpoRequest): Promise<ExpoResponse> {
const { prompt } = await req.json();
const json = await fetch('https://api.openai.com/v1/engines/text-davinci-003/completions', {
headers: {
'Content-Type': 'application/json',
// `OPENAI_API_KEY` is pulled from the .env file when running in Expo CLI.
Authorization: `Bearer ${process.env.OPENAI_API_KEY ?? ''}`,
},
method: 'POST',
body: JSON.stringify({
prompt,
max_tokens: 100,
}),
}).then(res => res.json());
// Return as JSON
return ExpoResponse.json(json);
}
```
This will be served at `http://localhost:8081/generate` with `npx expo`
and can be used by making a request:
```sh
$ curl -X POST -H "Content-Type: application/json" -d \'{"prompt":"Hello, my name is"}\' http://localhost:8081/generate
```
Expo Router polyfills the URL and `window.location` object on native to
allow for universally requesting with a relative URL:
```js
// Expo prepends the host and port to the URL automatically in development.
const json = await fetch('/generate').then(res => res.json());
```
# How
- API Routes are bundled with Metro, leveraging all the same
functionality as the rest of the app and website.
- The project babel config is used to transpile the API routes.
Indication is passed to the Babel caller via the `isServer` boolean.
This can be used to change the preset based on the environment.
- Each API route is bundled into a standalone file in the `dist/_expo`
directory. This is akin to ncc, the tool we use to make Create Expo App
download in ~1 second.
- Create a new package `@expo/server` which includes the requisite
middleware and runtime polyfills for the Expo server environment.
- Add a new routes manifest which will be used by `@expo/server` to
serve up the three types of routes: HTML routes, API routes, and not
found routes (404s).
- Add a new export `expo-router/server` (potentially will be moved to
`expo/server`) which contains the `ExpoRequest` and `ExpoResponse`
objects. These are all based on the WinterCG specification, and include
some additional properties for interop with the Expo Router filesystem
convention. These are inspired by Remix, SvelteKit, and Next.js for
simplicity.
- Add a new export mode `web.output: "server"` which can be used to
export a dynamic server. Note: I may drop this for now and make server
the default since there's no expo-specific hosting code that must be
exported.
- This PR adds the ability to host the app with an express server,
different production adapters to follow.
# Test Plan
In addition to all the E2E Metro tests, I've added a new E2E runner
which starts a server and pings different requests to ensure expected
behavior. These run in the CLI as opposed to the `@expo/server` package.
- resolve ENG-10057 ENG-8243 ENG-8082 ENG-8079 ENG-8242 ENG-8081
ENG-8080 ENG-9625
---------
Co-authored-by: Expo Bot <[email protected]>
Co-authored-by: Cedric van Putten <[email protected]>
show more ...
|
| #
080145be |
| 01-Sep-2023 |
Evan Bacon <[email protected]> |
feat(router, metro-runtime): reduce production web code (#24215)
# Why
- Using the new source map support, I was able to identify and remove
some development-only code https://github.com/expo/ex
feat(router, metro-runtime): reduce production web code (#24215)
# Why
- Using the new source map support, I was able to identify and remove
some development-only code https://github.com/expo/expo/pull/24213/ --
over ~100kb smaller.
<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->
# How
<!--
How did you build this feature or fix this bug and why?
-->
# Test Plan
<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->
# Checklist
<!--
Please check the appropriate items below if they apply to your diff.
This is required for changes to Expo modules.
-->
- [ ] Documentation is up to date to reflect these changes (eg:
https://docs.expo.dev and README.md).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
---------
Co-authored-by: Expo Bot <[email protected]>
show more ...
|
| #
429dc7fc |
| 26-Aug-2023 |
Evan Bacon <[email protected]> |
fix(expo, asset, cli)!: unify asset hashing (#24090)
# Why
Convert the `../` segments of the server URL to `_` to support
monorepos. This same transformation takes place in
`AssetSourceResolver
fix(expo, asset, cli)!: unify asset hashing (#24090)
# Why
Convert the `../` segments of the server URL to `_` to support
monorepos. This same transformation takes place in
`AssetSourceResolver.web` (expo-assets, expo-image) and
`persistMetroAssets` of Expo CLI, this originally came from the [Metro
opinion](https://github.com/react-native-community/cli/blob/2204d357379e2067cebe2791e90388f7e97fc5f5/packages/cli-plugin-metro/src/commands/bundle/getAssetDestPathIOS.ts#L19C5-L19C10).
The purpose is to ensure no URL like `/foo/../bar.png` is requested, as
the result would be `/bar.png` which wouldn't work. The of how to handle
this didn't come from us, but we do need to ensure it's unified. At a
high-level, this does prevent the usage of certain files, as
`/foo/../bar.png` will be `/foo/_bar.png`, meaning a file named
`/foo/_bar.png` cannot also exist. This logic, while applied at runtime,
is actually only valid for production exports as we don't move or alias
files in development. The only way to have valid development files is to
ensure `../` never appears in the URL, i.e. by using
`unstable_serverRoot`.
- Drop legacy `expo/tools/hashAssetFiles.js` in favor of `expo-asset`
version.
- Unify runtime logic of asset file loading for monorepos.
- Split out of https://github.com/expo/expo/pull/23911
<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->
# How
<!--
How did you build this feature or fix this bug and why?
-->
# Test Plan
<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->
# Checklist
<!--
Please check the appropriate items below if they apply to your diff.
This is required for changes to Expo modules.
-->
- [ ] Documentation is up to date to reflect these changes (eg:
https://docs.expo.dev and README.md).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
show more ...
|
| #
fd2402c1 |
| 24-Aug-2023 |
Evan Bacon <[email protected]> |
feat(cli): add monorepo asset support for export:embed (#24095)
# Why
- Pull in support for using the forked getAssets which supports
`EXPO_USE_METRO_WORKSPACE_ROOT` from
https://github.com/exp
feat(cli): add monorepo asset support for export:embed (#24095)
# Why
- Pull in support for using the forked getAssets which supports
`EXPO_USE_METRO_WORKSPACE_ROOT` from
https://github.com/expo/expo/issues/24027
<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->
# How
- Drop unused `--generate-static-view-configs`
https://github.com/react-native-community/cli/pull/1970
- Update tests to use e2e fixture which has the expo package linked to
`packages`.
- Disable `watch` mode on metro when bundling for embed (we do this with
`npx expo export`).
- Use forked `getAssets` to support `EXPO_USE_METRO_WORKSPACE_ROOT`
correctly.
- Drop a bunch of unused option parsing.
<!--
How did you build this feature or fix this bug and why?
-->
# Test Plan
- E2E bundling test.
<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->
# Checklist
<!--
Please check the appropriate items below if they apply to your diff.
This is required for changes to Expo modules.
-->
- [ ] Documentation is up to date to reflect these changes (eg:
https://docs.expo.dev and README.md).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
---------
Co-authored-by: Expo Bot <[email protected]>
show more ...
|
| #
4067174d |
| 05-Apr-2023 |
Will Schurman <[email protected]> |
[cli] Fix e2e tests (#22005)
# Why
These are failing in main:
https://github.com/expo/expo/actions/workflows/cli.yml?query=branch%3Amain
Blame seems to be 8fd977ade89c14fcf9229c10eb19590a3c52
[cli] Fix e2e tests (#22005)
# Why
These are failing in main:
https://github.com/expo/expo/actions/workflows/cli.yml?query=branch%3Amain
Blame seems to be 8fd977ade89c14fcf9229c10eb19590a3c52c80b. No idea why
that changes these or what these are testing but meh.
# How
Update tests.
# Test Plan
`yarn test:e2e`
# Checklist
<!--
Please check the appropriate items below if they apply to your diff.
This is required for changes to Expo modules.
-->
- [ ] Documentation is up to date to reflect these changes (eg:
https://docs.expo.dev and README.md).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
- [ ] This diff will work correctly for `expo prebuild` & EAS Build (eg:
updated a module plugin).
show more ...
|
| #
f479be69 |
| 30-Mar-2023 |
Evan Bacon <[email protected]> |
chore(cli): switch `EXPO_USE_PATH_ALIASES` to `expo.experiments.tsconfigPaths`. (#21897)
# Why
- It's a bit harder to set env vars and users will want this either
always on or always off.
- Exp
chore(cli): switch `EXPO_USE_PATH_ALIASES` to `expo.experiments.tsconfigPaths`. (#21897)
# Why
- It's a bit harder to set env vars and users will want this either
always on or always off.
- Expo Config makes it easier to deprecate values on a per-version
basis. https://github.com/expo/universe/pull/11872
- Comment out references to the path aliases feature until we're closer
to launch. Users are getting confused when they see the feature
documented.
---------
Co-authored-by: Expo Bot <[email protected]>
show more ...
|
| #
b6b91c50 |
| 06-Mar-2023 |
Evan Bacon <[email protected]> |
feat(cli)!: use Expo CLI to bundle production apps (#21396)
# Why
Most of our new Metro bundler features won't work unless we use Expo CLI
for every bundler operation (ex:
[aliases](https://git
feat(cli)!: use Expo CLI to bundle production apps (#21396)
# Why
Most of our new Metro bundler features won't work unless we use Expo CLI
for every bundler operation (ex:
[aliases](https://github.com/expo/expo/pull/21262)). Right now this is
the case when building for production on both platforms or building for
development on iOS.
> Using `npx expo start` when building from Xcode will be added in
another PR.
# How
This PR introduces a new "export:embed" command which is hidden from the
`--help` prompt. `npx expo export:embed` accepts the same arguments as
`npx react-native bundle` and passes them to the same internal function,
but it ensures we use the correct variation of Metro before doing such.
This change (and `start` PR) will add more steps for migrating to "Expo
CLI" but it will also remove the need for us to generate the
`metro.config.js` file in the project on `npx expo prebuild` since we
can now reliably default to `@expo/metro-config`.
The change should only apply to Metro bundler features (all application
code could be affected), but it won't obstruct Expo Modules Core or
using Expo CLI.
<!--
How did you build this feature or fix this bug and why?
-->
# Test Plan
- All of our existing E2E tests should use the new command, if they
contain features like aliases then they'll work.
- Copied the changes from `@expo/cli` into a new project's node_modules,
added template changes:
- Built for production from Android Studio and Xcode.
<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->
# Checklist
<!--
Please check the appropriate items below if they apply to your diff.
This is required for changes to Expo modules.
-->
- [ ] Documentation is up to date to reflect these changes (eg:
https://docs.expo.dev and README.md).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
- [ ] This diff will work correctly for `expo prebuild` & EAS Build (eg:
updated a module plugin).
---------
Co-authored-by: Expo Bot <[email protected]>
Co-authored-by: James Ide <[email protected]>
show more ...
|