@expo/cli 55.0.0-canary-20251206-615dec1 → 55.0.0-canary-20251211-7da85ea

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,18 +34,50 @@ function _interop_require_default(obj) {
34
34
  };
35
35
  }
36
36
  const debug = require('debug')('expo:start:server:middleware:createFile');
37
+ const ROUTER_INDEX_CONTENTS = `import { StyleSheet, Text, View } from "react-native";
38
+
39
+ export default function Page() {
40
+ return (
41
+ <View style={styles.container}>
42
+ <View style={styles.main}>
43
+ <Text style={styles.title}>Hello World</Text>
44
+ <Text style={styles.subtitle}>This is the first page of your app.</Text>
45
+ </View>
46
+ </View>
47
+ );
48
+ }
49
+
50
+ const styles = StyleSheet.create({
51
+ container: {
52
+ flex: 1,
53
+ alignItems: "center",
54
+ padding: 24,
55
+ },
56
+ main: {
57
+ flex: 1,
58
+ justifyContent: "center",
59
+ maxWidth: 960,
60
+ marginHorizontal: "auto",
61
+ },
62
+ title: {
63
+ fontSize: 64,
64
+ fontWeight: "bold",
65
+ },
66
+ subtitle: {
67
+ fontSize: 36,
68
+ color: "#38434D",
69
+ },
70
+ });
71
+ `;
37
72
  class CreateFileMiddleware extends _ExpoMiddleware.ExpoMiddleware {
38
- constructor(projectRoot){
39
- super(projectRoot, [
73
+ constructor(options){
74
+ super(options.projectRoot, [
40
75
  '/_expo/touch'
41
- ]), this.projectRoot = projectRoot;
76
+ ]), this.options = options;
42
77
  }
43
- resolvePath(inputPath) {
44
- return this.resolveExtension(_path().default.join(this.projectRoot, inputPath));
45
- }
46
- resolveExtension(inputPath) {
47
- let resolvedPath = inputPath;
48
- const extension = _path().default.extname(inputPath);
78
+ resolveExtension(basePath, relativePath) {
79
+ let resolvedPath = relativePath;
80
+ const extension = _path().default.extname(relativePath);
49
81
  if (extension === '.js') {
50
82
  // Automatically convert JS files to TS files when added to a project
51
83
  // with TypeScript.
@@ -54,7 +86,7 @@ class CreateFileMiddleware extends _ExpoMiddleware.ExpoMiddleware {
54
86
  resolvedPath = resolvedPath.replace(/\.js$/, '.tsx');
55
87
  }
56
88
  }
57
- return resolvedPath;
89
+ return _path().default.join(basePath, resolvedPath);
58
90
  }
59
91
  async parseRawBody(req) {
60
92
  const rawBody = await new Promise((resolve, reject)=>{
@@ -69,19 +101,26 @@ class CreateFileMiddleware extends _ExpoMiddleware.ExpoMiddleware {
69
101
  reject(err);
70
102
  });
71
103
  });
72
- const properties = JSON.parse(rawBody);
73
- this.assertTouchFileBody(properties);
74
- return properties;
75
- }
76
- assertTouchFileBody(body) {
104
+ const body = JSON.parse(rawBody);
77
105
  if (typeof body !== 'object' || body == null) {
78
106
  throw new Error('Expected object');
107
+ } else if (typeof body.type !== 'string') {
108
+ throw new Error('Expected "type" in body to be string');
79
109
  }
80
- if (typeof body.path !== 'string') {
81
- throw new Error('Expected "path" in body to be string');
110
+ switch(body.type){
111
+ case 'router_index':
112
+ return body;
113
+ default:
114
+ throw new Error('Unknown "type" passed in body');
82
115
  }
83
- if (typeof body.contents !== 'string') {
84
- throw new Error('Expected "contents" in body to be string');
116
+ }
117
+ makeOutputForInput(input) {
118
+ switch(input.type){
119
+ case 'router_index':
120
+ return {
121
+ absolutePath: this.resolveExtension(this.options.appDir, 'index.js'),
122
+ contents: ROUTER_INDEX_CONTENTS
123
+ };
85
124
  }
86
125
  }
87
126
  async handleRequestAsync(req, res) {
@@ -100,18 +139,18 @@ class CreateFileMiddleware extends _ExpoMiddleware.ExpoMiddleware {
100
139
  return;
101
140
  }
102
141
  debug(`Requested: %O`, properties);
103
- const resolvedPath = properties.absolutePath ? this.resolveExtension(_path().default.resolve(properties.absolutePath)) : this.resolvePath(properties.path);
104
- if (_fs().default.existsSync(resolvedPath)) {
142
+ const file = this.makeOutputForInput(properties);
143
+ if (_fs().default.existsSync(file.absolutePath)) {
105
144
  res.statusCode = 409;
106
145
  res.end('File already exists.');
107
146
  return;
108
147
  }
109
- debug(`Resolved path:`, resolvedPath);
148
+ debug(`Resolved path:`, file.absolutePath);
110
149
  try {
111
- await _fs().default.promises.mkdir(_path().default.dirname(resolvedPath), {
150
+ await _fs().default.promises.mkdir(_path().default.dirname(file.absolutePath), {
112
151
  recursive: true
113
152
  });
114
- await _fs().default.promises.writeFile(resolvedPath, properties.contents, 'utf8');
153
+ await _fs().default.promises.writeFile(file.absolutePath, file.contents, 'utf8');
115
154
  } catch (e) {
116
155
  debug('Error writing file', e);
117
156
  res.statusCode = 500;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/CreateFileMiddleware.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport fs from 'fs';\nimport path from 'path';\n\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport { ServerRequest, ServerResponse } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:createFile') as typeof console.log;\n\nexport type TouchFileBody = {\n /** @deprecated */\n path: string;\n absolutePath?: string;\n contents: string;\n};\n\n/**\n * Middleware for creating a file given a `POST` request with\n * `{ contents: string, path: string }` in the body.\n */\nexport class CreateFileMiddleware extends ExpoMiddleware {\n constructor(protected projectRoot: string) {\n super(projectRoot, ['/_expo/touch']);\n }\n\n protected resolvePath(inputPath: string): string {\n return this.resolveExtension(path.join(this.projectRoot, inputPath));\n }\n\n protected resolveExtension(inputPath: string): string {\n let resolvedPath = inputPath;\n const extension = path.extname(inputPath);\n if (extension === '.js') {\n // Automatically convert JS files to TS files when added to a project\n // with TypeScript.\n const tsconfigPath = path.join(this.projectRoot, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n resolvedPath = resolvedPath.replace(/\\.js$/, '.tsx');\n }\n }\n\n return resolvedPath;\n }\n\n protected async parseRawBody(req: ServerRequest): Promise<TouchFileBody> {\n const rawBody = await new Promise<string>((resolve, reject) => {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n resolve(body);\n });\n req.on('error', (err) => {\n reject(err);\n });\n });\n\n const properties = JSON.parse(rawBody);\n this.assertTouchFileBody(properties);\n\n return properties;\n }\n\n private assertTouchFileBody(body: any): asserts body is TouchFileBody {\n if (typeof body !== 'object' || body == null) {\n throw new Error('Expected object');\n }\n if (typeof body.path !== 'string') {\n throw new Error('Expected \"path\" in body to be string');\n }\n if (typeof body.contents !== 'string') {\n throw new Error('Expected \"contents\" in body to be string');\n }\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n if (req.method !== 'POST') {\n res.statusCode = 405;\n res.end('Method Not Allowed');\n return;\n }\n\n let properties: TouchFileBody;\n\n try {\n properties = await this.parseRawBody(req);\n } catch (e) {\n debug('Error parsing request body', e);\n res.statusCode = 400;\n res.end('Bad Request');\n return;\n }\n\n debug(`Requested: %O`, properties);\n\n const resolvedPath = properties.absolutePath\n ? this.resolveExtension(path.resolve(properties.absolutePath))\n : this.resolvePath(properties.path);\n\n if (fs.existsSync(resolvedPath)) {\n res.statusCode = 409;\n res.end('File already exists.');\n return;\n }\n\n debug(`Resolved path:`, resolvedPath);\n\n try {\n await fs.promises.mkdir(path.dirname(resolvedPath), { recursive: true });\n await fs.promises.writeFile(resolvedPath, properties.contents, 'utf8');\n } catch (e) {\n debug('Error writing file', e);\n res.statusCode = 500;\n res.end('Error writing file.');\n return;\n }\n\n debug(`File created`);\n res.statusCode = 200;\n res.end('OK');\n }\n}\n"],"names":["CreateFileMiddleware","debug","require","ExpoMiddleware","constructor","projectRoot","resolvePath","inputPath","resolveExtension","path","join","resolvedPath","extension","extname","tsconfigPath","fs","existsSync","replace","parseRawBody","req","rawBody","Promise","resolve","reject","body","on","chunk","toString","err","properties","JSON","parse","assertTouchFileBody","Error","contents","handleRequestAsync","res","method","statusCode","end","e","absolutePath","promises","mkdir","dirname","recursive","writeFile"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/CreateFileMiddleware.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport fs from 'fs';\nimport path from 'path';\n\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport { ServerRequest, ServerResponse } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:createFile') as typeof console.log;\n\ninterface TouchFileInput {\n type: 'router_index';\n}\n\ninterface TouchFileOutput {\n absolutePath: string;\n contents: string;\n}\n\nconst ROUTER_INDEX_CONTENTS = `import { StyleSheet, Text, View } from \"react-native\";\n\nexport default function Page() {\n return (\n <View style={styles.container}>\n <View style={styles.main}>\n <Text style={styles.title}>Hello World</Text>\n <Text style={styles.subtitle}>This is the first page of your app.</Text>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n alignItems: \"center\",\n padding: 24,\n },\n main: {\n flex: 1,\n justifyContent: \"center\",\n maxWidth: 960,\n marginHorizontal: \"auto\",\n },\n title: {\n fontSize: 64,\n fontWeight: \"bold\",\n },\n subtitle: {\n fontSize: 36,\n color: \"#38434D\",\n },\n});\n`;\n\ninterface CreateFileMiddlewareOptions {\n /** The absolute metro or server root, used to calculate the relative dom entry path */\n metroRoot: string;\n /** The absolute project root, used to resolve the `expo/dom/entry.js` path */\n projectRoot: string;\n /** The expo-router root */\n appDir: string;\n}\n\n/**\n * Middleware for creating a file given a `POST` request with\n * `{ contents: string, path: string }` in the body.\n */\nexport class CreateFileMiddleware extends ExpoMiddleware {\n constructor(protected options: CreateFileMiddlewareOptions) {\n super(options.projectRoot, ['/_expo/touch']);\n }\n\n protected resolveExtension(basePath: string, relativePath: string): string {\n let resolvedPath = relativePath;\n const extension = path.extname(relativePath);\n if (extension === '.js') {\n // Automatically convert JS files to TS files when added to a project\n // with TypeScript.\n const tsconfigPath = path.join(this.projectRoot, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n resolvedPath = resolvedPath.replace(/\\.js$/, '.tsx');\n }\n }\n return path.join(basePath, resolvedPath);\n }\n\n protected async parseRawBody(req: ServerRequest): Promise<TouchFileInput> {\n const rawBody = await new Promise<string>((resolve, reject) => {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n resolve(body);\n });\n req.on('error', (err) => {\n reject(err);\n });\n });\n\n const body = JSON.parse(rawBody);\n if (typeof body !== 'object' || body == null) {\n throw new Error('Expected object');\n } else if (typeof body.type !== 'string') {\n throw new Error('Expected \"type\" in body to be string');\n }\n\n switch (body.type) {\n case 'router_index':\n return body;\n default:\n throw new Error('Unknown \"type\" passed in body');\n }\n }\n\n private makeOutputForInput(input: TouchFileInput): TouchFileOutput {\n switch (input.type) {\n case 'router_index':\n return {\n absolutePath: this.resolveExtension(this.options.appDir, 'index.js'),\n contents: ROUTER_INDEX_CONTENTS,\n };\n }\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n if (req.method !== 'POST') {\n res.statusCode = 405;\n res.end('Method Not Allowed');\n return;\n }\n\n let properties: TouchFileInput;\n try {\n properties = await this.parseRawBody(req);\n } catch (e) {\n debug('Error parsing request body', e);\n res.statusCode = 400;\n res.end('Bad Request');\n return;\n }\n\n debug(`Requested: %O`, properties);\n\n const file = this.makeOutputForInput(properties);\n if (fs.existsSync(file.absolutePath)) {\n res.statusCode = 409;\n res.end('File already exists.');\n return;\n }\n\n debug(`Resolved path:`, file.absolutePath);\n\n try {\n await fs.promises.mkdir(path.dirname(file.absolutePath), { recursive: true });\n await fs.promises.writeFile(file.absolutePath, file.contents, 'utf8');\n } catch (e) {\n debug('Error writing file', e);\n res.statusCode = 500;\n res.end('Error writing file.');\n return;\n }\n\n debug(`File created`);\n res.statusCode = 200;\n res.end('OK');\n }\n}\n"],"names":["CreateFileMiddleware","debug","require","ROUTER_INDEX_CONTENTS","ExpoMiddleware","constructor","options","projectRoot","resolveExtension","basePath","relativePath","resolvedPath","extension","path","extname","tsconfigPath","join","fs","existsSync","replace","parseRawBody","req","rawBody","Promise","resolve","reject","body","on","chunk","toString","err","JSON","parse","Error","type","makeOutputForInput","input","absolutePath","appDir","contents","handleRequestAsync","res","method","statusCode","end","properties","e","file","promises","mkdir","dirname","recursive","writeFile"],"mappings":"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"}
@@ -33,7 +33,7 @@ class FetchClient {
33
33
  this.headers = {
34
34
  accept: 'application/json',
35
35
  'content-type': 'application/json',
36
- 'user-agent': `expo-cli/${"55.0.0-canary-20251206-615dec1"}`,
36
+ 'user-agent': `expo-cli/${"55.0.0-canary-20251211-7da85ea"}`,
37
37
  authorization: 'Basic ' + _nodebuffer().Buffer.from(`${target}:`).toString('base64')
38
38
  };
39
39
  }
@@ -83,7 +83,7 @@ function createContext() {
83
83
  cpu: summarizeCpuInfo(),
84
84
  app: {
85
85
  name: 'expo/cli',
86
- version: "55.0.0-canary-20251206-615dec1"
86
+ version: "55.0.0-canary-20251211-7da85ea"
87
87
  },
88
88
  ci: _ciinfo().isCI ? {
89
89
  name: _ciinfo().name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/cli",
3
- "version": "55.0.0-canary-20251206-615dec1",
3
+ "version": "55.0.0-canary-20251211-7da85ea",
4
4
  "description": "The Expo CLI",
5
5
  "main": "build/bin/cli",
6
6
  "bin": {
@@ -43,25 +43,25 @@
43
43
  "dependencies": {
44
44
  "@0no-co/graphql.web": "^1.0.8",
45
45
  "@expo/code-signing-certificates": "^0.0.5",
46
- "@expo/config": "12.0.12-canary-20251206-615dec1",
47
- "@expo/config-plugins": "54.0.4-canary-20251206-615dec1",
46
+ "@expo/config": "12.0.13-canary-20251211-7da85ea",
47
+ "@expo/config-plugins": "54.0.4-canary-20251211-7da85ea",
48
48
  "@expo/devcert": "^1.2.1",
49
- "@expo/env": "2.0.9-canary-20251206-615dec1",
50
- "@expo/image-utils": "0.8.9-canary-20251206-615dec1",
51
- "@expo/json-file": "10.0.9-canary-20251206-615dec1",
49
+ "@expo/env": "2.0.9-canary-20251211-7da85ea",
50
+ "@expo/image-utils": "0.8.9-canary-20251211-7da85ea",
51
+ "@expo/json-file": "10.0.9-canary-20251211-7da85ea",
52
52
  "@expo/metro": "~54.1.0",
53
- "@expo/metro-config": "54.1.0-canary-20251206-615dec1",
54
- "@expo/osascript": "2.3.9-canary-20251206-615dec1",
55
- "@expo/package-manager": "1.9.10-canary-20251206-615dec1",
56
- "@expo/plist": "0.4.9-canary-20251206-615dec1",
57
- "@expo/prebuild-config": "54.0.8-canary-20251206-615dec1",
58
- "@expo/router-server": "0.2.0-canary-20251206-615dec1",
59
- "@expo/log-box": "0.0.13-canary-20251206-615dec1",
60
- "@expo/schema-utils": "0.1.9-canary-20251206-615dec1",
53
+ "@expo/metro-config": "54.1.0-canary-20251211-7da85ea",
54
+ "@expo/osascript": "2.3.9-canary-20251211-7da85ea",
55
+ "@expo/package-manager": "1.9.10-canary-20251211-7da85ea",
56
+ "@expo/plist": "0.4.9-canary-20251211-7da85ea",
57
+ "@expo/prebuild-config": "54.0.8-canary-20251211-7da85ea",
58
+ "@expo/router-server": "0.2.0-canary-20251211-7da85ea",
59
+ "@expo/log-box": "0.0.13-canary-20251211-7da85ea",
60
+ "@expo/schema-utils": "0.1.9-canary-20251211-7da85ea",
61
61
  "@expo/spawn-async": "^1.7.2",
62
62
  "@expo/ws-tunnel": "^1.0.1",
63
63
  "@expo/xcpretty": "^4.3.0",
64
- "@react-native/dev-middleware": "0.83.0-rc.3",
64
+ "@react-native/dev-middleware": "0.83.0-rc.5",
65
65
  "@urql/core": "^5.0.6",
66
66
  "@urql/exchange-retry": "^1.3.0",
67
67
  "accepts": "^1.3.8",
@@ -75,7 +75,7 @@
75
75
  "connect": "^3.7.0",
76
76
  "debug": "^4.3.4",
77
77
  "env-editor": "^0.4.1",
78
- "expo-server": "1.0.6-canary-20251206-615dec1",
78
+ "expo-server": "1.0.6-canary-20251211-7da85ea",
79
79
  "freeport-async": "^2.0.0",
80
80
  "getenv": "^2.0.0",
81
81
  "glob": "^13.0.0",
@@ -112,8 +112,8 @@
112
112
  ]
113
113
  },
114
114
  "peerDependencies": {
115
- "expo": "55.0.0-canary-20251206-615dec1",
116
- "expo-router": "7.0.0-canary-20251206-615dec1",
115
+ "expo": "55.0.0-canary-20251211-7da85ea",
116
+ "expo-router": "7.0.0-canary-20251211-7da85ea",
117
117
  "react-native": "*"
118
118
  },
119
119
  "peerDependenciesMeta": {
@@ -158,7 +158,7 @@
158
158
  "@types/ws": "^8.5.4",
159
159
  "devtools-protocol": "^0.0.1113120",
160
160
  "expo-atlas": "^0.4.1",
161
- "expo-module-scripts": "5.1.0-canary-20251206-615dec1",
161
+ "expo-module-scripts": "5.1.0-canary-20251211-7da85ea",
162
162
  "find-process": "^1.4.7",
163
163
  "jest-runner-tsd": "^6.0.0",
164
164
  "klaw-sync": "^6.0.0",