feat(smart-app): implement complete mobile app MVP

- App.tsx: full navigation (Auth stack + Main tabs with 5 screens)
- Auth: LoginScreen, RegisterScreen, ForgotPasswordScreen
- HomeScreen: dashboard with IoT metrics, weather widget, alerts, quick actions, sensors
- MapScreen: interactive map with layer toggles (6 layers)
- MarketplaceScreen: categories (6), products (5), search
- ChatScreen: AI chat with quick prompts (4), bot responses
- ProfileScreen: user info, stats, menu (9 items), logout
- AlertsScreen: alert list with severity, acknowledge
- SensorsScreen: sensor list with type filters (6 types), search
- ZonesScreen: zone cards with stats
- SettingsScreen: language picker (FR/EN/ES/DE), privacy, about
- Stores: iotStore (sensors, zones, alerts), notificationStore, uiStore + i18n
- Hooks: useSensors, useAlerts, useNotifications, useLocation
- Components: Card, Button, LoadingSpinner, ErrorBoundary, Header
- Services: iotService, notificationService (with axios API client)
- Utils: formatters (temp, AQI, noise, dates), validators (email, password, IBAN)
- Theme: colors.ts with full design system (Blue Ocean palette)
- Ditto: fixed MongoDB connection, new JWT secrets, official gateway image
This commit is contained in:
Eric FELIXINE
2026-06-01 18:00:35 -04:00
parent 08ca495bde
commit e30ae8ed09
35578 changed files with 3703534 additions and 43 deletions

View File

@@ -0,0 +1,135 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "FileNotifier", {
enumerable: true,
get: ()=>FileNotifier
});
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
function _fs() {
const data = require("fs");
_fs = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
function _resolveFrom() {
const data = /*#__PURE__*/ _interopRequireDefault(require("resolve-from"));
_resolveFrom = function() {
return data;
};
return data;
}
const _fn = require("./fn");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const debug = require("debug")("expo:utils:fileNotifier");
class FileNotifier {
static instances = [];
static stopAll() {
for (const instance of FileNotifier.instances){
instance.stopObserving();
}
}
constructor(projectRoot, moduleIds, settings = {}){
this.projectRoot = projectRoot;
this.moduleIds = moduleIds;
this.settings = settings;
this.unsubscribe = null;
this.watchFile = (0, _fn.memoize)(this.startWatchingFile.bind(this));
FileNotifier.instances.push(this);
}
/** Get the file in the project. */ resolveFilePath() {
for (const moduleId of this.moduleIds){
const filePath = _resolveFrom().default.silent(this.projectRoot, moduleId);
if (filePath) {
return filePath;
}
}
return null;
}
startObserving(callback) {
const configPath = this.resolveFilePath();
if (configPath) {
debug(`Observing ${configPath}`);
return this.watchFile(configPath, callback);
}
return configPath;
}
stopObserving() {
var _obj, ref;
(ref = (_obj = this).unsubscribe) == null ? void 0 : ref.call(_obj);
}
startWatchingFile(filePath, callback) {
const configName = _path().default.relative(this.projectRoot, filePath);
const listener = (cur, prev)=>{
if (prev.size || cur.size) {
_log.log(`\u203A Detected a change in ${_chalk().default.bold(configName)}. Restart the server to see the new results.` + (this.settings.additionalWarning || ""));
}
};
const watcher = (0, _fs().watchFile)(filePath, callback != null ? callback : listener);
this.unsubscribe = ()=>{
watcher.unref();
};
return filePath;
}
}
//# sourceMappingURL=FileNotifier.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,73 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
hasDirectDevClientDependency: ()=>hasDirectDevClientDependency,
default: ()=>getDevClientProperties
});
function _config() {
const data = require("@expo/config");
_config = function() {
return data;
};
return data;
}
function _jsonFile() {
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/json-file"));
_jsonFile = function() {
return data;
};
return data;
}
function _resolveFrom() {
const data = /*#__PURE__*/ _interopRequireDefault(require("resolve-from"));
_resolveFrom = function() {
return data;
};
return data;
}
const _fn = require("../fn");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const getAccountName = (0, _fn.memoize)((exp)=>{
return (0, _config().getAccountUsername)(exp);
});
function hasDirectDevClientDependency(projectRoot) {
var ref, ref1;
const pkg = (0, _config().getPackageJson)(projectRoot);
return !!((ref = pkg.dependencies) == null ? void 0 : ref["expo-dev-client"]) || !!((ref1 = pkg.devDependencies) == null ? void 0 : ref1["expo-dev-client"]);
}
const getDevClientVersion = (0, _fn.memoize)((projectRoot)=>{
try {
const devClientPackage = _resolveFrom().default.silent(projectRoot, "expo-dev-client/package.json");
if (devClientPackage) {
return _jsonFile().default.read(devClientPackage).version;
}
} catch {}
return undefined;
});
const getProjectType = (0, _fn.memoize)((projectRoot)=>{
return (0, _config().getDefaultTarget)(projectRoot) === "managed" ? "managed" : "generic";
});
function getDevClientProperties(projectRoot, exp) {
return {
account_name: getAccountName({
owner: exp.owner
}),
dev_client_version: getDevClientVersion(projectRoot),
project_type: getProjectType(projectRoot),
uptime_ms: process.uptime() * 1000
};
}
//# sourceMappingURL=getDevClientProperties.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/utils/analytics/getDevClientProperties.ts"],"sourcesContent":["import { ExpoConfig, getAccountUsername, getDefaultTarget, getPackageJson } from '@expo/config';\nimport JsonFile, { JSONValue } from '@expo/json-file';\nimport resolveFrom from 'resolve-from';\n\nimport { memoize } from '../fn';\n\nconst getAccountName = memoize((exp: Pick<ExpoConfig, 'owner'>) => {\n return getAccountUsername(exp);\n});\n\n/** @returns true if the expo-dev-client package is found in the project `package.json` file. */\nexport function hasDirectDevClientDependency(projectRoot: string): boolean {\n const pkg = getPackageJson(projectRoot);\n return !!pkg.dependencies?.['expo-dev-client'] || !!pkg.devDependencies?.['expo-dev-client'];\n}\n\nconst getDevClientVersion = memoize((projectRoot: string): JSONValue | undefined => {\n try {\n const devClientPackage = resolveFrom.silent(projectRoot, 'expo-dev-client/package.json');\n if (devClientPackage) {\n return JsonFile.read(devClientPackage).version;\n }\n } catch {}\n return undefined;\n});\n\nconst getProjectType = memoize((projectRoot: string): 'managed' | 'generic' => {\n return getDefaultTarget(projectRoot) === 'managed' ? 'managed' : 'generic';\n});\n\nexport default function getDevClientProperties(projectRoot: string, exp: ExpoConfig) {\n return {\n account_name: getAccountName({ owner: exp.owner }),\n dev_client_version: getDevClientVersion(projectRoot),\n project_type: getProjectType(projectRoot),\n uptime_ms: process.uptime() * 1000,\n };\n}\n"],"names":["hasDirectDevClientDependency","getDevClientProperties","getAccountName","memoize","exp","getAccountUsername","projectRoot","pkg","getPackageJson","dependencies","devDependencies","getDevClientVersion","devClientPackage","resolveFrom","silent","JsonFile","read","version","undefined","getProjectType","getDefaultTarget","account_name","owner","dev_client_version","project_type","uptime_ms","process","uptime"],"mappings":"AAAA;;;;;;;;;;;IAWgBA,4BAA4B,MAA5BA,4BAA4B;IAmB5C,OAOC,MAPuBC,sBAAsB;;;yBA9BmC,cAAc;;;;;;;8DAC3D,iBAAiB;;;;;;;8DAC7B,cAAc;;;;;;oBAEd,OAAO;;;;;;AAE/B,MAAMC,cAAc,GAAGC,IAAAA,GAAO,QAAA,EAAC,CAACC,GAA8B,GAAK;IACjE,OAAOC,IAAAA,OAAkB,EAAA,mBAAA,EAACD,GAAG,CAAC,CAAC;AACjC,CAAC,CAAC,AAAC;AAGI,SAASJ,4BAA4B,CAACM,WAAmB,EAAW;QAEhEC,GAAgB,EAA2BA,IAAmB;IADvE,MAAMA,GAAG,GAAGC,IAAAA,OAAc,EAAA,eAAA,EAACF,WAAW,CAAC,AAAC;IACxC,OAAO,CAAC,CAACC,CAAAA,CAAAA,GAAgB,GAAhBA,GAAG,CAACE,YAAY,SAAqB,GAArCF,KAAAA,CAAqC,GAArCA,GAAgB,AAAE,CAAC,iBAAiB,CAAC,CAAA,IAAI,CAAC,CAACA,CAAAA,CAAAA,IAAmB,GAAnBA,GAAG,CAACG,eAAe,SAAqB,GAAxCH,KAAAA,CAAwC,GAAxCA,IAAmB,AAAE,CAAC,iBAAiB,CAAC,CAAA,CAAC;AAC/F,CAAC;AAED,MAAMI,mBAAmB,GAAGR,IAAAA,GAAO,QAAA,EAAC,CAACG,WAAmB,GAA4B;IAClF,IAAI;QACF,MAAMM,gBAAgB,GAAGC,YAAW,EAAA,QAAA,CAACC,MAAM,CAACR,WAAW,EAAE,8BAA8B,CAAC,AAAC;QACzF,IAAIM,gBAAgB,EAAE;YACpB,OAAOG,SAAQ,EAAA,QAAA,CAACC,IAAI,CAACJ,gBAAgB,CAAC,CAACK,OAAO,CAAC;QACjD,CAAC;IACH,EAAE,OAAM,CAAC,CAAC;IACV,OAAOC,SAAS,CAAC;AACnB,CAAC,CAAC,AAAC;AAEH,MAAMC,cAAc,GAAGhB,IAAAA,GAAO,QAAA,EAAC,CAACG,WAAmB,GAA4B;IAC7E,OAAOc,IAAAA,OAAgB,EAAA,iBAAA,EAACd,WAAW,CAAC,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAC7E,CAAC,CAAC,AAAC;AAEY,SAASL,sBAAsB,CAACK,WAAmB,EAAEF,GAAe,EAAE;IACnF,OAAO;QACLiB,YAAY,EAAEnB,cAAc,CAAC;YAAEoB,KAAK,EAAElB,GAAG,CAACkB,KAAK;SAAE,CAAC;QAClDC,kBAAkB,EAAEZ,mBAAmB,CAACL,WAAW,CAAC;QACpDkB,YAAY,EAAEL,cAAc,CAACb,WAAW,CAAC;QACzCmB,SAAS,EAAEC,OAAO,CAACC,MAAM,EAAE,GAAG,IAAI;KACnC,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,18 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "getMetroDebugProperties", {
enumerable: true,
get: ()=>getMetroDebugProperties
});
function getMetroDebugProperties(projectRoot, exp, debugTool) {
return {
sdkVersion: exp.sdkVersion,
metroVersion: require("metro/package.json").version,
toolName: debugTool.name,
toolVersion: debugTool.version
};
}
//# sourceMappingURL=getMetroDebugProperties.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/utils/analytics/getMetroDebugProperties.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\n\nexport type DebugTool = {\n name: string;\n version?: string;\n};\n\nexport function getMetroDebugProperties(\n projectRoot: string,\n exp: ExpoConfig,\n debugTool: DebugTool\n) {\n return {\n sdkVersion: exp.sdkVersion,\n metroVersion: require('metro/package.json').version,\n toolName: debugTool.name,\n toolVersion: debugTool.version,\n };\n}\n"],"names":["getMetroDebugProperties","projectRoot","exp","debugTool","sdkVersion","metroVersion","require","version","toolName","name","toolVersion"],"mappings":"AAAA;;;;+BAOgBA,yBAAuB;;aAAvBA,uBAAuB;;AAAhC,SAASA,uBAAuB,CACrCC,WAAmB,EACnBC,GAAe,EACfC,SAAoB,EACpB;IACA,OAAO;QACLC,UAAU,EAAEF,GAAG,CAACE,UAAU;QAC1BC,YAAY,EAAEC,OAAO,CAAC,oBAAoB,CAAC,CAACC,OAAO;QACnDC,QAAQ,EAAEL,SAAS,CAACM,IAAI;QACxBC,WAAW,EAAEP,SAAS,CAACI,OAAO;KAC/B,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,31 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "getMetroProperties", {
enumerable: true,
get: ()=>getMetroProperties
});
function getMetroProperties(projectRoot, exp, metroConfig = {}) {
var ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, ref10, ref11;
return {
sdkVersion: exp.sdkVersion,
metroVersion: require("metro/package.json").version,
fileMapCacheManagerFactory: Boolean(metroConfig.unstable_fileMapCacheManagerFactory) || undefined,
perfLogger: Boolean(metroConfig.unstable_perfLogger) || undefined,
resolverEnableSymlinks: (ref = metroConfig.resolver) == null ? void 0 : ref.unstable_enableSymlinks,
resolverConditionNames: (ref1 = metroConfig.resolver) == null ? void 0 : ref1.unstable_conditionNames,
resolverConditionsByPlatform: (ref2 = metroConfig.resolver) == null ? void 0 : ref2.unstable_conditionsByPlatform,
resolverEnablePackageExports: (ref3 = metroConfig.resolver) == null ? void 0 : ref3.unstable_enablePackageExports,
serverImportBundleSupport: (ref4 = metroConfig.server) == null ? void 0 : ref4.experimentalImportBundleSupport,
serverServerRoot: Boolean((ref5 = metroConfig.server) == null ? void 0 : ref5.unstable_serverRoot) || undefined,
transformerCollectDependenciesPath: (ref6 = metroConfig.transformer) == null ? void 0 : ref6.unstable_collectDependenciesPath,
transformerDependencyMapReservedName: (ref7 = metroConfig.transformer) == null ? void 0 : ref7.unstable_dependencyMapReservedName,
transformerDisableModuleWrapping: (ref8 = metroConfig.transformer) == null ? void 0 : ref8.unstable_disableModuleWrapping,
transformerDisableNormalizePseudoGlobals: (ref9 = metroConfig.transformer) == null ? void 0 : ref9.unstable_disableNormalizePseudoGlobals,
transformerCompactOutput: (ref10 = metroConfig.transformer) == null ? void 0 : ref10.unstable_compactOutput,
transformerAllowRequireContext: (ref11 = metroConfig.transformer) == null ? void 0 : ref11.unstable_allowRequireContext
};
}
//# sourceMappingURL=getMetroProperties.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,63 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
createDebuggerTelemetryMiddleware: ()=>createDebuggerTelemetryMiddleware,
findDebugTool: ()=>findDebugTool
});
const _getMetroDebugProperties = require("./getMetroDebugProperties");
const _env = require("../env");
const _telemetry = require("../telemetry");
function createDebuggerTelemetryMiddleware(projectRoot, exp) {
let hasReported = false;
// This only works for Hermes apps, disable when telemetry is turned off
if (_env.env.EXPO_NO_TELEMETRY || exp.jsEngine !== "hermes") {
return (req, res, next)=>{
if (typeof next === "function") {
next(undefined);
}
};
}
return (req, res, next)=>{
// Only report once
if (hasReported && typeof next === "function") {
return next(undefined);
}
const debugTool = findDebugTool(req);
if (debugTool) {
hasReported = true;
(0, _telemetry.logEventAsync)("metro debug", (0, _getMetroDebugProperties.getMetroDebugProperties)(projectRoot, exp, debugTool));
}
if (typeof next === "function") {
return next(undefined);
}
};
}
function findDebugTool(req) {
var ref, ref1;
if ((ref = req.headers["origin"]) == null ? void 0 : ref.includes("chrome-devtools")) {
return {
name: "chrome"
};
}
if ((ref1 = req.url) == null ? void 0 : ref1.startsWith("/json")) {
var ref2;
const flipperUserAgent = (ref2 = req.headers["user-agent"]) == null ? void 0 : ref2.match(/(Flipper)\/([^\s]+)/);
if (flipperUserAgent) {
return {
name: flipperUserAgent[1].toLowerCase(),
version: flipperUserAgent[2]
};
}
}
return null;
}
//# sourceMappingURL=metroDebuggerMiddleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/utils/analytics/metroDebuggerMiddleware.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport { Middleware } from 'metro-config';\n\nimport { DebugTool, getMetroDebugProperties } from './getMetroDebugProperties';\nimport { env } from '../env';\nimport { logEventAsync } from '../telemetry';\n\ntype Request = Parameters<Middleware>[0];\ntype Response = Parameters<Middleware>[1];\ntype Next = Parameters<Middleware>[2];\n\n/**\n * Create a Metro middleware that reports when a debugger request was found.\n * This will only be reported once, if the app uses Hermes and telemetry is not enabled.\n */\nexport function createDebuggerTelemetryMiddleware(\n projectRoot: string,\n exp: ExpoConfig\n): Middleware {\n let hasReported = false;\n\n // This only works for Hermes apps, disable when telemetry is turned off\n if (env.EXPO_NO_TELEMETRY || exp.jsEngine !== 'hermes') {\n return (req: Request, res: Response, next: Next) => {\n if (typeof next === 'function') {\n next(undefined);\n }\n };\n }\n\n return (req: Request, res: Response, next: Next) => {\n // Only report once\n if (hasReported && typeof next === 'function') {\n return next(undefined);\n }\n\n const debugTool = findDebugTool(req);\n if (debugTool) {\n hasReported = true;\n logEventAsync('metro debug', getMetroDebugProperties(projectRoot, exp, debugTool));\n }\n\n if (typeof next === 'function') {\n return next(undefined);\n }\n };\n}\n\n/** Exposed for testing */\nexport function findDebugTool(\n req: Pick<Parameters<Middleware>[0], 'headers' | 'url'>\n): DebugTool | null {\n if (req.headers['origin']?.includes('chrome-devtools')) {\n return { name: 'chrome' };\n }\n\n if (req.url?.startsWith('/json')) {\n const flipperUserAgent = req.headers['user-agent']?.match(/(Flipper)\\/([^\\s]+)/);\n if (flipperUserAgent) {\n return {\n name: flipperUserAgent[1].toLowerCase(),\n version: flipperUserAgent[2],\n };\n }\n }\n\n return null;\n}\n"],"names":["createDebuggerTelemetryMiddleware","findDebugTool","projectRoot","exp","hasReported","env","EXPO_NO_TELEMETRY","jsEngine","req","res","next","undefined","debugTool","logEventAsync","getMetroDebugProperties","headers","includes","name","url","startsWith","flipperUserAgent","match","toLowerCase","version"],"mappings":"AAAA;;;;;;;;;;;IAegBA,iCAAiC,MAAjCA,iCAAiC;IAkCjCC,aAAa,MAAbA,aAAa;;yCA9CsB,2BAA2B;qBAC1D,QAAQ;2BACE,cAAc;AAUrC,SAASD,iCAAiC,CAC/CE,WAAmB,EACnBC,GAAe,EACH;IACZ,IAAIC,WAAW,GAAG,KAAK,AAAC;IAExB,wEAAwE;IACxE,IAAIC,IAAG,IAAA,CAACC,iBAAiB,IAAIH,GAAG,CAACI,QAAQ,KAAK,QAAQ,EAAE;QACtD,OAAO,CAACC,GAAY,EAAEC,GAAa,EAAEC,IAAU,GAAK;YAClD,IAAI,OAAOA,IAAI,KAAK,UAAU,EAAE;gBAC9BA,IAAI,CAACC,SAAS,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAACH,GAAY,EAAEC,GAAa,EAAEC,IAAU,GAAK;QAClD,mBAAmB;QACnB,IAAIN,WAAW,IAAI,OAAOM,IAAI,KAAK,UAAU,EAAE;YAC7C,OAAOA,IAAI,CAACC,SAAS,CAAC,CAAC;QACzB,CAAC;QAED,MAAMC,SAAS,GAAGX,aAAa,CAACO,GAAG,CAAC,AAAC;QACrC,IAAII,SAAS,EAAE;YACbR,WAAW,GAAG,IAAI,CAAC;YACnBS,IAAAA,UAAa,cAAA,EAAC,aAAa,EAAEC,IAAAA,wBAAuB,wBAAA,EAACZ,WAAW,EAAEC,GAAG,EAAES,SAAS,CAAC,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,OAAOF,IAAI,KAAK,UAAU,EAAE;YAC9B,OAAOA,IAAI,CAACC,SAAS,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAGM,SAASV,aAAa,CAC3BO,GAAuD,EACrC;QACdA,GAAqB,EAIrBA,IAAO;IAJX,IAAIA,CAAAA,GAAqB,GAArBA,GAAG,CAACO,OAAO,CAAC,QAAQ,CAAC,SAAU,GAA/BP,KAAAA,CAA+B,GAA/BA,GAAqB,CAAEQ,QAAQ,CAAC,iBAAiB,CAAC,EAAE;QACtD,OAAO;YAAEC,IAAI,EAAE,QAAQ;SAAE,CAAC;IAC5B,CAAC;IAED,IAAIT,CAAAA,IAAO,GAAPA,GAAG,CAACU,GAAG,SAAY,GAAnBV,KAAAA,CAAmB,GAAnBA,IAAO,CAAEW,UAAU,CAAC,OAAO,CAAC,EAAE;YACPX,IAAyB;QAAlD,MAAMY,gBAAgB,GAAGZ,CAAAA,IAAyB,GAAzBA,GAAG,CAACO,OAAO,CAAC,YAAY,CAAC,SAAO,GAAhCP,KAAAA,CAAgC,GAAhCA,IAAyB,CAAEa,KAAK,uBAAuB,AAAC;QACjF,IAAID,gBAAgB,EAAE;YACpB,OAAO;gBACLH,IAAI,EAAEG,gBAAgB,CAAC,CAAC,CAAC,CAACE,WAAW,EAAE;gBACvCC,OAAO,EAAEH,gBAAgB,CAAC,CAAC,CAAC;aAC7B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}

View File

@@ -0,0 +1,20 @@
/** Remove ansi characters from a string and return the sanitized results. */ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "stripAnsi", {
enumerable: true,
get: ()=>stripAnsi
});
function stripAnsi(str) {
if (!str) {
return str;
}
const pattern = [
"[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
"(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))",
].join("|");
return str.replace(new RegExp(pattern, "g"), "");
}
//# sourceMappingURL=ansi.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/ansi.ts"],"sourcesContent":["/** Remove ansi characters from a string and return the sanitized results. */\nexport function stripAnsi(str?: string | null) {\n if (!str) {\n return str;\n }\n const pattern = [\n '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n '(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))',\n ].join('|');\n\n return str.replace(new RegExp(pattern, 'g'), '');\n}\n"],"names":["stripAnsi","str","pattern","join","replace","RegExp"],"mappings":"AAAA,2EAA2E,GAC3E;;;;+BAAgBA,WAAS;;aAATA,SAAS;;AAAlB,SAASA,SAAS,CAACC,GAAmB,EAAE;IAC7C,IAAI,CAACA,GAAG,EAAE;QACR,OAAOA,GAAG,CAAC;IACb,CAAC;IACD,MAAMC,OAAO,GAAG;QACd,8HAA8H;QAC9H,0DAA0D;KAC3D,CAACC,IAAI,CAAC,GAAG,CAAC,AAAC;IAEZ,OAAOF,GAAG,CAACG,OAAO,CAAC,IAAIC,MAAM,CAACH,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC"}

View File

@@ -0,0 +1,131 @@
// Common utilities for interacting with `args` library.
// These functions should be used by every command.
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
getProjectRoot: ()=>getProjectRoot,
assertArgs: ()=>assertArgs,
assertWithOptionsArgs: ()=>assertWithOptionsArgs,
printHelp: ()=>printHelp
});
function _arg() {
const data = /*#__PURE__*/ _interopRequireDefault(require("arg"));
_arg = function() {
return data;
};
return data;
}
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
function _fs() {
const data = require("fs");
_fs = function() {
return data;
};
return data;
}
function _path() {
const data = require("path");
_path = function() {
return data;
};
return data;
}
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
function getProjectRoot(args) {
const projectRoot = (0, _path().resolve)(args._[0] || ".");
if (!(0, _fs().existsSync)(projectRoot)) {
_log.exit(`Invalid project root: ${projectRoot}`);
}
return projectRoot;
}
function assertArgs(schema, argv) {
return assertWithOptionsArgs(schema, {
argv
});
}
function assertWithOptionsArgs(schema, options) {
try {
return (0, _arg().default)(schema, options);
} catch (error) {
// Handle errors caused by user input.
// Only errors from `arg`, which does not start with `ARG_CONFIG_` are user input errors.
// See: https://github.com/vercel/arg/releases/tag/5.0.0
if ("code" in error && error.code.startsWith("ARG_") && !error.code.startsWith("ARG_CONFIG_")) {
_log.exit(error.message, 1);
}
// Otherwise rethrow the error.
throw error;
}
}
function printHelp(info, usage, options, extra = "") {
_log.exit((0, _chalk().default)`
{bold Info}
${info}
{bold Usage}
{dim $} ${usage}
{bold Options}
${options.split("\n").join("\n ")}
` + extra, 0);
}
//# sourceMappingURL=args.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/args.ts"],"sourcesContent":["// Common utilities for interacting with `args` library.\n// These functions should be used by every command.\nimport arg from 'arg';\nimport chalk from 'chalk';\nimport { existsSync } from 'fs';\nimport { resolve } from 'path';\n\nimport * as Log from '../log';\n\n/**\n * Parse the first argument as a project directory.\n *\n * @returns valid project directory.\n */\nexport function getProjectRoot(args: arg.Result<arg.Spec>) {\n const projectRoot = resolve(args._[0] || '.');\n\n if (!existsSync(projectRoot)) {\n Log.exit(`Invalid project root: ${projectRoot}`);\n }\n\n return projectRoot;\n}\n\n/**\n * Parse args and assert unknown options.\n *\n * @param schema the `args` schema for parsing the command line arguments.\n * @param argv extra strings\n * @returns processed args object.\n */\nexport function assertArgs(schema: arg.Spec, argv?: string[]): arg.Result<arg.Spec> {\n return assertWithOptionsArgs(schema, { argv });\n}\n\nexport function assertWithOptionsArgs(\n schema: arg.Spec,\n options: arg.Options\n): arg.Result<arg.Spec> {\n try {\n return arg(schema, options);\n } catch (error: any) {\n // Handle errors caused by user input.\n // Only errors from `arg`, which does not start with `ARG_CONFIG_` are user input errors.\n // See: https://github.com/vercel/arg/releases/tag/5.0.0\n if ('code' in error && error.code.startsWith('ARG_') && !error.code.startsWith('ARG_CONFIG_')) {\n Log.exit(error.message, 1);\n }\n // Otherwise rethrow the error.\n throw error;\n }\n}\n\nexport function printHelp(info: string, usage: string, options: string, extra: string = ''): never {\n Log.exit(\n chalk`\n {bold Info}\n ${info}\n\n {bold Usage}\n {dim $} ${usage}\n\n {bold Options}\n ${options.split('\\n').join('\\n ')}\n` + extra,\n 0\n );\n}\n"],"names":["getProjectRoot","assertArgs","assertWithOptionsArgs","printHelp","args","projectRoot","resolve","_","existsSync","Log","exit","schema","argv","options","arg","error","code","startsWith","message","info","usage","extra","chalk","split","join"],"mappings":"AAAA,wDAAwD;AACxD,mDAAmD;AACnD;;;;;;;;;;;IAYgBA,cAAc,MAAdA,cAAc;IAiBdC,UAAU,MAAVA,UAAU;IAIVC,qBAAqB,MAArBA,qBAAqB;IAkBrBC,SAAS,MAATA,SAAS;;;8DAnDT,KAAK;;;;;;;8DACH,OAAO;;;;;;;yBACE,IAAI;;;;;;;yBACP,MAAM;;;;;;2DAET,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOtB,SAASH,cAAc,CAACI,IAA0B,EAAE;IACzD,MAAMC,WAAW,GAAGC,IAAAA,KAAO,EAAA,QAAA,EAACF,IAAI,CAACG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,AAAC;IAE9C,IAAI,CAACC,IAAAA,GAAU,EAAA,WAAA,EAACH,WAAW,CAAC,EAAE;QAC5BI,IAAG,CAACC,IAAI,CAAC,CAAC,sBAAsB,EAAEL,WAAW,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAOA,WAAW,CAAC;AACrB,CAAC;AASM,SAASJ,UAAU,CAACU,MAAgB,EAAEC,IAAe,EAAwB;IAClF,OAAOV,qBAAqB,CAACS,MAAM,EAAE;QAAEC,IAAI;KAAE,CAAC,CAAC;AACjD,CAAC;AAEM,SAASV,qBAAqB,CACnCS,MAAgB,EAChBE,OAAoB,EACE;IACtB,IAAI;QACF,OAAOC,IAAAA,IAAG,EAAA,QAAA,EAACH,MAAM,EAAEE,OAAO,CAAC,CAAC;IAC9B,EAAE,OAAOE,KAAK,EAAO;QACnB,sCAAsC;QACtC,yFAAyF;QACzF,wDAAwD;QACxD,IAAI,MAAM,IAAIA,KAAK,IAAIA,KAAK,CAACC,IAAI,CAACC,UAAU,CAAC,MAAM,CAAC,IAAI,CAACF,KAAK,CAACC,IAAI,CAACC,UAAU,CAAC,aAAa,CAAC,EAAE;YAC7FR,IAAG,CAACC,IAAI,CAACK,KAAK,CAACG,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,+BAA+B;QAC/B,MAAMH,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAEM,SAASZ,SAAS,CAACgB,IAAY,EAAEC,KAAa,EAAEP,OAAe,EAAEQ,KAAa,GAAG,EAAE,EAAS;IACjGZ,IAAG,CAACC,IAAI,CACNY,IAAAA,MAAK,EAAA,QAAA,CAAA,CAAC;;IAEN,EAAEH,IAAI,CAAC;;;YAGC,EAAEC,KAAK,CAAC;;;IAGhB,EAAEP,OAAO,CAACU,KAAK,CAAC,IAAI,CAAC,CAACC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC,GAAGH,KAAK,EACL,CAAC,CACF,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,74 @@
/** Returns the last index of an item based on a given criteria. */ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
findLastIndex: ()=>findLastIndex,
intersecting: ()=>intersecting,
replaceValue: ()=>replaceValue,
uniqBy: ()=>uniqBy,
chunk: ()=>chunk,
groupBy: ()=>groupBy
});
function findLastIndex(array, predicate) {
for(let i = array.length - 1; i >= 0; i--){
if (predicate(array[i])) {
return i;
}
}
return -1;
}
function intersecting(a, b) {
const [c, d] = a.length > b.length ? [
a,
b
] : [
b,
a
];
return c.filter((value)=>d.includes(value));
}
function replaceValue(values, original, replacement) {
const index = values.indexOf(original);
if (index > -1) {
values[index] = replacement;
}
return values;
}
function uniqBy(array, key) {
const seen = {};
return array.filter((item)=>{
const k = key(item);
if (seen[k]) {
return false;
}
seen[k] = true;
return true;
});
}
function chunk(array, size) {
const chunked = [];
let index = 0;
while(index < array.length){
chunked.push(array.slice(index, index += size));
}
return chunked;
}
function groupBy(list, getKey) {
return list.reduce((previous, currentItem)=>{
const group = getKey(currentItem);
if (!previous[group]) {
previous[group] = [];
}
previous[group].push(currentItem);
return previous;
}, {});
}
//# sourceMappingURL=array.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/array.ts"],"sourcesContent":["/** Returns the last index of an item based on a given criteria. */\nexport function findLastIndex<T>(array: T[], predicate: (item: T) => boolean) {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n return i;\n }\n }\n return -1;\n}\n\n/** Returns a list of items that intersect between two given arrays. */\nexport function intersecting<T>(a: T[], b: T[]): T[] {\n const [c, d] = a.length > b.length ? [a, b] : [b, a];\n return c.filter((value) => d.includes(value));\n}\n\nexport function replaceValue<T>(values: T[], original: T, replacement: T): T[] {\n const index = values.indexOf(original);\n if (index > -1) {\n values[index] = replacement;\n }\n return values;\n}\n\n/** lodash.uniqBy */\nexport function uniqBy<T>(array: T[], key: (item: T) => string): T[] {\n const seen: { [key: string]: boolean } = {};\n return array.filter((item) => {\n const k = key(item);\n if (seen[k]) {\n return false;\n }\n seen[k] = true;\n return true;\n });\n}\n\n/** `lodash.chunk` */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunked = [];\n let index = 0;\n while (index < array.length) {\n chunked.push(array.slice(index, (index += size)));\n }\n return chunked;\n}\n\n/** `lodash.groupBy` */\nexport function groupBy<T, K extends keyof any>(list: T[], getKey: (item: T) => K): Record<K, T[]> {\n return list.reduce(\n (previous, currentItem) => {\n const group = getKey(currentItem);\n if (!previous[group]) {\n previous[group] = [];\n }\n previous[group].push(currentItem);\n return previous;\n },\n {} as Record<K, T[]>\n );\n}\n"],"names":["findLastIndex","intersecting","replaceValue","uniqBy","chunk","groupBy","array","predicate","i","length","a","b","c","d","filter","value","includes","values","original","replacement","index","indexOf","key","seen","item","k","size","chunked","push","slice","list","getKey","reduce","previous","currentItem","group"],"mappings":"AAAA,iEAAiE,GACjE;;;;;;;;;;;IAAgBA,aAAa,MAAbA,aAAa;IAUbC,YAAY,MAAZA,YAAY;IAKZC,YAAY,MAAZA,YAAY;IASZC,MAAM,MAANA,MAAM;IAaNC,KAAK,MAALA,KAAK;IAULC,OAAO,MAAPA,OAAO;;AA/ChB,SAASL,aAAa,CAAIM,KAAU,EAAEC,SAA+B,EAAE;IAC5E,IAAK,IAAIC,CAAC,GAAGF,KAAK,CAACG,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,CAAE;QAC1C,IAAID,SAAS,CAACD,KAAK,CAACE,CAAC,CAAC,CAAC,EAAE;YACvB,OAAOA,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAGM,SAASP,YAAY,CAAIS,CAAM,EAAEC,CAAM,EAAO;IACnD,MAAM,CAACC,CAAC,EAAEC,CAAC,CAAC,GAAGH,CAAC,CAACD,MAAM,GAAGE,CAAC,CAACF,MAAM,GAAG;QAACC,CAAC;QAAEC,CAAC;KAAC,GAAG;QAACA,CAAC;QAAED,CAAC;KAAC,AAAC;IACrD,OAAOE,CAAC,CAACE,MAAM,CAAC,CAACC,KAAK,GAAKF,CAAC,CAACG,QAAQ,CAACD,KAAK,CAAC,CAAC,CAAC;AAChD,CAAC;AAEM,SAASb,YAAY,CAAIe,MAAW,EAAEC,QAAW,EAAEC,WAAc,EAAO;IAC7E,MAAMC,KAAK,GAAGH,MAAM,CAACI,OAAO,CAACH,QAAQ,CAAC,AAAC;IACvC,IAAIE,KAAK,GAAG,CAAC,CAAC,EAAE;QACdH,MAAM,CAACG,KAAK,CAAC,GAAGD,WAAW,CAAC;IAC9B,CAAC;IACD,OAAOF,MAAM,CAAC;AAChB,CAAC;AAGM,SAASd,MAAM,CAAIG,KAAU,EAAEgB,GAAwB,EAAO;IACnE,MAAMC,IAAI,GAA+B,EAAE,AAAC;IAC5C,OAAOjB,KAAK,CAACQ,MAAM,CAAC,CAACU,IAAI,GAAK;QAC5B,MAAMC,CAAC,GAAGH,GAAG,CAACE,IAAI,CAAC,AAAC;QACpB,IAAID,IAAI,CAACE,CAAC,CAAC,EAAE;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACDF,IAAI,CAACE,CAAC,CAAC,GAAG,IAAI,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAGM,SAASrB,KAAK,CAAIE,KAAU,EAAEoB,IAAY,EAAS;IACxD,MAAMC,OAAO,GAAG,EAAE,AAAC;IACnB,IAAIP,KAAK,GAAG,CAAC,AAAC;IACd,MAAOA,KAAK,GAAGd,KAAK,CAACG,MAAM,CAAE;QAC3BkB,OAAO,CAACC,IAAI,CAACtB,KAAK,CAACuB,KAAK,CAACT,KAAK,EAAGA,KAAK,IAAIM,IAAI,CAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAOC,OAAO,CAAC;AACjB,CAAC;AAGM,SAAStB,OAAO,CAAyByB,IAAS,EAAEC,MAAsB,EAAkB;IACjG,OAAOD,IAAI,CAACE,MAAM,CAChB,CAACC,QAAQ,EAAEC,WAAW,GAAK;QACzB,MAAMC,KAAK,GAAGJ,MAAM,CAACG,WAAW,CAAC,AAAC;QAClC,IAAI,CAACD,QAAQ,CAACE,KAAK,CAAC,EAAE;YACpBF,QAAQ,CAACE,KAAK,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;QACDF,QAAQ,CAACE,KAAK,CAAC,CAACP,IAAI,CAACM,WAAW,CAAC,CAAC;QAClC,OAAOD,QAAQ,CAAC;IAClB,CAAC,EACD,EAAE,CACH,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,250 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
hasPackageJsonDependencyListChangedAsync: ()=>hasPackageJsonDependencyListChangedAsync,
installCocoaPodsAsync: ()=>installCocoaPodsAsync,
maybePromptToSyncPodsAsync: ()=>maybePromptToSyncPodsAsync
});
function _config() {
const data = require("@expo/config");
_config = function() {
return data;
};
return data;
}
function _jsonFile() {
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/json-file"));
_jsonFile = function() {
return data;
};
return data;
}
function _packageManager() {
const data = /*#__PURE__*/ _interopRequireWildcard(require("@expo/package-manager"));
_packageManager = function() {
return data;
};
return data;
}
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
function _fs() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
_fs = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
const _dir = require("./dir");
const _env = require("./env");
const _errors = require("./errors");
const _ora = require("./ora");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
const _updatePackageJson = require("../prebuild/updatePackageJson");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const PROJECT_PREBUILD_SETTINGS = ".expo/prebuild";
const CACHED_PACKAGE_JSON = "cached-packages.json";
function getTempPrebuildFolder(projectRoot) {
return _path().default.join(projectRoot, PROJECT_PREBUILD_SETTINGS);
}
function hasNewDependenciesSinceLastBuild(projectRoot, packageChecksums) {
// TODO: Maybe comparing lock files would be better...
const templateDirectory = getTempPrebuildFolder(projectRoot);
const tempPkgJsonPath = _path().default.join(templateDirectory, CACHED_PACKAGE_JSON);
if (!_fs().default.existsSync(tempPkgJsonPath)) {
return true;
}
const { dependencies , devDependencies } = _jsonFile().default.read(tempPkgJsonPath);
// Only change the dependencies if the normalized hash changes, this helps to reduce meaningless changes.
const hasNewDependencies = packageChecksums.dependencies !== dependencies;
const hasNewDevDependencies = packageChecksums.devDependencies !== devDependencies;
return hasNewDependencies || hasNewDevDependencies;
}
function createPackageChecksums(pkg) {
return {
dependencies: (0, _updatePackageJson.hashForDependencyMap)(pkg.dependencies || {}),
devDependencies: (0, _updatePackageJson.hashForDependencyMap)(pkg.devDependencies || {})
};
}
async function hasPackageJsonDependencyListChangedAsync(projectRoot) {
const pkg = (0, _config().getPackageJson)(projectRoot);
const packages = createPackageChecksums(pkg);
const hasNewDependencies = hasNewDependenciesSinceLastBuild(projectRoot, packages);
// Cache package.json
await (0, _dir.ensureDirectoryAsync)(getTempPrebuildFolder(projectRoot));
const templateDirectory = _path().default.join(getTempPrebuildFolder(projectRoot), CACHED_PACKAGE_JSON);
await _jsonFile().default.writeAsync(templateDirectory, packages);
return hasNewDependencies;
}
async function installCocoaPodsAsync(projectRoot) {
let step = (0, _ora.logNewSection)("Installing CocoaPods...");
if (process.platform !== "darwin") {
step.succeed("Skipped installing CocoaPods because operating system is not on macOS.");
return false;
}
const packageManager = new (_packageManager()).CocoaPodsPackageManager({
cwd: _path().default.join(projectRoot, "ios"),
silent: !(_env.env.EXPO_DEBUG || _env.env.CI)
});
if (!await packageManager.isCLIInstalledAsync()) {
try {
// prompt user -- do you want to install cocoapods right now?
step.text = "CocoaPods CLI not found in your PATH, installing it now.";
step.stopAndPersist();
await _packageManager().CocoaPodsPackageManager.installCLIAsync({
nonInteractive: true,
spawnOptions: {
...packageManager.options,
// Don't silence this part
stdio: [
"inherit",
"inherit",
"pipe"
]
}
});
step.succeed("Installed CocoaPods CLI.");
step = (0, _ora.logNewSection)("Running `pod install` in the `ios` directory.");
} catch (error) {
step.stopAndPersist({
symbol: "⚠️ ",
text: _chalk().default.red("Unable to install the CocoaPods CLI.")
});
if (error instanceof _packageManager().CocoaPodsError) {
_log.log(error.message);
} else {
_log.log(`Unknown error: ${error.message}`);
}
return false;
}
}
try {
await packageManager.installAsync({
spinner: step
});
// Create cached list for later
await hasPackageJsonDependencyListChangedAsync(projectRoot).catch(()=>null);
step.succeed("Installed CocoaPods");
return true;
} catch (error1) {
step.stopAndPersist({
symbol: "⚠️ ",
text: _chalk().default.red("Something went wrong running `pod install` in the `ios` directory.")
});
if (error1 instanceof _packageManager().CocoaPodsError) {
_log.log(error1.message);
} else {
_log.log(`Unknown error: ${error1.message}`);
}
return false;
}
}
function doesProjectUseCocoaPods(projectRoot) {
return _fs().default.existsSync(_path().default.join(projectRoot, "ios", "Podfile"));
}
function isLockfileCreated(projectRoot) {
const podfileLockPath = _path().default.join(projectRoot, "ios", "Podfile.lock");
return _fs().default.existsSync(podfileLockPath);
}
function isPodFolderCreated(projectRoot) {
const podFolderPath = _path().default.join(projectRoot, "ios", "Pods");
return _fs().default.existsSync(podFolderPath);
}
async function maybePromptToSyncPodsAsync(projectRoot) {
if (!doesProjectUseCocoaPods(projectRoot)) {
// Project does not use CocoaPods
return;
}
if (!isLockfileCreated(projectRoot) || !isPodFolderCreated(projectRoot)) {
if (!await installCocoaPodsAsync(projectRoot)) {
throw new _errors.AbortCommandError();
}
return;
}
// Getting autolinked packages can be heavy, optimize around checking every time.
if (!await hasPackageJsonDependencyListChangedAsync(projectRoot)) {
return;
}
await promptToInstallPodsAsync(projectRoot, []);
}
async function promptToInstallPodsAsync(projectRoot, missingPods) {
if (missingPods == null ? void 0 : missingPods.length) {
_log.log(`Could not find the following native modules: ${missingPods.map((pod)=>_chalk().default.bold(pod)).join(", ")}. Did you forget to run "${_chalk().default.bold("pod install")}" ?`);
}
try {
if (!await installCocoaPodsAsync(projectRoot)) {
throw new _errors.AbortCommandError();
}
} catch (error) {
await _fs().default.promises.rm(_path().default.join(getTempPrebuildFolder(projectRoot), CACHED_PACKAGE_JSON), {
recursive: true,
force: true
});
throw error;
}
}
//# sourceMappingURL=cocoapods.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,393 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
getDevelopmentCodeSigningDirectory: ()=>getDevelopmentCodeSigningDirectory,
DevelopmentCodeSigningInfoFile: ()=>DevelopmentCodeSigningInfoFile,
getCodeSigningInfoAsync: ()=>getCodeSigningInfoAsync,
signManifestString: ()=>signManifestString
});
function _codeSigningCertificates() {
const data = require("@expo/code-signing-certificates");
_codeSigningCertificates = function() {
return data;
};
return data;
}
function _getUserState() {
const data = require("@expo/config/build/getUserState");
_getUserState = function() {
return data;
};
return data;
}
function _jsonFile() {
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/json-file"));
_jsonFile = function() {
return data;
};
return data;
}
function _core() {
const data = require("@urql/core");
_core = function() {
return data;
};
return data;
}
function _fs() {
const data = require("fs");
_fs = function() {
return data;
};
return data;
}
function _graphql() {
const data = require("graphql");
_graphql = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
function _structuredHeaders() {
const data = require("structured-headers");
_structuredHeaders = function() {
return data;
};
return data;
}
const _env = require("./env");
const _errors = require("./errors");
const _getExpoGoIntermediateCertificate = require("../api/getExpoGoIntermediateCertificate");
const _getProjectDevelopmentCertificate = require("../api/getProjectDevelopmentCertificate");
const _appQuery = require("../api/graphql/queries/AppQuery");
const _actions = require("../api/user/actions");
const _generated = require("../graphql/generated");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
const _link = require("../utils/link");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const debug = require("debug")("expo:codesigning");
const DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME = "development-code-signing-settings-2.json";
function getDevelopmentCodeSigningDirectory() {
return _path().default.join((0, _getUserState().getExpoHomeDirectory)(), "codesigning");
}
function getProjectDevelopmentCodeSigningInfoFile(defaults) {
function getFile(easProjectId) {
const filePath = _path().default.join(getDevelopmentCodeSigningDirectory(), easProjectId, DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME);
return new (_jsonFile()).default(filePath);
}
async function readAsync(easProjectId) {
let projectSettings;
try {
projectSettings = await getFile(easProjectId).readAsync();
} catch {
projectSettings = await getFile(easProjectId).writeAsync(defaults, {
ensureDir: true
});
}
// Set defaults for any missing fields
return {
...defaults,
...projectSettings
};
}
async function setAsync(easProjectId, json) {
try {
return await getFile(easProjectId).mergeAsync(json, {
cantReadFileDefault: defaults
});
} catch {
return await getFile(easProjectId).writeAsync({
...defaults,
...json
}, {
ensureDir: true
});
}
}
return {
getFile,
readAsync,
setAsync
};
}
const DevelopmentCodeSigningInfoFile = getProjectDevelopmentCodeSigningInfoFile({
easProjectId: null,
scopeKey: null,
privateKey: null,
certificateChain: null
});
async function getCodeSigningInfoAsync(exp, expectSignatureHeader, privateKeyPath) {
if (!expectSignatureHeader) {
return null;
}
let parsedExpectSignature;
try {
parsedExpectSignature = (0, _structuredHeaders().parseDictionary)(expectSignatureHeader);
} catch {
throw new _errors.CommandError("Invalid value for expo-expect-signature header");
}
const expectedKeyIdOuter = parsedExpectSignature.get("keyid");
if (!expectedKeyIdOuter) {
throw new _errors.CommandError("keyid not present in expo-expect-signature header");
}
const expectedKeyId = expectedKeyIdOuter[0];
if (typeof expectedKeyId !== "string") {
throw new _errors.CommandError(`Invalid value for keyid in expo-expect-signature header: ${expectedKeyId}`);
}
let expectedAlg = null;
const expectedAlgOuter = parsedExpectSignature.get("alg");
if (expectedAlgOuter) {
const expectedAlgTemp = expectedAlgOuter[0];
if (typeof expectedAlgTemp !== "string") {
throw new _errors.CommandError("Invalid value for alg in expo-expect-signature header");
}
expectedAlg = expectedAlgTemp;
}
if (expectedKeyId === "expo-root") {
return await getExpoRootDevelopmentCodeSigningInfoAsync(exp);
} else if (expectedKeyId === "expo-go") {
throw new _errors.CommandError("Invalid certificate requested: cannot sign with embedded keyid=expo-go key");
} else {
return await getProjectCodeSigningCertificateAsync(exp, privateKeyPath, expectedKeyId, expectedAlg);
}
}
/**
* Get a development code signing certificate for the expo-root -> expo-go -> (development certificate) certificate chain.
* This requires the user be logged in and online, otherwise try to use the cached development certificate.
*/ async function getExpoRootDevelopmentCodeSigningInfoAsync(exp) {
var ref, ref1;
const easProjectId = (ref = exp.extra) == null ? void 0 : (ref1 = ref.eas) == null ? void 0 : ref1.projectId;
// can't check for scope key validity since scope key is derived on the server from projectId and we may be offline.
// we rely upon the client certificate check to validate the scope key
if (!easProjectId) {
debug(`WARN: Expo Application Services (EAS) is not configured for your project. Configuring EAS enables a more secure development experience amongst many other benefits. ${(0, _link.learnMore)("https://docs.expo.dev/eas/")}`);
return null;
}
const developmentCodeSigningInfoFromFile = await DevelopmentCodeSigningInfoFile.readAsync(easProjectId);
const validatedCodeSigningInfo = validateStoredDevelopmentExpoRootCertificateCodeSigningInfo(developmentCodeSigningInfoFromFile, easProjectId);
// 1. If online, ensure logged in, generate key pair and CSR, fetch and cache certificate chain for projectId
// (overwriting existing dev cert in case projectId changed or it has expired)
if (!_env.env.EXPO_OFFLINE) {
try {
return await fetchAndCacheNewDevelopmentCodeSigningInfoAsync(easProjectId);
} catch (e) {
if (validatedCodeSigningInfo) {
_log.warn("There was an error fetching the Expo development certificate, falling back to cached certificate");
return validatedCodeSigningInfo;
} else {
// need to return null here and say a message
throw e;
}
}
}
// 2. check for cached cert/private key matching projectId and scopeKey of project, if found and valid return private key and cert chain including expo-go cert
if (validatedCodeSigningInfo) {
return validatedCodeSigningInfo;
}
// 3. if offline, return null
_log.warn("Offline and no cached development certificate found, unable to sign manifest");
return null;
}
/**
* Get the certificate configured for expo-updates for this project.
*/ async function getProjectCodeSigningCertificateAsync(exp, privateKeyPath, expectedKeyId, expectedAlg) {
var ref, ref1;
const codeSigningCertificatePath = (ref = exp.updates) == null ? void 0 : ref.codeSigningCertificate;
if (!codeSigningCertificatePath) {
return null;
}
if (!privateKeyPath) {
throw new _errors.CommandError("Must specify --private-key-path argument to sign development manifest for requested code signing key");
}
const codeSigningMetadata = (ref1 = exp.updates) == null ? void 0 : ref1.codeSigningMetadata;
if (!codeSigningMetadata) {
throw new _errors.CommandError('Must specify "codeSigningMetadata" under the "updates" field of your app config file to use EAS code signing');
}
const { alg , keyid } = codeSigningMetadata;
if (!alg || !keyid) {
throw new _errors.CommandError('Must specify "keyid" and "alg" in the "codeSigningMetadata" field under the "updates" field of your app config file to use EAS code signing');
}
if (expectedKeyId !== keyid) {
throw new _errors.CommandError(`keyid mismatch: client=${expectedKeyId}, project=${keyid}`);
}
if (expectedAlg && expectedAlg !== alg) {
throw new _errors.CommandError(`"alg" field mismatch (client=${expectedAlg}, project=${alg})`);
}
const { privateKeyPEM , certificatePEM } = await getProjectPrivateKeyAndCertificateFromFilePathsAsync({
codeSigningCertificatePath,
privateKeyPath
});
return {
keyId: keyid,
privateKey: privateKeyPEM,
certificateForPrivateKey: certificatePEM,
certificateChainForResponse: [],
scopeKey: null
};
}
async function readFileWithErrorAsync(path, errorMessage) {
try {
return await _fs().promises.readFile(path, "utf8");
} catch {
throw new _errors.CommandError(errorMessage);
}
}
async function getProjectPrivateKeyAndCertificateFromFilePathsAsync({ codeSigningCertificatePath , privateKeyPath }) {
const [codeSigningCertificatePEM, privateKeyPEM] = await Promise.all([
readFileWithErrorAsync(codeSigningCertificatePath, `Code signing certificate cannot be read from path: ${codeSigningCertificatePath}`),
readFileWithErrorAsync(privateKeyPath, `Code signing private key cannot be read from path: ${privateKeyPath}`),
]);
const privateKey = (0, _codeSigningCertificates().convertPrivateKeyPEMToPrivateKey)(privateKeyPEM);
const certificate = (0, _codeSigningCertificates().convertCertificatePEMToCertificate)(codeSigningCertificatePEM);
(0, _codeSigningCertificates().validateSelfSignedCertificate)(certificate, {
publicKey: certificate.publicKey,
privateKey
});
return {
privateKeyPEM,
certificatePEM: codeSigningCertificatePEM
};
}
/**
* Validate that the cached code signing info is still valid for the current project and
* that it hasn't expired. If invalid, return null.
*/ function validateStoredDevelopmentExpoRootCertificateCodeSigningInfo(codeSigningInfo, easProjectId) {
if (codeSigningInfo.easProjectId !== easProjectId) {
return null;
}
const { privateKey: privateKeyPEM , certificateChain: certificatePEMs , scopeKey , } = codeSigningInfo;
if (!privateKeyPEM || !certificatePEMs) {
return null;
}
const certificateChain = certificatePEMs.map((certificatePEM)=>(0, _codeSigningCertificates().convertCertificatePEMToCertificate)(certificatePEM));
// TODO(wschurman): maybe move to @expo/code-signing-certificates
// ensure all intermediate certificates are valid
for (const certificate of certificateChain){
const now = new Date();
if (certificate.validity.notBefore > now || certificate.validity.notAfter < now) {
return null;
}
}
// TODO(wschurman): maybe do more validation, like validation of projectID and scopeKey within eas certificate extension
return {
keyId: "expo-go",
certificateChainForResponse: certificatePEMs,
certificateForPrivateKey: certificatePEMs[0],
privateKey: privateKeyPEM,
scopeKey
};
}
function actorCanGetProjectDevelopmentCertificate(actor, app) {
var ref, ref1, ref2, ref3;
const owningAccountId = app.ownerAccount.id;
const owningAccountIsActorPrimaryAccount = actor.__typename === "User" || actor.__typename === "SSOUser" ? actor.primaryAccount.id === owningAccountId : false;
const userHasPublishPermissionForOwningAccount = !!((ref2 = (ref = actor.accounts.find((account)=>account.id === owningAccountId)) == null ? void 0 : (ref1 = ref.users) == null ? void 0 : ref1.find((userPermission)=>userPermission.actor.id === actor.id)) == null ? void 0 : (ref3 = ref2.permissions) == null ? void 0 : ref3.includes(_generated.Permission.Publish));
return owningAccountIsActorPrimaryAccount || userHasPublishPermissionForOwningAccount;
}
async function fetchAndCacheNewDevelopmentCodeSigningInfoAsync(easProjectId) {
const actor = await (0, _actions.ensureLoggedInAsync)();
let app;
try {
app = await _appQuery.AppQuery.byIdAsync(easProjectId);
} catch (e) {
if (e instanceof _graphql().GraphQLError || e instanceof _core().CombinedError) {
return null;
}
throw e;
}
if (!actorCanGetProjectDevelopmentCertificate(actor, app)) {
return null;
}
const keyPair = (0, _codeSigningCertificates().generateKeyPair)();
const keyPairPEM = (0, _codeSigningCertificates().convertKeyPairToPEM)(keyPair);
const csr = (0, _codeSigningCertificates().generateCSR)(keyPair, `Development Certificate for ${easProjectId}`);
const csrPEM = (0, _codeSigningCertificates().convertCSRToCSRPEM)(csr);
const [developmentSigningCertificate, expoGoIntermediateCertificate] = await Promise.all([
(0, _getProjectDevelopmentCertificate.getProjectDevelopmentCertificateAsync)(easProjectId, csrPEM),
(0, _getExpoGoIntermediateCertificate.getExpoGoIntermediateCertificateAsync)(easProjectId),
]);
await DevelopmentCodeSigningInfoFile.setAsync(easProjectId, {
easProjectId,
scopeKey: app.scopeKey,
privateKey: keyPairPEM.privateKeyPEM,
certificateChain: [
developmentSigningCertificate,
expoGoIntermediateCertificate
]
});
return {
keyId: "expo-go",
certificateChainForResponse: [
developmentSigningCertificate,
expoGoIntermediateCertificate
],
certificateForPrivateKey: developmentSigningCertificate,
privateKey: keyPairPEM.privateKeyPEM,
scopeKey: app.scopeKey
};
}
function signManifestString(stringifiedManifest, codeSigningInfo) {
const privateKey = (0, _codeSigningCertificates().convertPrivateKeyPEMToPrivateKey)(codeSigningInfo.privateKey);
const certificate = (0, _codeSigningCertificates().convertCertificatePEMToCertificate)(codeSigningInfo.certificateForPrivateKey);
return (0, _codeSigningCertificates().signBufferRSASHA256AndVerify)(privateKey, certificate, Buffer.from(stringifiedManifest, "utf8"));
}
//# sourceMappingURL=codesigning.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,65 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
createEntryResolver: ()=>createEntryResolver,
createGlobFilter: ()=>createGlobFilter
});
function _configPlugins() {
const data = require("@expo/config-plugins");
_configPlugins = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
function _picomatch() {
const data = /*#__PURE__*/ _interopRequireDefault(require("picomatch"));
_picomatch = function() {
return data;
};
return data;
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const debug = require("debug")("expo:file-transform");
function createEntryResolver(name) {
return (entry)=>{
if (name) {
// Rewrite paths for bare workflow
entry.path = entry.path.replace(/HelloWorld/g, entry.path.includes("android") ? _configPlugins().IOSConfig.XcodeUtils.sanitizedName(name.toLowerCase()) : _configPlugins().IOSConfig.XcodeUtils.sanitizedName(name)).replace(/helloworld/g, _configPlugins().IOSConfig.XcodeUtils.sanitizedName(name).toLowerCase());
}
if (entry.type && /^file$/i.test(entry.type) && _path().default.basename(entry.path) === "gitignore") {
// Rename `gitignore` because npm ignores files named `.gitignore` when publishing.
// See: https://github.com/npm/npm/issues/1862
entry.path = entry.path.replace(/gitignore$/, ".gitignore");
}
};
}
function createGlobFilter(globPattern, options) {
const matcher = (0, _picomatch().default)(globPattern, options);
debug('filter: created for pattern(s) "%s" (%s)', Array.isArray(globPattern) ? globPattern.join('", "') : globPattern, options);
return (path)=>{
const included = matcher(path);
debug("filter: %s - %s", included ? "include" : "exclude", path);
return included;
};
}
//# sourceMappingURL=createFileTransform.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/createFileTransform.ts"],"sourcesContent":["import { IOSConfig } from '@expo/config-plugins';\nimport path from 'path';\nimport picomatch from 'picomatch';\nimport { ReadEntry } from 'tar';\n\nconst debug = require('debug')('expo:file-transform') as typeof console.log;\n\nexport function createEntryResolver(name: string) {\n return (entry: ReadEntry) => {\n if (name) {\n // Rewrite paths for bare workflow\n entry.path = entry.path\n .replace(\n /HelloWorld/g,\n entry.path.includes('android')\n ? IOSConfig.XcodeUtils.sanitizedName(name.toLowerCase())\n : IOSConfig.XcodeUtils.sanitizedName(name)\n )\n .replace(/helloworld/g, IOSConfig.XcodeUtils.sanitizedName(name).toLowerCase());\n }\n if (entry.type && /^file$/i.test(entry.type) && path.basename(entry.path) === 'gitignore') {\n // Rename `gitignore` because npm ignores files named `.gitignore` when publishing.\n // See: https://github.com/npm/npm/issues/1862\n entry.path = entry.path.replace(/gitignore$/, '.gitignore');\n }\n };\n}\n\nexport function createGlobFilter(\n globPattern: picomatch.Glob,\n options?: picomatch.PicomatchOptions\n) {\n const matcher = picomatch(globPattern, options);\n\n debug(\n 'filter: created for pattern(s) \"%s\" (%s)',\n Array.isArray(globPattern) ? globPattern.join('\", \"') : globPattern,\n options\n );\n\n return (path: string) => {\n const included = matcher(path);\n debug('filter: %s - %s', included ? 'include' : 'exclude', path);\n return included;\n };\n}\n"],"names":["createEntryResolver","createGlobFilter","debug","require","name","entry","path","replace","includes","IOSConfig","XcodeUtils","sanitizedName","toLowerCase","type","test","basename","globPattern","options","matcher","picomatch","Array","isArray","join","included"],"mappings":"AAAA;;;;;;;;;;;IAOgBA,mBAAmB,MAAnBA,mBAAmB;IAqBnBC,gBAAgB,MAAhBA,gBAAgB;;;yBA5BN,sBAAsB;;;;;;;8DAC/B,MAAM;;;;;;;8DACD,WAAW;;;;;;;;;;;AAGjC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,AAAsB,AAAC;AAErE,SAASH,mBAAmB,CAACI,IAAY,EAAE;IAChD,OAAO,CAACC,KAAgB,GAAK;QAC3B,IAAID,IAAI,EAAE;YACR,kCAAkC;YAClCC,KAAK,CAACC,IAAI,GAAGD,KAAK,CAACC,IAAI,CACpBC,OAAO,gBAENF,KAAK,CAACC,IAAI,CAACE,QAAQ,CAAC,SAAS,CAAC,GAC1BC,cAAS,EAAA,UAAA,CAACC,UAAU,CAACC,aAAa,CAACP,IAAI,CAACQ,WAAW,EAAE,CAAC,GACtDH,cAAS,EAAA,UAAA,CAACC,UAAU,CAACC,aAAa,CAACP,IAAI,CAAC,CAC7C,CACAG,OAAO,gBAAgBE,cAAS,EAAA,UAAA,CAACC,UAAU,CAACC,aAAa,CAACP,IAAI,CAAC,CAACQ,WAAW,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,IAAIP,KAAK,CAACQ,IAAI,IAAI,UAAUC,IAAI,CAACT,KAAK,CAACQ,IAAI,CAAC,IAAIP,KAAI,EAAA,QAAA,CAACS,QAAQ,CAACV,KAAK,CAACC,IAAI,CAAC,KAAK,WAAW,EAAE;YACzF,mFAAmF;YACnF,8CAA8C;YAC9CD,KAAK,CAACC,IAAI,GAAGD,KAAK,CAACC,IAAI,CAACC,OAAO,eAAe,YAAY,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAEM,SAASN,gBAAgB,CAC9Be,WAA2B,EAC3BC,OAAoC,EACpC;IACA,MAAMC,OAAO,GAAGC,IAAAA,UAAS,EAAA,QAAA,EAACH,WAAW,EAAEC,OAAO,CAAC,AAAC;IAEhDf,KAAK,CACH,0CAA0C,EAC1CkB,KAAK,CAACC,OAAO,CAACL,WAAW,CAAC,GAAGA,WAAW,CAACM,IAAI,CAAC,MAAM,CAAC,GAAGN,WAAW,EACnEC,OAAO,CACR,CAAC;IAEF,OAAO,CAACX,IAAY,GAAK;QACvB,MAAMiB,QAAQ,GAAGL,OAAO,CAACZ,IAAI,CAAC,AAAC;QAC/BJ,KAAK,CAAC,iBAAiB,EAAEqB,QAAQ,GAAG,SAAS,GAAG,SAAS,EAAEjB,IAAI,CAAC,CAAC;QACjE,OAAOiB,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,46 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
delayAsync: ()=>delayAsync,
waitForActionAsync: ()=>waitForActionAsync,
resolveWithTimeout: ()=>resolveWithTimeout
});
const _errors = require("./errors");
function delayAsync(timeout) {
return new Promise((resolve)=>setTimeout(resolve, timeout));
}
async function waitForActionAsync({ action , interval =100 , maxWaitTime =20000 }) {
let complete;
const start = Date.now();
do {
const actionStartTime = Date.now();
complete = await action();
const actionTimeElapsed = Date.now() - actionStartTime;
const remainingDelayInterval = interval - actionTimeElapsed;
if (remainingDelayInterval > 0) {
await delayAsync(remainingDelayInterval);
}
if (Date.now() - start > maxWaitTime) {
break;
}
}while (!complete);
return complete;
}
function resolveWithTimeout(action, { timeout , errorMessage }) {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
reject(new _errors.CommandError("TIMEOUT", errorMessage));
}, timeout);
action().then(resolve, reject);
});
}
//# sourceMappingURL=delay.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/delay.ts"],"sourcesContent":["import { CommandError } from './errors';\n\n/** Await for a given duration of milliseconds. */\nexport function delayAsync(timeout: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n\n/** Wait for a given action to return a truthy value. */\nexport async function waitForActionAsync<T>({\n action,\n interval = 100,\n maxWaitTime = 20000,\n}: {\n action: () => T | Promise<T>;\n interval?: number;\n maxWaitTime?: number;\n}): Promise<T> {\n let complete: T;\n const start = Date.now();\n do {\n const actionStartTime = Date.now();\n complete = await action();\n\n const actionTimeElapsed = Date.now() - actionStartTime;\n const remainingDelayInterval = interval - actionTimeElapsed;\n if (remainingDelayInterval > 0) {\n await delayAsync(remainingDelayInterval);\n }\n if (Date.now() - start > maxWaitTime) {\n break;\n }\n } while (!complete);\n\n return complete;\n}\n\n/** Resolves a given function or rejects if the provided timeout is passed. */\nexport function resolveWithTimeout<T>(\n action: () => Promise<T>,\n {\n timeout,\n errorMessage,\n }: {\n /** Duration in milliseconds to wait before asserting a timeout. */\n timeout: number;\n /** Optional error message to use in the assertion. */\n errorMessage?: string;\n }\n): Promise<T> {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n reject(new CommandError('TIMEOUT', errorMessage));\n }, timeout);\n action().then(resolve, reject);\n });\n}\n"],"names":["delayAsync","waitForActionAsync","resolveWithTimeout","timeout","Promise","resolve","setTimeout","action","interval","maxWaitTime","complete","start","Date","now","actionStartTime","actionTimeElapsed","remainingDelayInterval","errorMessage","reject","CommandError","then"],"mappings":"AAAA;;;;;;;;;;;IAGgBA,UAAU,MAAVA,UAAU;IAKJC,kBAAkB,MAAlBA,kBAAkB;IA6BxBC,kBAAkB,MAAlBA,kBAAkB;;wBArCL,UAAU;AAGhC,SAASF,UAAU,CAACG,OAAe,EAAiB;IACzD,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,GAAKC,UAAU,CAACD,OAAO,EAAEF,OAAO,CAAC,CAAC,CAAC;AAChE,CAAC;AAGM,eAAeF,kBAAkB,CAAI,EAC1CM,MAAM,CAAA,EACNC,QAAQ,EAAG,GAAG,CAAA,EACdC,WAAW,EAAG,KAAK,CAAA,EAKpB,EAAc;IACb,IAAIC,QAAQ,AAAG,AAAC;IAChB,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAG,EAAE,AAAC;IACzB,GAAG;QACD,MAAMC,eAAe,GAAGF,IAAI,CAACC,GAAG,EAAE,AAAC;QACnCH,QAAQ,GAAG,MAAMH,MAAM,EAAE,CAAC;QAE1B,MAAMQ,iBAAiB,GAAGH,IAAI,CAACC,GAAG,EAAE,GAAGC,eAAe,AAAC;QACvD,MAAME,sBAAsB,GAAGR,QAAQ,GAAGO,iBAAiB,AAAC;QAC5D,IAAIC,sBAAsB,GAAG,CAAC,EAAE;YAC9B,MAAMhB,UAAU,CAACgB,sBAAsB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAIJ,IAAI,CAACC,GAAG,EAAE,GAAGF,KAAK,GAAGF,WAAW,EAAE;YACpC,MAAM;QACR,CAAC;IACH,QAAS,CAACC,QAAQ,EAAE;IAEpB,OAAOA,QAAQ,CAAC;AAClB,CAAC;AAGM,SAASR,kBAAkB,CAChCK,MAAwB,EACxB,EACEJ,OAAO,CAAA,EACPc,YAAY,CAAA,EAMb,EACW;IACZ,OAAO,IAAIb,OAAO,CAAC,CAACC,OAAO,EAAEa,MAAM,GAAK;QACtCZ,UAAU,CAAC,IAAM;YACfY,MAAM,CAAC,IAAIC,OAAY,aAAA,CAAC,SAAS,EAAEF,YAAY,CAAC,CAAC,CAAC;QACpD,CAAC,EAAEd,OAAO,CAAC,CAAC;QACZI,MAAM,EAAE,CAACa,IAAI,CAACf,OAAO,EAAEa,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}

View File

@@ -0,0 +1,73 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
fileExistsSync: ()=>fileExistsSync,
directoryExistsSync: ()=>directoryExistsSync,
directoryExistsAsync: ()=>directoryExistsAsync,
fileExistsAsync: ()=>fileExistsAsync,
ensureDirectoryAsync: ()=>ensureDirectoryAsync,
ensureDirectory: ()=>ensureDirectory,
copySync: ()=>copySync,
copyAsync: ()=>copyAsync,
removeAsync: ()=>removeAsync
});
function _fs() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
_fs = function() {
return data;
};
return data;
}
function _fsExtra() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs-extra"));
_fsExtra = function() {
return data;
};
return data;
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function fileExistsSync(file) {
var ref;
return !!((ref = _fs().default.statSync(file, {
throwIfNoEntry: false
})) == null ? void 0 : ref.isFile());
}
function directoryExistsSync(file) {
var ref;
return !!((ref = _fs().default.statSync(file, {
throwIfNoEntry: false
})) == null ? void 0 : ref.isDirectory());
}
async function directoryExistsAsync(file) {
var ref;
var ref1;
return (ref1 = (ref = await _fs().default.promises.stat(file).catch(()=>null)) == null ? void 0 : ref.isDirectory()) != null ? ref1 : false;
}
async function fileExistsAsync(file) {
var ref;
var ref1;
return (ref1 = (ref = await _fs().default.promises.stat(file).catch(()=>null)) == null ? void 0 : ref.isFile()) != null ? ref1 : false;
}
const ensureDirectoryAsync = (path)=>_fs().default.promises.mkdir(path, {
recursive: true
});
const ensureDirectory = (path)=>_fsExtra().default.mkdirSync(path, {
recursive: true
});
const copySync = _fsExtra().default.copySync;
const copyAsync = _fsExtra().default.copy;
const removeAsync = _fsExtra().default.remove;
//# sourceMappingURL=dir.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/dir.ts"],"sourcesContent":["import fs from 'fs';\nimport fse from 'fs-extra';\n\nexport function fileExistsSync(file: string): boolean {\n return !!fs\n .statSync(file, {\n throwIfNoEntry: false,\n })\n ?.isFile();\n}\n\nexport function directoryExistsSync(file: string): boolean {\n return !!fs\n .statSync(file, {\n throwIfNoEntry: false,\n })\n ?.isDirectory();\n}\n\nexport async function directoryExistsAsync(file: string): Promise<boolean> {\n return (await fs.promises.stat(file).catch(() => null))?.isDirectory() ?? false;\n}\n\nexport async function fileExistsAsync(file: string): Promise<boolean> {\n return (await fs.promises.stat(file).catch(() => null))?.isFile() ?? false;\n}\n\nexport const ensureDirectoryAsync = (path: string) => fs.promises.mkdir(path, { recursive: true });\n\nexport const ensureDirectory = (path: string) => fse.mkdirSync(path, { recursive: true });\n\nexport const copySync = fse.copySync;\n\nexport const copyAsync = fse.copy;\n\nexport const removeAsync = fse.remove;\n"],"names":["fileExistsSync","directoryExistsSync","directoryExistsAsync","fileExistsAsync","ensureDirectoryAsync","ensureDirectory","copySync","copyAsync","removeAsync","file","fs","statSync","throwIfNoEntry","isFile","isDirectory","promises","stat","catch","path","mkdir","recursive","fse","mkdirSync","copy","remove"],"mappings":"AAAA;;;;;;;;;;;IAGgBA,cAAc,MAAdA,cAAc;IAQdC,mBAAmB,MAAnBA,mBAAmB;IAQbC,oBAAoB,MAApBA,oBAAoB;IAIpBC,eAAe,MAAfA,eAAe;IAIxBC,oBAAoB,MAApBA,oBAAoB;IAEpBC,eAAe,MAAfA,eAAe;IAEfC,QAAQ,MAARA,QAAQ;IAERC,SAAS,MAATA,SAAS;IAETC,WAAW,MAAXA,WAAW;;;8DAnCT,IAAI;;;;;;;8DACH,UAAU;;;;;;;;;;;AAEnB,SAASR,cAAc,CAACS,IAAY,EAAW;QAC3CC,GAGL;IAHJ,OAAO,CAAC,EAACA,CAAAA,GAGL,GAHKA,GAAE,EAAA,QAAA,CACRC,QAAQ,CAACF,IAAI,EAAE;QACdG,cAAc,EAAE,KAAK;KACtB,CAAC,SACM,GAJDF,KAAAA,CAIC,GAJDA,GAGL,CACAG,MAAM,EAAE,CAAA,CAAC;AACf,CAAC;AAEM,SAASZ,mBAAmB,CAACQ,IAAY,EAAW;QAChDC,GAGL;IAHJ,OAAO,CAAC,EAACA,CAAAA,GAGL,GAHKA,GAAE,EAAA,QAAA,CACRC,QAAQ,CAACF,IAAI,EAAE;QACdG,cAAc,EAAE,KAAK;KACtB,CAAC,SACW,GAJNF,KAAAA,CAIM,GAJNA,GAGL,CACAI,WAAW,EAAE,CAAA,CAAC;AACpB,CAAC;AAEM,eAAeZ,oBAAoB,CAACO,IAAY,EAAoB;QAClE,GAAgD;QAAhD,IAA+D;IAAtE,OAAO,CAAA,IAA+D,GAA/D,CAAA,GAAgD,GAA/C,MAAMC,GAAE,EAAA,QAAA,CAACK,QAAQ,CAACC,IAAI,CAACP,IAAI,CAAC,CAACQ,KAAK,CAAC,IAAM,IAAI,CAAC,SAAc,GAA7D,KAAA,CAA6D,GAA7D,GAAgD,CAAEH,WAAW,EAAE,YAA/D,IAA+D,GAAI,KAAK,CAAC;AAClF,CAAC;AAEM,eAAeX,eAAe,CAACM,IAAY,EAAoB;QAC7D,GAAgD;QAAhD,IAA0D;IAAjE,OAAO,CAAA,IAA0D,GAA1D,CAAA,GAAgD,GAA/C,MAAMC,GAAE,EAAA,QAAA,CAACK,QAAQ,CAACC,IAAI,CAACP,IAAI,CAAC,CAACQ,KAAK,CAAC,IAAM,IAAI,CAAC,SAAS,GAAxD,KAAA,CAAwD,GAAxD,GAAgD,CAAEJ,MAAM,EAAE,YAA1D,IAA0D,GAAI,KAAK,CAAC;AAC7E,CAAC;AAEM,MAAMT,oBAAoB,GAAG,CAACc,IAAY,GAAKR,GAAE,EAAA,QAAA,CAACK,QAAQ,CAACI,KAAK,CAACD,IAAI,EAAE;QAAEE,SAAS,EAAE,IAAI;KAAE,CAAC,AAAC;AAE5F,MAAMf,eAAe,GAAG,CAACa,IAAY,GAAKG,QAAG,EAAA,QAAA,CAACC,SAAS,CAACJ,IAAI,EAAE;QAAEE,SAAS,EAAE,IAAI;KAAE,CAAC,AAAC;AAEnF,MAAMd,QAAQ,GAAGe,QAAG,EAAA,QAAA,CAACf,QAAQ,AAAC;AAE9B,MAAMC,SAAS,GAAGc,QAAG,EAAA,QAAA,CAACE,IAAI,AAAC;AAE3B,MAAMf,WAAW,GAAGa,QAAG,EAAA,QAAA,CAACG,MAAM,AAAC"}

View File

@@ -0,0 +1,106 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "downloadAppAsync", {
enumerable: true,
get: ()=>downloadAppAsync
});
function _fs() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
_fs = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
function _stream() {
const data = require("stream");
_stream = function() {
return data;
};
return data;
}
function _tempy() {
const data = /*#__PURE__*/ _interopRequireDefault(require("tempy"));
_tempy = function() {
return data;
};
return data;
}
function _util() {
const data = require("util");
_util = function() {
return data;
};
return data;
}
const _dir = require("./dir");
const _errors = require("./errors");
const _tar = require("./tar");
const _client = require("../api/rest/client");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const debug = require("debug")("expo:utils:downloadAppAsync");
const TIMER_DURATION = 30000;
const pipeline = (0, _util().promisify)(_stream().Stream.pipeline);
async function downloadAsync({ url , outputPath , cacheDirectory , onProgress }) {
let fetchInstance = _client.fetchAsync;
if (cacheDirectory) {
// Reconstruct the cached fetch since caching could be disabled.
fetchInstance = (0, _client.createCachedFetch)({
// We'll use a 1 week cache for versions so older values get flushed out eventually.
ttl: 1000 * 60 * 60 * 24 * 7,
// Users can also nuke their `~/.expo` directory to clear the cache.
cacheDirectory
});
}
debug(`Downloading ${url} to ${outputPath}`);
const res = await fetchInstance(url, {
timeout: TIMER_DURATION,
onProgress
});
if (!res.ok) {
throw new _errors.CommandError("FILE_DOWNLOAD", `Unexpected response: ${res.statusText}. From url: ${url}`);
}
return pipeline(res.body, _fs().default.createWriteStream(outputPath));
}
async function downloadAppAsync({ url , outputPath , extract =false , cacheDirectory , onProgress }) {
if (extract) {
// For iOS we download the ipa to a file then pass that file into the extractor.
// In the future we should just pipe the `res.body -> tar.extract` directly.
// I tried this and it created some weird errors where observing the data stream
// would corrupt the file causing tar to fail with `TAR_BAD_ARCHIVE`.
const tmpPath = _tempy().default.file({
name: _path().default.basename(outputPath)
});
await downloadAsync({
url,
outputPath: tmpPath,
cacheDirectory,
onProgress
});
debug(`Extracting ${tmpPath} to ${outputPath}`);
await (0, _dir.ensureDirectoryAsync)(outputPath);
await (0, _tar.extractAsync)(tmpPath, outputPath);
} else {
await (0, _dir.ensureDirectoryAsync)(_path().default.dirname(outputPath));
await downloadAsync({
url,
outputPath,
cacheDirectory,
onProgress
});
}
}
//# sourceMappingURL=downloadAppAsync.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,137 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
getExpoGoVersionEntryAsync: ()=>getExpoGoVersionEntryAsync,
downloadExpoGoAsync: ()=>downloadExpoGoAsync
});
function _getUserState() {
const data = require("@expo/config/build/getUserState");
_getUserState = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
function _semver() {
const data = require("semver");
_semver = function() {
return data;
};
return data;
}
const _downloadAppAsync = require("./downloadAppAsync");
const _errors = require("./errors");
const _ora = require("./ora");
const _profile = require("./profile");
const _progress = require("./progress");
const _getVersions = require("../api/getVersions");
const _log = require("../log");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const debug = require("debug")("expo:utils:downloadExpoGo");
const platformSettings = {
ios: {
versionsKey: "iosClientUrl",
getFilePath: (filename)=>_path().default.join((0, _getUserState().getExpoHomeDirectory)(), "ios-simulator-app-cache", `${filename}.app`),
shouldExtractResults: true
},
android: {
versionsKey: "androidClientUrl",
getFilePath: (filename)=>_path().default.join((0, _getUserState().getExpoHomeDirectory)(), "android-apk-cache", `${filename}.apk`),
shouldExtractResults: false
}
};
async function getExpoGoVersionEntryAsync(sdkVersion) {
const { sdkVersions: versions } = await (0, _getVersions.getVersionsAsync)();
let version;
if (sdkVersion.toUpperCase() === "UNVERSIONED") {
// find the latest version
const latestVersionKey = Object.keys(versions).reduce((a, b)=>{
if ((0, _semver().gt)(b, a)) {
return b;
}
return a;
}, "0.0.0");
_log.Log.warn(`Downloading the latest Expo Go client (${latestVersionKey}). This will not fully conform to UNVERSIONED.`);
version = versions[latestVersionKey];
} else {
version = versions[sdkVersion];
}
if (!version) {
throw new _errors.CommandError(`Unable to find a version of Expo Go for SDK ${sdkVersion}`);
}
return version;
}
async function downloadExpoGoAsync(platform, { url , sdkVersion }) {
const { getFilePath , versionsKey , shouldExtractResults } = platformSettings[platform];
const spinner = (0, _ora.ora)({
text: "Fetching Expo Go",
color: "white"
}).start();
let bar = null;
try {
if (!url) {
const version = await getExpoGoVersionEntryAsync(sdkVersion);
debug(`Installing Expo Go version for SDK ${sdkVersion} at URL: ${version[versionsKey]}`);
url = version[versionsKey];
}
} catch (error) {
spinner.fail();
throw error;
}
const filename = _path().default.parse(url).name;
try {
const outputPath = getFilePath(filename);
debug(`Downloading Expo Go from "${url}" to "${outputPath}".`);
debug(`The requested copy of Expo Go might already be cached in: "${(0, _getUserState().getExpoHomeDirectory)()}". You can disable the cache with EXPO_NO_CACHE=1`);
await (0, _profile.profile)(_downloadAppAsync.downloadAppAsync)({
url,
// Save all encrypted cache data to `~/.expo/expo-go`
cacheDirectory: "expo-go",
outputPath,
extract: shouldExtractResults,
onProgress ({ progress , total }) {
if (progress && total) {
if (!bar) {
if (spinner.isSpinning) {
spinner.stop();
}
bar = (0, _progress.createProgressBar)("Downloading the Expo Go app [:bar] :percent :etas", {
width: 64,
total: 100,
// clear: true,
complete: "=",
incomplete: " "
});
} else {
bar.update(progress, total);
}
}
}
});
return outputPath;
} finally{
spinner.stop();
// @ts-expect-error
bar == null ? void 0 : bar.terminate();
}
}
//# sourceMappingURL=downloadExpoGoAsync.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,107 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
guessEditor: ()=>guessEditor,
openInEditorAsync: ()=>openInEditorAsync
});
function _spawnAsync() {
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/spawn-async"));
_spawnAsync = function() {
return data;
};
return data;
}
function _envEditor() {
const data = /*#__PURE__*/ _interopRequireDefault(require("env-editor"));
_envEditor = function() {
return data;
};
return data;
}
const _env = require("./env");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const debug = require("debug")("expo:utils:editor");
function guessEditor() {
try {
const editor = _env.env.EXPO_EDITOR;
if (editor) {
debug("Using $EXPO_EDITOR:", editor);
return _envEditor().default.getEditor(editor);
}
debug("Falling back on $EDITOR:", editor);
return _envEditor().default.defaultEditor();
} catch {
debug("Falling back on vscode");
return _envEditor().default.getEditor("vscode");
}
}
async function openInEditorAsync(path) {
const editor = guessEditor();
debug(`Opening ${path} in ${editor == null ? void 0 : editor.name} (bin: ${editor == null ? void 0 : editor.binary}, id: ${editor == null ? void 0 : editor.id})`);
if (editor) {
try {
await (0, _spawnAsync().default)(editor.binary, [
path
]);
return true;
} catch (error) {
debug(`Failed to auto open path in editor (path: ${path}, binary: ${editor.binary}):`, error);
}
}
_log.error('Could not open editor, you can set it by defining the $EDITOR environment variable with the binary of your editor. (e.g. "vscode" or "atom")');
return false;
}
//# sourceMappingURL=editor.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/editor.ts"],"sourcesContent":["import spawnAsync from '@expo/spawn-async';\nimport editors from 'env-editor';\n\nimport { env } from './env';\nimport * as Log from '../log';\n\nconst debug = require('debug')('expo:utils:editor') as typeof console.log;\n\n/** Guess what the default editor is and default to VSCode. */\nexport function guessEditor(): editors.Editor {\n try {\n const editor = env.EXPO_EDITOR;\n if (editor) {\n debug('Using $EXPO_EDITOR:', editor);\n return editors.getEditor(editor);\n }\n debug('Falling back on $EDITOR:', editor);\n return editors.defaultEditor();\n } catch {\n debug('Falling back on vscode');\n return editors.getEditor('vscode');\n }\n}\n\n/** Open a file path in a given editor. */\nexport async function openInEditorAsync(path: string): Promise<boolean> {\n const editor = guessEditor();\n\n debug(`Opening ${path} in ${editor?.name} (bin: ${editor?.binary}, id: ${editor?.id})`);\n if (editor) {\n try {\n await spawnAsync(editor.binary, [path]);\n return true;\n } catch (error: any) {\n debug(`Failed to auto open path in editor (path: ${path}, binary: ${editor.binary}):`, error);\n }\n }\n\n Log.error(\n 'Could not open editor, you can set it by defining the $EDITOR environment variable with the binary of your editor. (e.g. \"vscode\" or \"atom\")'\n );\n return false;\n}\n"],"names":["guessEditor","openInEditorAsync","debug","require","editor","env","EXPO_EDITOR","editors","getEditor","defaultEditor","path","name","binary","id","spawnAsync","error","Log"],"mappings":"AAAA;;;;;;;;;;;IASgBA,WAAW,MAAXA,WAAW;IAgBLC,iBAAiB,MAAjBA,iBAAiB;;;8DAzBhB,mBAAmB;;;;;;;8DACtB,YAAY;;;;;;qBAEZ,OAAO;2DACN,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE7B,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,AAAsB,AAAC;AAGnE,SAASH,WAAW,GAAmB;IAC5C,IAAI;QACF,MAAMI,MAAM,GAAGC,IAAG,IAAA,CAACC,WAAW,AAAC;QAC/B,IAAIF,MAAM,EAAE;YACVF,KAAK,CAAC,qBAAqB,EAAEE,MAAM,CAAC,CAAC;YACrC,OAAOG,UAAO,EAAA,QAAA,CAACC,SAAS,CAACJ,MAAM,CAAC,CAAC;QACnC,CAAC;QACDF,KAAK,CAAC,0BAA0B,EAAEE,MAAM,CAAC,CAAC;QAC1C,OAAOG,UAAO,EAAA,QAAA,CAACE,aAAa,EAAE,CAAC;IACjC,EAAE,OAAM;QACNP,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAChC,OAAOK,UAAO,EAAA,QAAA,CAACC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAGM,eAAeP,iBAAiB,CAACS,IAAY,EAAoB;IACtE,MAAMN,MAAM,GAAGJ,WAAW,EAAE,AAAC;IAE7BE,KAAK,CAAC,CAAC,QAAQ,EAAEQ,IAAI,CAAC,IAAI,EAAEN,MAAM,QAAM,GAAZA,KAAAA,CAAY,GAAZA,MAAM,CAAEO,IAAI,CAAC,OAAO,EAAEP,MAAM,QAAQ,GAAdA,KAAAA,CAAc,GAAdA,MAAM,CAAEQ,MAAM,CAAC,MAAM,EAAER,MAAM,QAAI,GAAVA,KAAAA,CAAU,GAAVA,MAAM,CAAES,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,IAAIT,MAAM,EAAE;QACV,IAAI;YACF,MAAMU,IAAAA,WAAU,EAAA,QAAA,EAACV,MAAM,CAACQ,MAAM,EAAE;gBAACF,IAAI;aAAC,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,EAAE,OAAOK,KAAK,EAAO;YACnBb,KAAK,CAAC,CAAC,0CAA0C,EAAEQ,IAAI,CAAC,UAAU,EAAEN,MAAM,CAACQ,MAAM,CAAC,EAAE,CAAC,EAAEG,KAAK,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAEDC,IAAG,CAACD,KAAK,CACP,8IAA8I,CAC/I,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC"}

View File

@@ -0,0 +1,160 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "env", {
enumerable: true,
get: ()=>env
});
function _getenv() {
const data = require("getenv");
_getenv = function() {
return data;
};
return data;
}
// @expo/webpack-config -> expo-pwa -> @expo/image-utils: EXPO_IMAGE_UTILS_NO_SHARP
// TODO: EXPO_CLI_USERNAME, EXPO_CLI_PASSWORD
class Env {
/** Enable profiling metrics */ get EXPO_PROFILE() {
return (0, _getenv().boolish)("EXPO_PROFILE", false);
}
/** Enable debug logging */ get EXPO_DEBUG() {
return (0, _getenv().boolish)("EXPO_DEBUG", false);
}
/** Disable all network requests */ get EXPO_OFFLINE() {
return (0, _getenv().boolish)("EXPO_OFFLINE", false);
}
/** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */ get EXPO_BETA() {
return (0, _getenv().boolish)("EXPO_BETA", false);
}
/** Enable staging API environment */ get EXPO_STAGING() {
return (0, _getenv().boolish)("EXPO_STAGING", false);
}
/** Enable local API environment */ get EXPO_LOCAL() {
return (0, _getenv().boolish)("EXPO_LOCAL", false);
}
/** Is running in non-interactive CI mode */ get CI() {
return (0, _getenv().boolish)("CI", false);
}
/** Disable telemetry (analytics) */ get EXPO_NO_TELEMETRY() {
return (0, _getenv().boolish)("EXPO_NO_TELEMETRY", false);
}
/** Disable detaching telemetry to separate process */ get EXPO_NO_TELEMETRY_DETACH() {
return (0, _getenv().boolish)("EXPO_NO_TELEMETRY_DETACH", false);
}
/** local directory to the universe repo for testing locally */ get EXPO_UNIVERSE_DIR() {
return (0, _getenv().string)("EXPO_UNIVERSE_DIR", "");
}
/** @deprecated Default Webpack host string */ get WEB_HOST() {
return (0, _getenv().string)("WEB_HOST", "0.0.0.0");
}
/** Skip warning users about a dirty git status */ get EXPO_NO_GIT_STATUS() {
return (0, _getenv().boolish)("EXPO_NO_GIT_STATUS", false);
}
/** Disable auto web setup */ get EXPO_NO_WEB_SETUP() {
return (0, _getenv().boolish)("EXPO_NO_WEB_SETUP", false);
}
/** Disable auto TypeScript setup */ get EXPO_NO_TYPESCRIPT_SETUP() {
return (0, _getenv().boolish)("EXPO_NO_TYPESCRIPT_SETUP", false);
}
/** Disable all API caches. Does not disable bundler caches. */ get EXPO_NO_CACHE() {
return (0, _getenv().boolish)("EXPO_NO_CACHE", false);
}
/** Disable the app select redirect page. */ get EXPO_NO_REDIRECT_PAGE() {
return (0, _getenv().boolish)("EXPO_NO_REDIRECT_PAGE", false);
}
/** The React Metro port that's baked into react-native scripts and tools. */ get RCT_METRO_PORT() {
return (0, _getenv().int)("RCT_METRO_PORT", 0);
}
/** Skip validating the manifest during `export`. */ get EXPO_SKIP_MANIFEST_VALIDATION_TOKEN() {
return !!(0, _getenv().string)("EXPO_SKIP_MANIFEST_VALIDATION_TOKEN", "");
}
/** Public folder path relative to the project root. Default to `public` */ get EXPO_PUBLIC_FOLDER() {
return (0, _getenv().string)("EXPO_PUBLIC_FOLDER", "public");
}
/** Higher priority `$EDIOTR` variable for indicating which editor to use when pressing `o` in the Terminal UI. */ get EXPO_EDITOR() {
return (0, _getenv().string)("EXPO_EDITOR", "");
}
/** Enable auto server root detection for Metro. This will change the server root to the workspace root. */ get EXPO_USE_METRO_WORKSPACE_ROOT() {
return (0, _getenv().boolish)("EXPO_USE_METRO_WORKSPACE_ROOT", false);
}
/**
* Overwrite the dev server URL, disregarding the `--port`, `--host`, `--tunnel`, `--lan`, `--localhost` arguments.
* This is useful for browser editors that require custom proxy URLs.
*/ get EXPO_PACKAGER_PROXY_URL() {
return (0, _getenv().string)("EXPO_PACKAGER_PROXY_URL", "");
}
/**
* **Experimental** - Disable using `exp.direct` as the hostname for
* `--tunnel` connections. This enables **https://** forwarding which
* can be used to test universal links on iOS.
*
* This may cause issues with `expo-linking` and Expo Go.
*
* Select the exact subdomain by passing a string value that is not one of: `true`, `false`, `1`, `0`.
*/ get EXPO_TUNNEL_SUBDOMAIN() {
const subdomain = (0, _getenv().string)("EXPO_TUNNEL_SUBDOMAIN", "");
if ([
"0",
"false",
""
].includes(subdomain)) {
return false;
} else if ([
"1",
"true"
].includes(subdomain)) {
return true;
}
return subdomain;
}
/**
* Force Expo CLI to use the [`resolver.resolverMainFields`](https://facebook.github.io/metro/docs/configuration/#resolvermainfields) from the project `metro.config.js` for all platforms.
*
* By default, Expo CLI will use `['browser', 'module', 'main']` (default for Webpack) for web and the user-defined main fields for other platforms.
*/ get EXPO_METRO_NO_MAIN_FIELD_OVERRIDE() {
return (0, _getenv().boolish)("EXPO_METRO_NO_MAIN_FIELD_OVERRIDE", false);
}
/**
* HTTP/HTTPS proxy to connect to for network requests. Configures [https-proxy-agent](https://www.npmjs.com/package/https-proxy-agent).
*/ get HTTP_PROXY() {
return process.env.HTTP_PROXY || process.env.http_proxy || "";
}
/**
* Use the network inspector by overriding the metro inspector proxy with a custom version.
* @deprecated This has been replaced by `@react-native/dev-middleware` and is now unused.
*/ get EXPO_NO_INSPECTOR_PROXY() {
return (0, _getenv().boolish)("EXPO_NO_INSPECTOR_PROXY", false);
}
/** Disable lazy bundling in Metro bundler. */ get EXPO_NO_METRO_LAZY() {
return (0, _getenv().boolish)("EXPO_NO_METRO_LAZY", false);
}
/** Enable the unstable inverse dependency stack trace for Metro bundling errors. */ get EXPO_METRO_UNSTABLE_ERRORS() {
return (0, _getenv().boolish)("EXPO_METRO_UNSTABLE_ERRORS", false);
}
/** Enable the unstable fast resolver for Metro. */ get EXPO_USE_FAST_RESOLVER() {
return (0, _getenv().boolish)("EXPO_USE_FAST_RESOLVER", false);
}
/** Disable Environment Variable injection in client bundles. */ get EXPO_NO_CLIENT_ENV_VARS() {
return (0, _getenv().boolish)("EXPO_NO_CLIENT_ENV_VARS", false);
}
/** Enable the React Native JS Inspector, instead of the "classic" Chrome DevTools (SDK <=49) */ get EXPO_USE_UNSTABLE_DEBUGGER() {
return (0, _getenv().boolish)("EXPO_USE_UNSTABLE_DEBUGGER", false);
}
/** Set the default `user` that should be passed to `--user` with ADB commands. Used for installing APKs on Android devices with multiple profiles. Defaults to `0`. */ get EXPO_ADB_USER() {
return (0, _getenv().string)("EXPO_ADB_USER", "0");
}
/** Used internally to enable E2E utilities. This behavior is not stable to external users. */ get __EXPO_E2E_TEST() {
return (0, _getenv().boolish)("__EXPO_E2E_TEST", false);
}
/** Unstable: Force single-bundle exports in production. */ get EXPO_NO_BUNDLE_SPLITTING() {
return (0, _getenv().boolish)("EXPO_NO_BUNDLE_SPLITTING", false);
}
/** Enable unstable/experimental Atlas to gather bundle information during development or export */ get EXPO_UNSTABLE_ATLAS() {
return (0, _getenv().boolish)("EXPO_UNSTABLE_ATLAS", false);
}
}
const env = new Env();
//# sourceMappingURL=env.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,93 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
CommandError: ()=>CommandError,
AbortCommandError: ()=>AbortCommandError,
SilentError: ()=>SilentError,
logCmdError: ()=>logCmdError,
UnimplementedError: ()=>UnimplementedError
});
function _assert() {
const data = require("assert");
_assert = function() {
return data;
};
return data;
}
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
const _log = require("../log");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const ERROR_PREFIX = "Error: ";
class CommandError extends Error {
constructor(code, message = ""){
super("");
this.code = code;
this.name = "CommandError";
this.isCommandError = true;
// If e.toString() was called to get `message` we don't want it to look
// like "Error: Error:".
if (message.startsWith(ERROR_PREFIX)) {
message = message.substring(ERROR_PREFIX.length);
}
this.message = message || code;
}
}
class AbortCommandError extends CommandError {
constructor(){
super("ABORTED", "Interactive prompt was cancelled.");
}
}
class SilentError extends CommandError {
constructor(messageOrError){
var ref;
const message = (ref = typeof messageOrError === "string" ? messageOrError : messageOrError == null ? void 0 : messageOrError.message) != null ? ref : "This error should fail silently in the CLI";
super("SILENT", message);
if (typeof messageOrError !== "string") {
var ref1;
// forward the props of the incoming error for tests or processes outside of expo-cli that use expo cli internals.
this.stack = (ref1 = messageOrError == null ? void 0 : messageOrError.stack) != null ? ref1 : this.stack;
var ref2;
this.name = (ref2 = messageOrError == null ? void 0 : messageOrError.name) != null ? ref2 : this.name;
}
}
}
function logCmdError(error) {
if (!(error instanceof Error)) {
throw error;
}
if (error instanceof AbortCommandError || error instanceof SilentError) {
// Do nothing, this is used for prompts or other cases that were custom logged.
process.exit(0);
} else if (error instanceof CommandError || error instanceof _assert().AssertionError || error.name === "ApiV2Error" || error.name === "ConfigError") {
// Print the stack trace in debug mode only.
(0, _log.exit)(error);
}
const errorDetails = error.stack ? "\n" + _chalk().default.gray(error.stack) : "";
(0, _log.exit)(_chalk().default.red(error.toString()) + errorDetails);
}
class UnimplementedError extends Error {
constructor(){
super("Unimplemented");
this.name = "UnimplementedError";
}
}
//# sourceMappingURL=errors.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,72 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "installExitHooks", {
enumerable: true,
get: ()=>installExitHooks
});
const _fn = require("./fn");
const debug = require("debug")("expo:utils:exit");
const PRE_EXIT_SIGNALS = [
"SIGHUP",
"SIGINT",
"SIGTERM",
"SIGBREAK"
];
// We create a queue since Node.js throws an error if we try to append too many listeners:
// (node:4405) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGINT listeners added to [process]. Use emitter.setMaxListeners() to increase limit
const queue = [];
let unsubscribe = null;
function installExitHooks(asyncExitHook) {
// We need to instantiate the master listener the first time the queue is used.
if (!queue.length) {
// Track the master listener so we can remove it later.
unsubscribe = attachMasterListener();
}
queue.push(asyncExitHook);
return ()=>{
const index = queue.indexOf(asyncExitHook);
if (index >= 0) {
queue.splice(index, 1);
}
// Clean up the master listener if we don't need it anymore.
if (!queue.length) {
unsubscribe == null ? void 0 : unsubscribe();
}
};
}
// Create a function that runs before the process exits and guards against running multiple times.
function createExitHook(signal) {
return (0, _fn.guardAsync)(async ()=>{
debug(`pre-exit (signal: ${signal}, queue length: ${queue.length})`);
for (const [index, hookAsync] of Object.entries(queue)){
try {
await hookAsync(signal);
} catch (error) {
debug(`Error in exit hook: %O (queue: ${index})`, error);
}
}
var _exitCode;
debug(`post-exit (code: ${(_exitCode = process.exitCode) != null ? _exitCode : 0})`);
process.exit();
});
}
function attachMasterListener() {
const hooks = [];
for (const signal of PRE_EXIT_SIGNALS){
const hook = createExitHook(signal);
hooks.push([
signal,
hook
]);
process.on(signal, hook);
}
return ()=>{
for (const [signal, hook] of hooks){
process.removeListener(signal, hook);
}
};
}
//# sourceMappingURL=exit.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/exit.ts"],"sourcesContent":["import { guardAsync } from './fn';\n\nconst debug = require('debug')('expo:utils:exit') as typeof console.log;\n\ntype AsyncExitHook = (signal: NodeJS.Signals) => void | Promise<void>;\n\nconst PRE_EXIT_SIGNALS: NodeJS.Signals[] = ['SIGHUP', 'SIGINT', 'SIGTERM', 'SIGBREAK'];\n\n// We create a queue since Node.js throws an error if we try to append too many listeners:\n// (node:4405) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGINT listeners added to [process]. Use emitter.setMaxListeners() to increase limit\nconst queue: AsyncExitHook[] = [];\n\nlet unsubscribe: (() => void) | null = null;\n\n/** Add functions that run before the process exits. Returns a function for removing the listeners. */\nexport function installExitHooks(asyncExitHook: AsyncExitHook): () => void {\n // We need to instantiate the master listener the first time the queue is used.\n if (!queue.length) {\n // Track the master listener so we can remove it later.\n unsubscribe = attachMasterListener();\n }\n\n queue.push(asyncExitHook);\n\n return () => {\n const index = queue.indexOf(asyncExitHook);\n if (index >= 0) {\n queue.splice(index, 1);\n }\n // Clean up the master listener if we don't need it anymore.\n if (!queue.length) {\n unsubscribe?.();\n }\n };\n}\n\n// Create a function that runs before the process exits and guards against running multiple times.\nfunction createExitHook(signal: NodeJS.Signals) {\n return guardAsync(async () => {\n debug(`pre-exit (signal: ${signal}, queue length: ${queue.length})`);\n\n for (const [index, hookAsync] of Object.entries(queue)) {\n try {\n await hookAsync(signal);\n } catch (error: any) {\n debug(`Error in exit hook: %O (queue: ${index})`, error);\n }\n }\n\n debug(`post-exit (code: ${process.exitCode ?? 0})`);\n\n process.exit();\n });\n}\n\nfunction attachMasterListener() {\n const hooks: [NodeJS.Signals, () => any][] = [];\n for (const signal of PRE_EXIT_SIGNALS) {\n const hook = createExitHook(signal);\n hooks.push([signal, hook]);\n process.on(signal, hook);\n }\n return () => {\n for (const [signal, hook] of hooks) {\n process.removeListener(signal, hook);\n }\n };\n}\n"],"names":["installExitHooks","debug","require","PRE_EXIT_SIGNALS","queue","unsubscribe","asyncExitHook","length","attachMasterListener","push","index","indexOf","splice","createExitHook","signal","guardAsync","hookAsync","Object","entries","error","process","exitCode","exit","hooks","hook","on","removeListener"],"mappings":"AAAA;;;;+BAegBA,kBAAgB;;aAAhBA,gBAAgB;;oBAfL,MAAM;AAEjC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,AAAsB,AAAC;AAIxE,MAAMC,gBAAgB,GAAqB;IAAC,QAAQ;IAAE,QAAQ;IAAE,SAAS;IAAE,UAAU;CAAC,AAAC;AAEvF,0FAA0F;AAC1F,+KAA+K;AAC/K,MAAMC,KAAK,GAAoB,EAAE,AAAC;AAElC,IAAIC,WAAW,GAAwB,IAAI,AAAC;AAGrC,SAASL,gBAAgB,CAACM,aAA4B,EAAc;IACzE,+EAA+E;IAC/E,IAAI,CAACF,KAAK,CAACG,MAAM,EAAE;QACjB,uDAAuD;QACvDF,WAAW,GAAGG,oBAAoB,EAAE,CAAC;IACvC,CAAC;IAEDJ,KAAK,CAACK,IAAI,CAACH,aAAa,CAAC,CAAC;IAE1B,OAAO,IAAM;QACX,MAAMI,KAAK,GAAGN,KAAK,CAACO,OAAO,CAACL,aAAa,CAAC,AAAC;QAC3C,IAAII,KAAK,IAAI,CAAC,EAAE;YACdN,KAAK,CAACQ,MAAM,CAACF,KAAK,EAAE,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,4DAA4D;QAC5D,IAAI,CAACN,KAAK,CAACG,MAAM,EAAE;YACjBF,WAAW,QAAI,GAAfA,KAAAA,CAAe,GAAfA,WAAW,EAAI,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,SAASQ,cAAc,CAACC,MAAsB,EAAE;IAC9C,OAAOC,IAAAA,GAAU,WAAA,EAAC,UAAY;QAC5Bd,KAAK,CAAC,CAAC,kBAAkB,EAAEa,MAAM,CAAC,gBAAgB,EAAEV,KAAK,CAACG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAErE,KAAK,MAAM,CAACG,KAAK,EAAEM,SAAS,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACd,KAAK,CAAC,CAAE;YACtD,IAAI;gBACF,MAAMY,SAAS,CAACF,MAAM,CAAC,CAAC;YAC1B,EAAE,OAAOK,KAAK,EAAO;gBACnBlB,KAAK,CAAC,CAAC,+BAA+B,EAAES,KAAK,CAAC,CAAC,CAAC,EAAES,KAAK,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;YAEyBC,SAAgB;QAA1CnB,KAAK,CAAC,CAAC,iBAAiB,EAAEmB,CAAAA,SAAgB,GAAhBA,OAAO,CAACC,QAAQ,YAAhBD,SAAgB,GAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpDA,OAAO,CAACE,IAAI,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAASd,oBAAoB,GAAG;IAC9B,MAAMe,KAAK,GAAkC,EAAE,AAAC;IAChD,KAAK,MAAMT,MAAM,IAAIX,gBAAgB,CAAE;QACrC,MAAMqB,IAAI,GAAGX,cAAc,CAACC,MAAM,CAAC,AAAC;QACpCS,KAAK,CAACd,IAAI,CAAC;YAACK,MAAM;YAAEU,IAAI;SAAC,CAAC,CAAC;QAC3BJ,OAAO,CAACK,EAAE,CAACX,MAAM,EAAEU,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAM;QACX,KAAK,MAAM,CAACV,MAAM,EAAEU,IAAI,CAAC,IAAID,KAAK,CAAE;YAClCH,OAAO,CAACM,cAAc,CAACZ,MAAM,EAAEU,IAAI,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,57 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
findUpProjectRootOrAssert: ()=>findUpProjectRootOrAssert,
findFileInParents: ()=>findFileInParents
});
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
function _resolveFrom() {
const data = /*#__PURE__*/ _interopRequireDefault(require("resolve-from"));
_resolveFrom = function() {
return data;
};
return data;
}
const _errors = require("../utils/errors");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function findUpProjectRootOrAssert(cwd) {
const projectRoot = findUpProjectRoot(cwd);
if (!projectRoot) {
throw new _errors.CommandError(`Project root directory not found (working directory: ${cwd})`);
}
return projectRoot;
}
function findUpProjectRoot(cwd) {
const found = _resolveFrom().default.silent(cwd, "./package.json");
if (found) return _path().default.dirname(found);
const parent = _path().default.dirname(cwd);
if (parent === cwd) return null;
return findUpProjectRoot(parent);
}
function findFileInParents(cwd, fileName) {
const found = _resolveFrom().default.silent(cwd, `./${fileName}`);
if (found) return found;
const parent = _path().default.dirname(cwd);
if (parent === cwd) return null;
return findFileInParents(parent, fileName);
}
//# sourceMappingURL=findUp.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/findUp.ts"],"sourcesContent":["import path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { CommandError } from '../utils/errors';\n\n/** Look up directories until one with a `package.json` can be found, assert if none can be found. */\nexport function findUpProjectRootOrAssert(cwd: string): string {\n const projectRoot = findUpProjectRoot(cwd);\n if (!projectRoot) {\n throw new CommandError(`Project root directory not found (working directory: ${cwd})`);\n }\n return projectRoot;\n}\n\nfunction findUpProjectRoot(cwd: string): string | null {\n const found = resolveFrom.silent(cwd, './package.json');\n if (found) return path.dirname(found);\n\n const parent = path.dirname(cwd);\n if (parent === cwd) return null;\n\n return findUpProjectRoot(parent);\n}\n\n/**\n * Find a file in the (closest) parent directories.\n * This will recursively look for the file, until the root directory is reached.\n */\nexport function findFileInParents(cwd: string, fileName: string): string | null {\n const found = resolveFrom.silent(cwd, `./${fileName}`);\n if (found) return found;\n\n const parent = path.dirname(cwd);\n if (parent === cwd) return null;\n\n return findFileInParents(parent, fileName);\n}\n"],"names":["findUpProjectRootOrAssert","findFileInParents","cwd","projectRoot","findUpProjectRoot","CommandError","found","resolveFrom","silent","path","dirname","parent","fileName"],"mappings":"AAAA;;;;;;;;;;;IAMgBA,yBAAyB,MAAzBA,yBAAyB;IAsBzBC,iBAAiB,MAAjBA,iBAAiB;;;8DA5BhB,MAAM;;;;;;;8DACC,cAAc;;;;;;wBAET,iBAAiB;;;;;;AAGvC,SAASD,yBAAyB,CAACE,GAAW,EAAU;IAC7D,MAAMC,WAAW,GAAGC,iBAAiB,CAACF,GAAG,CAAC,AAAC;IAC3C,IAAI,CAACC,WAAW,EAAE;QAChB,MAAM,IAAIE,OAAY,aAAA,CAAC,CAAC,qDAAqD,EAAEH,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC;IACD,OAAOC,WAAW,CAAC;AACrB,CAAC;AAED,SAASC,iBAAiB,CAACF,GAAW,EAAiB;IACrD,MAAMI,KAAK,GAAGC,YAAW,EAAA,QAAA,CAACC,MAAM,CAACN,GAAG,EAAE,gBAAgB,CAAC,AAAC;IACxD,IAAII,KAAK,EAAE,OAAOG,KAAI,EAAA,QAAA,CAACC,OAAO,CAACJ,KAAK,CAAC,CAAC;IAEtC,MAAMK,MAAM,GAAGF,KAAI,EAAA,QAAA,CAACC,OAAO,CAACR,GAAG,CAAC,AAAC;IACjC,IAAIS,MAAM,KAAKT,GAAG,EAAE,OAAO,IAAI,CAAC;IAEhC,OAAOE,iBAAiB,CAACO,MAAM,CAAC,CAAC;AACnC,CAAC;AAMM,SAASV,iBAAiB,CAACC,GAAW,EAAEU,QAAgB,EAAiB;IAC9E,MAAMN,KAAK,GAAGC,YAAW,EAAA,QAAA,CAACC,MAAM,CAACN,GAAG,EAAE,CAAC,EAAE,EAAEU,QAAQ,CAAC,CAAC,CAAC,AAAC;IACvD,IAAIN,KAAK,EAAE,OAAOA,KAAK,CAAC;IAExB,MAAMK,MAAM,GAAGF,KAAI,EAAA,QAAA,CAACC,OAAO,CAACR,GAAG,CAAC,AAAC;IACjC,IAAIS,MAAM,KAAKT,GAAG,EAAE,OAAO,IAAI,CAAC;IAEhC,OAAOD,iBAAiB,CAACU,MAAM,EAAEC,QAAQ,CAAC,CAAC;AAC7C,CAAC"}

View File

@@ -0,0 +1,40 @@
/** `lodash.memoize` */ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
memoize: ()=>memoize,
guardAsync: ()=>guardAsync
});
function memoize(fn) {
const cache = new Map();
return (...args)=>{
const key = JSON.stringify(args);
if (cache.has(key)) {
return cache.get(key);
}
const result = fn(...args);
cache.set(key, result);
return result;
};
}
function guardAsync(fn) {
let invoked = false;
let returnValue;
const guard = async (...args)=>{
if (!invoked) {
invoked = true;
returnValue = await fn(...args);
}
return returnValue;
};
return guard;
}
//# sourceMappingURL=fn.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/fn.ts"],"sourcesContent":["/** `lodash.memoize` */\nexport function memoize<T extends (...args: any[]) => any>(fn: T): T {\n const cache = new Map<string, any>();\n return ((...args: any[]) => {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key);\n }\n const result = fn(...args);\n cache.set(key, result);\n return result;\n }) as T;\n}\n\n/** memoizes an async function to prevent subsequent calls that might be invoked before the function has finished resolving. */\nexport function guardAsync<V, T extends (...args: any[]) => Promise<V>>(fn: T): T {\n let invoked = false;\n let returnValue: V;\n\n const guard: any = async (...args: any[]): Promise<V> => {\n if (!invoked) {\n invoked = true;\n returnValue = await fn(...args);\n }\n\n return returnValue;\n };\n\n return guard;\n}\n"],"names":["memoize","guardAsync","fn","cache","Map","args","key","JSON","stringify","has","get","result","set","invoked","returnValue","guard"],"mappings":"AAAA,qBAAqB,GACrB;;;;;;;;;;;IAAgBA,OAAO,MAAPA,OAAO;IAcPC,UAAU,MAAVA,UAAU;;AAdnB,SAASD,OAAO,CAAoCE,EAAK,EAAK;IACnE,MAAMC,KAAK,GAAG,IAAIC,GAAG,EAAe,AAAC;IACrC,OAAQ,CAAC,GAAGC,IAAI,AAAO,GAAK;QAC1B,MAAMC,GAAG,GAAGC,IAAI,CAACC,SAAS,CAACH,IAAI,CAAC,AAAC;QACjC,IAAIF,KAAK,CAACM,GAAG,CAACH,GAAG,CAAC,EAAE;YAClB,OAAOH,KAAK,CAACO,GAAG,CAACJ,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,MAAMK,MAAM,GAAGT,EAAE,IAAIG,IAAI,CAAC,AAAC;QAC3BF,KAAK,CAACS,GAAG,CAACN,GAAG,EAAEK,MAAM,CAAC,CAAC;QACvB,OAAOA,MAAM,CAAC;IAChB,CAAC,CAAO;AACV,CAAC;AAGM,SAASV,UAAU,CAA8CC,EAAK,EAAK;IAChF,IAAIW,OAAO,GAAG,KAAK,AAAC;IACpB,IAAIC,WAAW,AAAG,AAAC;IAEnB,MAAMC,KAAK,GAAQ,OAAO,GAAGV,IAAI,AAAO,GAAiB;QACvD,IAAI,CAACQ,OAAO,EAAE;YACZA,OAAO,GAAG,IAAI,CAAC;YACfC,WAAW,GAAG,MAAMZ,EAAE,IAAIG,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,OAAOS,WAAW,CAAC;IACrB,CAAC,AAAC;IAEF,OAAOC,KAAK,CAAC;AACf,CAAC"}

View File

@@ -0,0 +1,219 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
getOrPromptForBundleIdentifier: ()=>getOrPromptForBundleIdentifier,
getOrPromptForPackage: ()=>getOrPromptForPackage
});
function _config() {
const data = require("@expo/config");
_config = function() {
return data;
};
return data;
}
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
const _link = require("./link");
const _modifyConfigAsync = require("./modifyConfigAsync");
const _prompts = /*#__PURE__*/ _interopRequireWildcard(require("./prompts"));
const _validateApplicationId = require("./validateApplicationId");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
function getUsernameAsync(exp) {
// TODO: Use XDL's UserManager
// import { UserManager } from 'xdl';
return (0, _config().getAccountUsername)(exp);
}
const NO_BUNDLE_ID_MESSAGE = `Project must have a \`ios.bundleIdentifier\` set in the Expo config (app.json or app.config.js).`;
const NO_PACKAGE_MESSAGE = `Project must have a \`android.package\` set in the Expo config (app.json or app.config.js).`;
async function getOrPromptForBundleIdentifier(projectRoot, exp = (0, _config().getConfig)(projectRoot).exp) {
var ref;
const current = (ref = exp.ios) == null ? void 0 : ref.bundleIdentifier;
if (current) {
(0, _validateApplicationId.assertValidBundleId)(current);
return current;
}
_log.log((0, _chalk().default)`\n{bold 📝 iOS Bundle Identifier} {dim ${(0, _link.learnMore)("https://expo.fyi/bundle-identifier")}}\n`);
return await promptForBundleIdAsync(projectRoot, exp);
}
async function promptForBundleIdAsync(projectRoot, exp) {
var ref;
// Prompt the user for the bundle ID.
// Even if the project is using a dynamic config we can still
// prompt a better error message, recommend a default value, and help the user
// validate their custom bundle ID upfront.
const { bundleIdentifier } = await (0, _prompts.default)({
type: "text",
name: "bundleIdentifier",
initial: (ref = await getRecommendedBundleIdAsync(exp)) != null ? ref : undefined,
// The Apple helps people know this isn't an EAS feature.
message: `What would you like your iOS bundle identifier to be?`,
validate: _validateApplicationId.validateBundleId
}, {
nonInteractiveHelp: NO_BUNDLE_ID_MESSAGE
});
// Warn the user if the bundle ID is already in use.
const warning = await (0, _validateApplicationId.getBundleIdWarningAsync)(bundleIdentifier);
if (warning && !await warnAndConfirmAsync(warning)) {
// Cycle the Bundle ID prompt to try again.
return await promptForBundleIdAsync(projectRoot, exp);
}
// Apply the changes to the config.
await (0, _modifyConfigAsync.attemptModification)(projectRoot, {
ios: {
...exp.ios || {},
bundleIdentifier
}
}, {
ios: {
bundleIdentifier
}
});
return bundleIdentifier;
}
async function warnAndConfirmAsync(warning) {
_log.log();
_log.warn(warning);
_log.log();
if (!await (0, _prompts.confirmAsync)({
message: `Continue?`,
initial: true
})) {
return false;
}
return true;
}
// Recommend a bundle identifier based on the username and project slug.
async function getRecommendedBundleIdAsync(exp) {
var ref, ref1;
// Attempt to use the android package name first since it's convenient to have them aligned.
if (((ref = exp.android) == null ? void 0 : ref.package) && (0, _validateApplicationId.validateBundleId)((ref1 = exp.android) == null ? void 0 : ref1.package)) {
var ref2;
return (ref2 = exp.android) == null ? void 0 : ref2.package;
} else {
const username = await getUsernameAsync(exp);
const possibleId = `com.${username}.${exp.slug}`;
if (username && (0, _validateApplicationId.validateBundleId)(possibleId)) {
return possibleId;
}
}
return null;
}
// Recommend a package name based on the username and project slug.
async function getRecommendedPackageNameAsync(exp) {
var ref;
// Attempt to use the ios bundle id first since it's convenient to have them aligned.
if (((ref = exp.ios) == null ? void 0 : ref.bundleIdentifier) && (0, _validateApplicationId.validatePackage)(exp.ios.bundleIdentifier)) {
return exp.ios.bundleIdentifier;
} else {
const username = await getUsernameAsync(exp);
// It's common to use dashes in your node project name, strip them from the suggested package name.
const possibleId = `com.${username}.${exp.slug}`.split("-").join("");
if (username && (0, _validateApplicationId.validatePackage)(possibleId)) {
return possibleId;
}
}
return null;
}
async function getOrPromptForPackage(projectRoot, exp = (0, _config().getConfig)(projectRoot).exp) {
var ref;
const current = (ref = exp.android) == null ? void 0 : ref.package;
if (current) {
(0, _validateApplicationId.assertValidPackage)(current);
return current;
}
_log.log((0, _chalk().default)`\n{bold 📝 Android package} {dim ${(0, _link.learnMore)("https://expo.fyi/android-package")}}\n`);
return await promptForPackageAsync(projectRoot, exp);
}
async function promptForPackageAsync(projectRoot, exp) {
var ref;
// Prompt the user for the android package.
// Even if the project is using a dynamic config we can still
// prompt a better error message, recommend a default value, and help the user
// validate their custom android package upfront.
const { packageName } = await (0, _prompts.default)({
type: "text",
name: "packageName",
initial: (ref = await getRecommendedPackageNameAsync(exp)) != null ? ref : undefined,
message: `What would you like your Android package name to be?`,
validate: _validateApplicationId.validatePackageWithWarning
}, {
nonInteractiveHelp: NO_PACKAGE_MESSAGE
});
// Warn the user if the package name is already in use.
const warning = await (0, _validateApplicationId.getPackageNameWarningAsync)(packageName);
if (warning && !await warnAndConfirmAsync(warning)) {
// Cycle the Package name prompt to try again.
return await promptForPackageAsync(projectRoot, exp);
}
// Apply the changes to the config.
await (0, _modifyConfigAsync.attemptModification)(projectRoot, {
android: {
...exp.android || {},
package: packageName
}
}, {
android: {
package: packageName
}
});
return packageName;
}
//# sourceMappingURL=getOrPromptApplicationId.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,134 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
getPID: ()=>getPID,
getDirectoryOfProcessById: ()=>getDirectoryOfProcessById,
getRunningProcess: ()=>getRunningProcess
});
function _childProcess() {
const data = require("child_process");
_childProcess = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireWildcard(require("path"));
_path = function() {
return data;
};
return data;
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const debug = require("debug")("expo:utils:getRunningProcess");
const defaultOptions = {
encoding: "utf8",
stdio: [
"pipe",
"pipe",
"ignore"
]
};
function getPID(port) {
try {
const results = (0, _childProcess().execFileSync)("lsof", [
`-i:${port}`,
"-P",
"-t",
"-sTCP:LISTEN"
], defaultOptions).split("\n")[0].trim();
const pid = Number(results);
debug(`pid: ${pid} for port: ${port}`);
return pid;
} catch (error) {
debug(`No pid found for port: ${port}. Error: ${error}`);
return null;
}
}
/** Get `package.json` `name` field for a given directory. Returns `null` if none exist. */ function getPackageName(packageRoot) {
const packageJson = _path().join(packageRoot, "package.json");
try {
return require(packageJson).name || null;
} catch {
return null;
}
}
/** Returns a command like `node /Users/evanbacon/.../bin/expo start` or the package.json name. */ function getProcessCommand(pid, procDirectory) {
const name = getPackageName(procDirectory);
if (name) {
return name;
}
return (0, _childProcess().execSync)(`ps -o command -p ${pid} | sed -n 2p`, defaultOptions).replace(/\n$/, "").trim();
}
function getDirectoryOfProcessById(processId) {
return (0, _childProcess().execSync)(`lsof -p ${processId} | awk '$4=="cwd" {for (i=9; i<=NF; i++) printf "%s ", $i}'`, defaultOptions).trim();
}
function getRunningProcess(port) {
// 63828
const pid = getPID(port);
if (!pid) {
return null;
}
try {
// /Users/evanbacon/Documents/GitHub/lab/myapp
const directory = getDirectoryOfProcessById(pid);
// /Users/evanbacon/Documents/GitHub/lab/myapp/package.json
const command = getProcessCommand(pid, directory);
// TODO: Have a better message for reusing another process.
return {
pid,
directory,
command
};
} catch {
return null;
}
}
//# sourceMappingURL=getRunningProcess.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,127 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
maybeBailOnGitStatusAsync: ()=>maybeBailOnGitStatusAsync,
validateGitStatusAsync: ()=>validateGitStatusAsync
});
function _spawnAsync() {
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/spawn-async"));
_spawnAsync = function() {
return data;
};
return data;
}
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
const _env = require("./env");
const _interactive = require("./interactive");
const _prompts = require("./prompts");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
async function maybeBailOnGitStatusAsync() {
if (_env.env.EXPO_NO_GIT_STATUS) {
_log.warn("Git status is dirty but the command will continue because EXPO_NO_GIT_STATUS is enabled...");
return false;
}
const isGitStatusClean = await validateGitStatusAsync();
// Give people a chance to bail out if git working tree is dirty
if (!isGitStatusClean) {
if (!(0, _interactive.isInteractive)()) {
_log.warn(`Git status is dirty but the command will continue because the terminal is not interactive.`);
return false;
}
_log.log();
const answer = await (0, _prompts.confirmAsync)({
message: `Would you like to proceed?`
});
if (!answer) {
return true;
}
_log.log();
}
return false;
}
async function validateGitStatusAsync() {
let workingTreeStatus = "unknown";
try {
const result = await (0, _spawnAsync().default)("git", [
"status",
"--porcelain"
]);
workingTreeStatus = result.stdout === "" ? "clean" : "dirty";
} catch {
// Maybe git is not installed?
// Maybe this project is not using git?
}
if (workingTreeStatus === "clean") {
_log.log(`Your git working tree is ${_chalk().default.green("clean")}`);
_log.log("To revert the changes after this command completes, you can run the following:");
_log.log(" git clean --force && git reset --hard");
return true;
} else if (workingTreeStatus === "dirty") {
_log.log(`${_chalk().default.bold("Warning!")} Your git working tree is ${_chalk().default.red("dirty")}.`);
_log.log(`It's recommended to ${_chalk().default.bold("commit all your changes before proceeding")}, so you can revert the changes made by this command if necessary.`);
} else {
_log.log("We couldn't find a git repository in your project directory.");
_log.log("It's recommended to back up your project before proceeding.");
}
return false;
}
//# sourceMappingURL=git.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/git.ts"],"sourcesContent":["import spawnAsync from '@expo/spawn-async';\nimport chalk from 'chalk';\n\nimport { env } from './env';\nimport { isInteractive } from './interactive';\nimport { confirmAsync } from './prompts';\nimport * as Log from '../log';\n\nexport async function maybeBailOnGitStatusAsync(): Promise<boolean> {\n if (env.EXPO_NO_GIT_STATUS) {\n Log.warn(\n 'Git status is dirty but the command will continue because EXPO_NO_GIT_STATUS is enabled...'\n );\n return false;\n }\n const isGitStatusClean = await validateGitStatusAsync();\n\n // Give people a chance to bail out if git working tree is dirty\n if (!isGitStatusClean) {\n if (!isInteractive()) {\n Log.warn(\n `Git status is dirty but the command will continue because the terminal is not interactive.`\n );\n return false;\n }\n\n Log.log();\n const answer = await confirmAsync({\n message: `Would you like to proceed?`,\n });\n\n if (!answer) {\n return true;\n }\n\n Log.log();\n }\n return false;\n}\n\nexport async function validateGitStatusAsync(): Promise<boolean> {\n let workingTreeStatus = 'unknown';\n try {\n const result = await spawnAsync('git', ['status', '--porcelain']);\n workingTreeStatus = result.stdout === '' ? 'clean' : 'dirty';\n } catch {\n // Maybe git is not installed?\n // Maybe this project is not using git?\n }\n\n if (workingTreeStatus === 'clean') {\n Log.log(`Your git working tree is ${chalk.green('clean')}`);\n Log.log('To revert the changes after this command completes, you can run the following:');\n Log.log(' git clean --force && git reset --hard');\n return true;\n } else if (workingTreeStatus === 'dirty') {\n Log.log(`${chalk.bold('Warning!')} Your git working tree is ${chalk.red('dirty')}.`);\n Log.log(\n `It's recommended to ${chalk.bold(\n 'commit all your changes before proceeding'\n )}, so you can revert the changes made by this command if necessary.`\n );\n } else {\n Log.log(\"We couldn't find a git repository in your project directory.\");\n Log.log(\"It's recommended to back up your project before proceeding.\");\n }\n\n return false;\n}\n"],"names":["maybeBailOnGitStatusAsync","validateGitStatusAsync","env","EXPO_NO_GIT_STATUS","Log","warn","isGitStatusClean","isInteractive","log","answer","confirmAsync","message","workingTreeStatus","result","spawnAsync","stdout","chalk","green","bold","red"],"mappings":"AAAA;;;;;;;;;;;IAQsBA,yBAAyB,MAAzBA,yBAAyB;IAgCzBC,sBAAsB,MAAtBA,sBAAsB;;;8DAxCrB,mBAAmB;;;;;;;8DACxB,OAAO;;;;;;qBAEL,OAAO;6BACG,eAAe;yBAChB,WAAW;2DACnB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtB,eAAeD,yBAAyB,GAAqB;IAClE,IAAIE,IAAG,IAAA,CAACC,kBAAkB,EAAE;QAC1BC,IAAG,CAACC,IAAI,CACN,4FAA4F,CAC7F,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAMC,gBAAgB,GAAG,MAAML,sBAAsB,EAAE,AAAC;IAExD,gEAAgE;IAChE,IAAI,CAACK,gBAAgB,EAAE;QACrB,IAAI,CAACC,IAAAA,YAAa,cAAA,GAAE,EAAE;YACpBH,IAAG,CAACC,IAAI,CACN,CAAC,0FAA0F,CAAC,CAC7F,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;QAEDD,IAAG,CAACI,GAAG,EAAE,CAAC;QACV,MAAMC,MAAM,GAAG,MAAMC,IAAAA,QAAY,aAAA,EAAC;YAChCC,OAAO,EAAE,CAAC,0BAA0B,CAAC;SACtC,CAAC,AAAC;QAEH,IAAI,CAACF,MAAM,EAAE;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAEDL,IAAG,CAACI,GAAG,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAEM,eAAeP,sBAAsB,GAAqB;IAC/D,IAAIW,iBAAiB,GAAG,SAAS,AAAC;IAClC,IAAI;QACF,MAAMC,MAAM,GAAG,MAAMC,IAAAA,WAAU,EAAA,QAAA,EAAC,KAAK,EAAE;YAAC,QAAQ;YAAE,aAAa;SAAC,CAAC,AAAC;QAClEF,iBAAiB,GAAGC,MAAM,CAACE,MAAM,KAAK,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/D,EAAE,OAAM;IACN,8BAA8B;IAC9B,uCAAuC;IACzC,CAAC;IAED,IAAIH,iBAAiB,KAAK,OAAO,EAAE;QACjCR,IAAG,CAACI,GAAG,CAAC,CAAC,yBAAyB,EAAEQ,MAAK,EAAA,QAAA,CAACC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5Db,IAAG,CAACI,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC1FJ,IAAG,CAACI,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,OAAO,IAAII,iBAAiB,KAAK,OAAO,EAAE;QACxCR,IAAG,CAACI,GAAG,CAAC,CAAC,EAAEQ,MAAK,EAAA,QAAA,CAACE,IAAI,CAAC,UAAU,CAAC,CAAC,0BAA0B,EAAEF,MAAK,EAAA,QAAA,CAACG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrFf,IAAG,CAACI,GAAG,CACL,CAAC,oBAAoB,EAAEQ,MAAK,EAAA,QAAA,CAACE,IAAI,CAC/B,2CAA2C,CAC5C,CAAC,kEAAkE,CAAC,CACtE,CAAC;IACJ,OAAO;QACLd,IAAG,CAACI,GAAG,CAAC,8DAA8D,CAAC,CAAC;QACxEJ,IAAG,CAACI,GAAG,CAAC,6DAA6D,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}

View File

@@ -0,0 +1,76 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
everyMatchAsync: ()=>everyMatchAsync,
anyMatchAsync: ()=>anyMatchAsync,
wrapGlobWithTimeout: ()=>wrapGlobWithTimeout
});
function _glob() {
const data = require("glob");
_glob = function() {
return data;
};
return data;
}
function everyMatchAsync(pattern, options) {
return new Promise((resolve, reject)=>{
const g = new (_glob()).Glob(pattern, options);
let called = false;
const callback = (er, matched)=>{
if (called) return;
called = true;
if (er) reject(er);
else resolve(matched);
};
g.on("error", callback);
g.on("end", (matches)=>callback(null, matches));
});
}
function anyMatchAsync(pattern, options) {
return new Promise((resolve, reject)=>{
const g = new (_glob()).Glob(pattern, options);
let called = false;
const callback = (er, matched)=>{
if (called) return;
called = true;
if (er) reject(er);
else resolve(matched);
};
g.on("error", callback);
g.on("match", (matched)=>{
// We've disabled using abort as it breaks the entire glob package across all instances.
// https://github.com/isaacs/node-glob/issues/279 & https://github.com/isaacs/node-glob/issues/342
// For now, just collect every match.
// g.abort();
callback(null, [
matched
]);
});
g.on("end", (matches)=>callback(null, matches));
});
}
function wrapGlobWithTimeout(query, duration) {
return new Promise(async (resolve, reject)=>{
const timeout = setTimeout(()=>{
resolve(false);
}, duration);
process.on("SIGINT", ()=>clearTimeout(timeout));
try {
resolve(await query());
} catch (error) {
reject(error);
} finally{
clearTimeout(timeout);
}
});
}
//# sourceMappingURL=glob.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/glob.ts"],"sourcesContent":["import G, { Glob } from 'glob';\n\n/** Finds all matching files. */\nexport function everyMatchAsync(pattern: string, options: G.IOptions) {\n return new Promise<string[]>((resolve, reject) => {\n const g = new Glob(pattern, options);\n let called = false;\n const callback = (er: Error | null, matched: string[]) => {\n if (called) return;\n called = true;\n if (er) reject(er);\n else resolve(matched);\n };\n g.on('error', callback);\n g.on('end', (matches) => callback(null, matches));\n });\n}\n\n/** Bails out early after finding the first matching file. */\nexport function anyMatchAsync(pattern: string, options: G.IOptions) {\n return new Promise<string[]>((resolve, reject) => {\n const g = new Glob(pattern, options);\n let called = false;\n const callback = (er: Error | null, matched: string[]) => {\n if (called) return;\n called = true;\n if (er) reject(er);\n else resolve(matched);\n };\n g.on('error', callback);\n g.on('match', (matched) => {\n // We've disabled using abort as it breaks the entire glob package across all instances.\n // https://github.com/isaacs/node-glob/issues/279 & https://github.com/isaacs/node-glob/issues/342\n // For now, just collect every match.\n // g.abort();\n callback(null, [matched]);\n });\n g.on('end', (matches) => callback(null, matches));\n });\n}\n\n/**\n * Wait some time, then escape...\n * Adding this because glob can sometimes freeze and fail to resolve if any other glob uses `.abort()`.\n */\nexport function wrapGlobWithTimeout(\n query: () => Promise<string[]>,\n duration: number\n): Promise<string[] | false> {\n return new Promise(async (resolve, reject) => {\n const timeout = setTimeout(() => {\n resolve(false);\n }, duration);\n\n process.on('SIGINT', () => clearTimeout(timeout));\n\n try {\n resolve(await query());\n } catch (error) {\n reject(error);\n } finally {\n clearTimeout(timeout);\n }\n });\n}\n"],"names":["everyMatchAsync","anyMatchAsync","wrapGlobWithTimeout","pattern","options","Promise","resolve","reject","g","Glob","called","callback","er","matched","on","matches","query","duration","timeout","setTimeout","process","clearTimeout","error"],"mappings":"AAAA;;;;;;;;;;;IAGgBA,eAAe,MAAfA,eAAe;IAgBfC,aAAa,MAAbA,aAAa;IA0BbC,mBAAmB,MAAnBA,mBAAmB;;;yBA7CX,MAAM;;;;;;AAGvB,SAASF,eAAe,CAACG,OAAe,EAAEC,OAAmB,EAAE;IACpE,OAAO,IAAIC,OAAO,CAAW,CAACC,OAAO,EAAEC,MAAM,GAAK;QAChD,MAAMC,CAAC,GAAG,IAAIC,CAAAA,KAAI,EAAA,CAAA,KAAA,CAACN,OAAO,EAAEC,OAAO,CAAC,AAAC;QACrC,IAAIM,MAAM,GAAG,KAAK,AAAC;QACnB,MAAMC,QAAQ,GAAG,CAACC,EAAgB,EAAEC,OAAiB,GAAK;YACxD,IAAIH,MAAM,EAAE,OAAO;YACnBA,MAAM,GAAG,IAAI,CAAC;YACd,IAAIE,EAAE,EAAEL,MAAM,CAACK,EAAE,CAAC,CAAC;iBACdN,OAAO,CAACO,OAAO,CAAC,CAAC;QACxB,CAAC,AAAC;QACFL,CAAC,CAACM,EAAE,CAAC,OAAO,EAAEH,QAAQ,CAAC,CAAC;QACxBH,CAAC,CAACM,EAAE,CAAC,KAAK,EAAE,CAACC,OAAO,GAAKJ,QAAQ,CAAC,IAAI,EAAEI,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAGM,SAASd,aAAa,CAACE,OAAe,EAAEC,OAAmB,EAAE;IAClE,OAAO,IAAIC,OAAO,CAAW,CAACC,OAAO,EAAEC,MAAM,GAAK;QAChD,MAAMC,CAAC,GAAG,IAAIC,CAAAA,KAAI,EAAA,CAAA,KAAA,CAACN,OAAO,EAAEC,OAAO,CAAC,AAAC;QACrC,IAAIM,MAAM,GAAG,KAAK,AAAC;QACnB,MAAMC,QAAQ,GAAG,CAACC,EAAgB,EAAEC,OAAiB,GAAK;YACxD,IAAIH,MAAM,EAAE,OAAO;YACnBA,MAAM,GAAG,IAAI,CAAC;YACd,IAAIE,EAAE,EAAEL,MAAM,CAACK,EAAE,CAAC,CAAC;iBACdN,OAAO,CAACO,OAAO,CAAC,CAAC;QACxB,CAAC,AAAC;QACFL,CAAC,CAACM,EAAE,CAAC,OAAO,EAAEH,QAAQ,CAAC,CAAC;QACxBH,CAAC,CAACM,EAAE,CAAC,OAAO,EAAE,CAACD,OAAO,GAAK;YACzB,wFAAwF;YACxF,kGAAkG;YAClG,qCAAqC;YACrC,aAAa;YACbF,QAAQ,CAAC,IAAI,EAAE;gBAACE,OAAO;aAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACHL,CAAC,CAACM,EAAE,CAAC,KAAK,EAAE,CAACC,OAAO,GAAKJ,QAAQ,CAAC,IAAI,EAAEI,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAMM,SAASb,mBAAmB,CACjCc,KAA8B,EAC9BC,QAAgB,EACW;IAC3B,OAAO,IAAIZ,OAAO,CAAC,OAAOC,OAAO,EAAEC,MAAM,GAAK;QAC5C,MAAMW,OAAO,GAAGC,UAAU,CAAC,IAAM;YAC/Bb,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,EAAEW,QAAQ,CAAC,AAAC;QAEbG,OAAO,CAACN,EAAE,CAAC,QAAQ,EAAE,IAAMO,YAAY,CAACH,OAAO,CAAC,CAAC,CAAC;QAElD,IAAI;YACFZ,OAAO,CAAC,MAAMU,KAAK,EAAE,CAAC,CAAC;QACzB,EAAE,OAAOM,KAAK,EAAE;YACdf,MAAM,CAACe,KAAK,CAAC,CAAC;QAChB,CAAC,QAAS;YACRD,YAAY,CAACH,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}

View File

@@ -0,0 +1,14 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "isInteractive", {
enumerable: true,
get: ()=>isInteractive
});
const _env = require("./env");
function isInteractive() {
return !_env.env.CI && process.stdout.isTTY;
}
//# sourceMappingURL=interactive.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/interactive.ts"],"sourcesContent":["import { env } from './env';\n\n/** @returns `true` if the process is interactive. */\nexport function isInteractive(): boolean {\n return !env.CI && process.stdout.isTTY;\n}\n"],"names":["isInteractive","env","CI","process","stdout","isTTY"],"mappings":"AAAA;;;;+BAGgBA,eAAa;;aAAbA,aAAa;;qBAHT,OAAO;AAGpB,SAASA,aAAa,GAAY;IACvC,OAAO,CAACC,IAAG,IAAA,CAACC,EAAE,IAAIC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;AACzC,CAAC"}

View File

@@ -0,0 +1,25 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "getIpAddress", {
enumerable: true,
get: ()=>getIpAddress
});
function _internalIp() {
const data = /*#__PURE__*/ _interopRequireDefault(require("internal-ip"));
_internalIp = function() {
return data;
};
return data;
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function getIpAddress() {
return _internalIp().default.v4.sync() || "127.0.0.1";
}
//# sourceMappingURL=ip.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/ip.ts"],"sourcesContent":["import internalIp from 'internal-ip';\n\nexport function getIpAddress(): string {\n return internalIp.v4.sync() || '127.0.0.1';\n}\n"],"names":["getIpAddress","internalIp","v4","sync"],"mappings":"AAAA;;;;+BAEgBA,cAAY;;aAAZA,YAAY;;;8DAFL,aAAa;;;;;;;;;;;AAE7B,SAASA,YAAY,GAAW;IACrC,OAAOC,WAAU,EAAA,QAAA,CAACC,EAAE,CAACC,IAAI,EAAE,IAAI,WAAW,CAAC;AAC7C,CAAC"}

View File

@@ -0,0 +1,52 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "isModuleSymlinked", {
enumerable: true,
get: ()=>isModuleSymlinked
});
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
function _resolveFrom() {
const data = /*#__PURE__*/ _interopRequireDefault(require("resolve-from"));
_resolveFrom = function() {
return data;
};
return data;
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
/**
* Return true if the parent folder for a given file path is named "node_modules".
*
* @example
* isModuleRootPathInNodeModulesFolder('./foo/expo') -> false
* isModuleRootPathInNodeModulesFolder('./node_modules/expo') -> true
*/ function isModuleRootPathInNodeModulesFolder(moduleRootPath) {
const parentFolderName = _path().default.basename(_path().default.dirname(moduleRootPath));
return parentFolderName === "node_modules";
}
function isModuleSymlinked(projectRoot, { moduleId , isSilent }) {
try {
const moduleRootPath = _path().default.dirname((0, _resolveFrom().default)(projectRoot, `${moduleId}/package.json`));
return !isModuleRootPathInNodeModulesFolder(moduleRootPath);
} catch (error) {
if (!isSilent) {
throw error;
}
// Failed to resolve the package.json relative to the project, not sure what to do here.
// This is probably not possible due to node module resolution.
return false;
}
}
//# sourceMappingURL=isModuleSymlinked.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/isModuleSymlinked.ts"],"sourcesContent":["import path from 'path';\nimport resolveFrom from 'resolve-from';\n\n/**\n * Return true if the parent folder for a given file path is named \"node_modules\".\n *\n * @example\n * isModuleRootPathInNodeModulesFolder('./foo/expo') -> false\n * isModuleRootPathInNodeModulesFolder('./node_modules/expo') -> true\n */\nfunction isModuleRootPathInNodeModulesFolder(moduleRootPath: string): boolean {\n const parentFolderName = path.basename(path.dirname(moduleRootPath));\n return parentFolderName === 'node_modules';\n}\n\n/**\n * Given a node module name, and a project path, this method will:\n *\n * 1. Resolve the module path.\n * 2. Find the module root folder.\n * 3. Return true if the module root folder is in a folder named `node_modules`\n *\n * @param projectRoot\n * @param moduleId\n *\n * @example\n * isModuleSymlinked('./expo/apps/native-component-list', {\n * moduleId: 'react-native'\n * })\n */\nexport function isModuleSymlinked(\n projectRoot: string,\n {\n moduleId,\n isSilent,\n }: {\n moduleId: string;\n isSilent?: boolean;\n }\n): boolean {\n try {\n const moduleRootPath = path.dirname(resolveFrom(projectRoot, `${moduleId}/package.json`));\n return !isModuleRootPathInNodeModulesFolder(moduleRootPath);\n } catch (error) {\n if (!isSilent) {\n throw error;\n }\n // Failed to resolve the package.json relative to the project, not sure what to do here.\n // This is probably not possible due to node module resolution.\n return false;\n }\n}\n"],"names":["isModuleSymlinked","isModuleRootPathInNodeModulesFolder","moduleRootPath","parentFolderName","path","basename","dirname","projectRoot","moduleId","isSilent","resolveFrom","error"],"mappings":"AAAA;;;;+BA8BgBA,mBAAiB;;aAAjBA,iBAAiB;;;8DA9BhB,MAAM;;;;;;;8DACC,cAAc;;;;;;;;;;;AAEtC;;;;;;CAMC,GACD,SAASC,mCAAmC,CAACC,cAAsB,EAAW;IAC5E,MAAMC,gBAAgB,GAAGC,KAAI,EAAA,QAAA,CAACC,QAAQ,CAACD,KAAI,EAAA,QAAA,CAACE,OAAO,CAACJ,cAAc,CAAC,CAAC,AAAC;IACrE,OAAOC,gBAAgB,KAAK,cAAc,CAAC;AAC7C,CAAC;AAiBM,SAASH,iBAAiB,CAC/BO,WAAmB,EACnB,EACEC,QAAQ,CAAA,EACRC,QAAQ,CAAA,EAIT,EACQ;IACT,IAAI;QACF,MAAMP,cAAc,GAAGE,KAAI,EAAA,QAAA,CAACE,OAAO,CAACI,IAAAA,YAAW,EAAA,QAAA,EAACH,WAAW,EAAE,CAAC,EAAEC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,AAAC;QAC1F,OAAO,CAACP,mCAAmC,CAACC,cAAc,CAAC,CAAC;IAC9D,EAAE,OAAOS,KAAK,EAAE;QACd,IAAI,CAACF,QAAQ,EAAE;YACb,MAAME,KAAK,CAAC;QACd,CAAC;QACD,wFAAwF;QACxF,+DAA+D;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,51 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
link: ()=>link,
learnMore: ()=>learnMore
});
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
function _terminalLink() {
const data = /*#__PURE__*/ _interopRequireDefault(require("terminal-link"));
_terminalLink = function() {
return data;
};
return data;
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function link(url, { text =url , dim =true } = {}) {
let output;
// Links can be disabled via env variables https://github.com/jamestalmage/supports-hyperlinks/blob/master/index.js
if (_terminalLink().default.isSupported) {
output = (0, _terminalLink().default)(text, url);
} else {
output = `${text === url ? "" : text + ": "}${_chalk().default.underline(url)}`;
}
return dim ? _chalk().default.dim(output) : output;
}
function learnMore(url, { learnMoreMessage: maybeLearnMoreMessage , dim =true } = {}) {
return link(url, {
text: maybeLearnMoreMessage != null ? maybeLearnMoreMessage : "Learn more",
dim
});
}
//# sourceMappingURL=link.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/link.ts"],"sourcesContent":["import chalk from 'chalk';\nimport terminalLink from 'terminal-link';\n\n/**\n * Prints a link for given URL, using text if provided, otherwise text is just the URL.\n * Format links as dim (unless disabled) and with an underline.\n *\n * @example https://expo.dev\n */\nexport function link(\n url: string,\n { text = url, dim = true }: { text?: string; dim?: boolean } = {}\n): string {\n let output: string;\n // Links can be disabled via env variables https://github.com/jamestalmage/supports-hyperlinks/blob/master/index.js\n if (terminalLink.isSupported) {\n output = terminalLink(text, url);\n } else {\n output = `${text === url ? '' : text + ': '}${chalk.underline(url)}`;\n }\n return dim ? chalk.dim(output) : output;\n}\n\n/**\n * Provide a consistent \"Learn more\" link experience.\n * Format links as dim (unless disabled) with an underline.\n *\n * @example [Learn more](https://expo.dev)\n * @example Learn more: https://expo.dev\n */\nexport function learnMore(\n url: string,\n {\n learnMoreMessage: maybeLearnMoreMessage,\n dim = true,\n }: { learnMoreMessage?: string; dim?: boolean } = {}\n): string {\n return link(url, { text: maybeLearnMoreMessage ?? 'Learn more', dim });\n}\n"],"names":["link","learnMore","url","text","dim","output","terminalLink","isSupported","chalk","underline","learnMoreMessage","maybeLearnMoreMessage"],"mappings":"AAAA;;;;;;;;;;;IASgBA,IAAI,MAAJA,IAAI;IAqBJC,SAAS,MAATA,SAAS;;;8DA9BP,OAAO;;;;;;;8DACA,eAAe;;;;;;;;;;;AAQjC,SAASD,IAAI,CAClBE,GAAW,EACX,EAAEC,IAAI,EAAGD,GAAG,CAAA,EAAEE,GAAG,EAAG,IAAI,CAAA,EAAoC,GAAG,EAAE,EACzD;IACR,IAAIC,MAAM,AAAQ,AAAC;IACnB,mHAAmH;IACnH,IAAIC,aAAY,EAAA,QAAA,CAACC,WAAW,EAAE;QAC5BF,MAAM,GAAGC,IAAAA,aAAY,EAAA,QAAA,EAACH,IAAI,EAAED,GAAG,CAAC,CAAC;IACnC,OAAO;QACLG,MAAM,GAAG,CAAC,EAAEF,IAAI,KAAKD,GAAG,GAAG,EAAE,GAAGC,IAAI,GAAG,IAAI,CAAC,EAAEK,MAAK,EAAA,QAAA,CAACC,SAAS,CAACP,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,OAAOE,GAAG,GAAGI,MAAK,EAAA,QAAA,CAACJ,GAAG,CAACC,MAAM,CAAC,GAAGA,MAAM,CAAC;AAC1C,CAAC;AASM,SAASJ,SAAS,CACvBC,GAAW,EACX,EACEQ,gBAAgB,EAAEC,qBAAqB,CAAA,EACvCP,GAAG,EAAG,IAAI,CAAA,EACmC,GAAG,EAAE,EAC5C;IACR,OAAOJ,IAAI,CAACE,GAAG,EAAE;QAAEC,IAAI,EAAEQ,qBAAqB,WAArBA,qBAAqB,GAAI,YAAY;QAAEP,GAAG;KAAE,CAAC,CAAC;AACzE,CAAC"}

View File

@@ -0,0 +1,171 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
generatedFooterComment: ()=>generatedFooterComment,
mergeGitIgnorePaths: ()=>mergeGitIgnorePaths,
removeGeneratedGitIgnoreContents: ()=>removeGeneratedGitIgnoreContents,
mergeGitIgnoreContents: ()=>mergeGitIgnoreContents,
upsertGitIgnoreContents: ()=>upsertGitIgnoreContents,
createGeneratedHeaderComment: ()=>createGeneratedHeaderComment,
getSanitizedGitIgnoreLines: ()=>getSanitizedGitIgnoreLines,
createGitIgnoreHash: ()=>createGitIgnoreHash,
removeFromGitIgnore: ()=>removeFromGitIgnore
});
function _crypto() {
const data = /*#__PURE__*/ _interopRequireDefault(require("crypto"));
_crypto = function() {
return data;
};
return data;
}
function _fs() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
_fs = function() {
return data;
};
return data;
}
const _log = require("../log");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const generatedHeaderPrefix = `# @generated expo-cli`;
const generatedFooterComment = `# @end expo-cli`;
function mergeGitIgnorePaths(targetGitIgnorePath, sourceGitIgnorePath) {
if (!_fs().default.existsSync(targetGitIgnorePath)) {
// No gitignore in the project already, no need to merge anything into anything. I guess they
// are not using git :O
return null;
}
if (!_fs().default.existsSync(sourceGitIgnorePath)) {
// Maybe we don't have a gitignore in the template project
return null;
}
const targetGitIgnore = _fs().default.readFileSync(targetGitIgnorePath).toString();
const sourceGitIgnore = _fs().default.readFileSync(sourceGitIgnorePath).toString();
const merged = mergeGitIgnoreContents(targetGitIgnore, sourceGitIgnore);
// Only rewrite the file if it was modified.
if (merged.contents) {
_fs().default.writeFileSync(targetGitIgnorePath, merged.contents);
}
return merged;
}
/**
* Get line indexes for the generated section of a gitignore.
*
* @param gitIgnore
*/ function getGeneratedSectionIndexes(gitIgnore) {
const contents = gitIgnore.split("\n");
const start = contents.findIndex((line)=>line.startsWith(generatedHeaderPrefix));
const end = contents.findIndex((line)=>line.startsWith(generatedFooterComment));
return {
contents,
start,
end
};
}
function removeGeneratedGitIgnoreContents(gitIgnore) {
const { contents , start , end } = getGeneratedSectionIndexes(gitIgnore);
if (start > -1 && end > -1 && start < end) {
contents.splice(start, end - start + 1);
// TODO: We could in theory check that the contents we're removing match the hash used in the header,
// this would ensure that we don't accidentally remove lines that someone added or removed from the generated section.
return contents.join("\n");
}
return null;
}
function mergeGitIgnoreContents(targetGitIgnore, sourceGitIgnore) {
const header = createGeneratedHeaderComment(sourceGitIgnore);
if (!targetGitIgnore.includes(header)) {
// Ensure the old generated gitignore contents are removed.
const sanitizedTarget = removeGeneratedGitIgnoreContents(targetGitIgnore);
return {
contents: [
sanitizedTarget != null ? sanitizedTarget : targetGitIgnore,
header,
`# The following patterns were generated by expo-cli`,
``,
sourceGitIgnore,
generatedFooterComment,
].join("\n"),
didMerge: true,
didClear: !!sanitizedTarget
};
}
return {
contents: targetGitIgnore,
didClear: false,
didMerge: false
};
}
function upsertGitIgnoreContents(targetGitIgnorePath, contents) {
const targetGitIgnore = _fs().default.readFileSync(targetGitIgnorePath, {
encoding: "utf-8",
flag: "a+"
});
if (targetGitIgnore.match(new RegExp(`^${contents}[\\n\\r\\s]*$`, "m"))) {
return null;
}
// If there is an existing section, update it with the new content
if (targetGitIgnore.includes(generatedHeaderPrefix)) {
const indexes = getGeneratedSectionIndexes(targetGitIgnore);
contents = `${indexes.contents.slice(indexes.start + 3, indexes.end).join("\n")}\n${contents}`;
}
const merged = mergeGitIgnoreContents(targetGitIgnore, contents);
if (merged.contents) {
_fs().default.writeFileSync(targetGitIgnorePath, merged.contents);
}
return merged;
}
function createGeneratedHeaderComment(gitIgnore) {
const hashKey = createGitIgnoreHash(getSanitizedGitIgnoreLines(gitIgnore).join("\n"));
return `${generatedHeaderPrefix} ${hashKey}`;
}
function getSanitizedGitIgnoreLines(gitIgnore) {
// filter, trim, and sort the lines.
return gitIgnore.split("\n").filter((v)=>{
const line = v.trim();
// Strip comments
if (line.startsWith("#")) {
return false;
}
return !!line;
}).sort();
}
function createGitIgnoreHash(gitIgnore) {
// this doesn't need to be secure, the shorter the better.
const hash = _crypto().default.createHash("sha1").update(gitIgnore).digest("hex");
return `sync-${hash}`;
}
function removeFromGitIgnore(targetGitIgnorePath, contents) {
try {
if (!_fs().default.existsSync(targetGitIgnorePath)) {
return;
}
let targetGitIgnore = _fs().default.readFileSync(targetGitIgnorePath, "utf-8");
if (!targetGitIgnore.includes(contents)) {
return null;
}
targetGitIgnore = targetGitIgnore.replace(`${contents}\n`, "");
const indexes = getGeneratedSectionIndexes(targetGitIgnore);
if (indexes.start === indexes.end - 3) {
targetGitIgnore = targetGitIgnore.replace(new RegExp(`^${generatedHeaderPrefix}((.|\n)*)${generatedFooterComment}$`, "m"), "");
}
return _fs().default.writeFileSync(targetGitIgnorePath, targetGitIgnore);
} catch (error) {
_log.Log.error(`Failed to read/write to .gitignore path: ${targetGitIgnorePath}`);
throw error;
}
}
//# sourceMappingURL=mergeGitIgnorePaths.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,106 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
attemptModification: ()=>attemptModification,
warnAboutConfigAndThrow: ()=>warnAboutConfigAndThrow
});
function _config() {
const data = require("@expo/config");
_config = function() {
return data;
};
return data;
}
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
const _errors = require("./errors");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
async function attemptModification(projectRoot, edits, exactEdits) {
const modification = await (0, _config().modifyConfigAsync)(projectRoot, edits, {
skipSDKVersionRequirement: true
});
if (modification.type === "success") {
_log.log();
} else {
warnAboutConfigAndThrow(modification.type, modification.message, exactEdits);
}
}
function logNoConfig() {
_log.log(_chalk().default.yellow(`No Expo config was found. Please create an Expo config (${_chalk().default.bold`app.json`} or ${_chalk().default.bold`app.config.js`}) in your project root.`));
}
function warnAboutConfigAndThrow(type, message, edits) {
_log.log();
if (type === "warn") {
// The project is using a dynamic config, give the user a helpful log and bail out.
_log.log(_chalk().default.yellow(message));
} else {
logNoConfig();
}
notifyAboutManualConfigEdits(edits);
throw new _errors.SilentError();
}
function notifyAboutManualConfigEdits(edits) {
_log.log(_chalk().default.cyan(`Please add the following to your Expo config`));
_log.log();
_log.log(JSON.stringify(edits, null, 2));
_log.log();
}
//# sourceMappingURL=modifyConfigAsync.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/modifyConfigAsync.ts"],"sourcesContent":["import { ExpoConfig, modifyConfigAsync } from '@expo/config';\nimport chalk from 'chalk';\n\nimport { SilentError } from './errors';\nimport * as Log from '../log';\n\n/** Wraps `[@expo/config] modifyConfigAsync()` and adds additional logging. */\nexport async function attemptModification(\n projectRoot: string,\n edits: Partial<ExpoConfig>,\n exactEdits: Partial<ExpoConfig>\n): Promise<void> {\n const modification = await modifyConfigAsync(projectRoot, edits, {\n skipSDKVersionRequirement: true,\n });\n if (modification.type === 'success') {\n Log.log();\n } else {\n warnAboutConfigAndThrow(modification.type, modification.message!, exactEdits);\n }\n}\n\nfunction logNoConfig() {\n Log.log(\n chalk.yellow(\n `No Expo config was found. Please create an Expo config (${chalk.bold`app.json`} or ${chalk.bold`app.config.js`}) in your project root.`\n )\n );\n}\n\nexport function warnAboutConfigAndThrow(type: string, message: string, edits: Partial<ExpoConfig>) {\n Log.log();\n if (type === 'warn') {\n // The project is using a dynamic config, give the user a helpful log and bail out.\n Log.log(chalk.yellow(message));\n } else {\n logNoConfig();\n }\n\n notifyAboutManualConfigEdits(edits);\n throw new SilentError();\n}\n\nfunction notifyAboutManualConfigEdits(edits: Partial<ExpoConfig>) {\n Log.log(chalk.cyan(`Please add the following to your Expo config`));\n Log.log();\n Log.log(JSON.stringify(edits, null, 2));\n Log.log();\n}\n"],"names":["attemptModification","warnAboutConfigAndThrow","projectRoot","edits","exactEdits","modification","modifyConfigAsync","skipSDKVersionRequirement","type","Log","log","message","logNoConfig","chalk","yellow","bold","notifyAboutManualConfigEdits","SilentError","cyan","JSON","stringify"],"mappings":"AAAA;;;;;;;;;;;IAOsBA,mBAAmB,MAAnBA,mBAAmB;IAuBzBC,uBAAuB,MAAvBA,uBAAuB;;;yBA9BO,cAAc;;;;;;;8DAC1C,OAAO;;;;;;wBAEG,UAAU;2DACjB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGtB,eAAeD,mBAAmB,CACvCE,WAAmB,EACnBC,KAA0B,EAC1BC,UAA+B,EAChB;IACf,MAAMC,YAAY,GAAG,MAAMC,IAAAA,OAAiB,EAAA,kBAAA,EAACJ,WAAW,EAAEC,KAAK,EAAE;QAC/DI,yBAAyB,EAAE,IAAI;KAChC,CAAC,AAAC;IACH,IAAIF,YAAY,CAACG,IAAI,KAAK,SAAS,EAAE;QACnCC,IAAG,CAACC,GAAG,EAAE,CAAC;IACZ,OAAO;QACLT,uBAAuB,CAACI,YAAY,CAACG,IAAI,EAAEH,YAAY,CAACM,OAAO,EAAGP,UAAU,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,SAASQ,WAAW,GAAG;IACrBH,IAAG,CAACC,GAAG,CACLG,MAAK,EAAA,QAAA,CAACC,MAAM,CACV,CAAC,wDAAwD,EAAED,MAAK,EAAA,QAAA,CAACE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAEF,MAAK,EAAA,QAAA,CAACE,IAAI,CAAC,aAAa,CAAC,CAAC,uBAAuB,CAAC,CACzI,CACF,CAAC;AACJ,CAAC;AAEM,SAASd,uBAAuB,CAACO,IAAY,EAAEG,OAAe,EAAER,KAA0B,EAAE;IACjGM,IAAG,CAACC,GAAG,EAAE,CAAC;IACV,IAAIF,IAAI,KAAK,MAAM,EAAE;QACnB,mFAAmF;QACnFC,IAAG,CAACC,GAAG,CAACG,MAAK,EAAA,QAAA,CAACC,MAAM,CAACH,OAAO,CAAC,CAAC,CAAC;IACjC,OAAO;QACLC,WAAW,EAAE,CAAC;IAChB,CAAC;IAEDI,4BAA4B,CAACb,KAAK,CAAC,CAAC;IACpC,MAAM,IAAIc,OAAW,YAAA,EAAE,CAAC;AAC1B,CAAC;AAED,SAASD,4BAA4B,CAACb,KAA0B,EAAE;IAChEM,IAAG,CAACC,GAAG,CAACG,MAAK,EAAA,QAAA,CAACK,IAAI,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,CAAC;IACpET,IAAG,CAACC,GAAG,EAAE,CAAC;IACVD,IAAG,CAACC,GAAG,CAACS,IAAI,CAACC,SAAS,CAACjB,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxCM,IAAG,CAACC,GAAG,EAAE,CAAC;AACZ,CAAC"}

View File

@@ -0,0 +1,78 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "attemptAddingPluginsAsync", {
enumerable: true,
get: ()=>attemptAddingPluginsAsync
});
function _config() {
const data = require("@expo/config");
_config = function() {
return data;
};
return data;
}
const _modifyConfigAsync = require("./modifyConfigAsync");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
async function attemptAddingPluginsAsync(projectRoot, exp, plugins) {
if (!plugins.length) return;
const edits = {
plugins: [
...new Set((exp.plugins || []).concat(plugins))
]
};
const modification = await (0, _config().modifyConfigAsync)(projectRoot, edits, {
skipSDKVersionRequirement: true,
skipPlugins: true
});
if (modification.type === "success") {
_log.log(`\u203A Added config plugin${plugins.length === 1 ? "" : "s"}: ${plugins.join(", ")}`);
} else {
const exactEdits = {
plugins
};
(0, _modifyConfigAsync.warnAboutConfigAndThrow)(modification.type, modification.message, exactEdits);
}
}
//# sourceMappingURL=modifyConfigPlugins.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/modifyConfigPlugins.ts"],"sourcesContent":["import { ExpoConfig, modifyConfigAsync } from '@expo/config';\n\nimport { warnAboutConfigAndThrow } from './modifyConfigAsync';\nimport * as Log from '../log';\n\nexport async function attemptAddingPluginsAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'plugins'>,\n plugins: string[]\n): Promise<void> {\n if (!plugins.length) return;\n\n const edits = {\n plugins: [...new Set((exp.plugins || []).concat(plugins))],\n };\n const modification = await modifyConfigAsync(projectRoot, edits, {\n skipSDKVersionRequirement: true,\n skipPlugins: true,\n });\n if (modification.type === 'success') {\n Log.log(`\\u203A Added config plugin${plugins.length === 1 ? '' : 's'}: ${plugins.join(', ')}`);\n } else {\n const exactEdits = {\n plugins,\n };\n warnAboutConfigAndThrow(modification.type, modification.message!, exactEdits);\n }\n}\n"],"names":["attemptAddingPluginsAsync","projectRoot","exp","plugins","length","edits","Set","concat","modification","modifyConfigAsync","skipSDKVersionRequirement","skipPlugins","type","Log","log","join","exactEdits","warnAboutConfigAndThrow","message"],"mappings":"AAAA;;;;+BAKsBA,2BAAyB;;aAAzBA,yBAAyB;;;yBALD,cAAc;;;;;;mCAEpB,qBAAqB;2DACxC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtB,eAAeA,yBAAyB,CAC7CC,WAAmB,EACnBC,GAAgC,EAChCC,OAAiB,EACF;IACf,IAAI,CAACA,OAAO,CAACC,MAAM,EAAE,OAAO;IAE5B,MAAMC,KAAK,GAAG;QACZF,OAAO,EAAE;eAAI,IAAIG,GAAG,CAAC,CAACJ,GAAG,CAACC,OAAO,IAAI,EAAE,CAAC,CAACI,MAAM,CAACJ,OAAO,CAAC,CAAC;SAAC;KAC3D,AAAC;IACF,MAAMK,YAAY,GAAG,MAAMC,IAAAA,OAAiB,EAAA,kBAAA,EAACR,WAAW,EAAEI,KAAK,EAAE;QAC/DK,yBAAyB,EAAE,IAAI;QAC/BC,WAAW,EAAE,IAAI;KAClB,CAAC,AAAC;IACH,IAAIH,YAAY,CAACI,IAAI,KAAK,SAAS,EAAE;QACnCC,IAAG,CAACC,GAAG,CAAC,CAAC,0BAA0B,EAAEX,OAAO,CAACC,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,EAAED,OAAO,CAACY,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,OAAO;QACL,MAAMC,UAAU,GAAG;YACjBb,OAAO;SACR,AAAC;QACFc,IAAAA,kBAAuB,wBAAA,EAACT,YAAY,CAACI,IAAI,EAAEJ,YAAY,CAACU,OAAO,EAAGF,UAAU,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,18 @@
// Set the environment to production or development
// lots of tools use this to determine if they should run in a dev mode.
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "setNodeEnv", {
enumerable: true,
get: ()=>setNodeEnv
});
function setNodeEnv(mode) {
process.env.NODE_ENV = process.env.NODE_ENV || mode;
process.env.BABEL_ENV = process.env.BABEL_ENV || process.env.NODE_ENV;
// @ts-expect-error: Add support for external React libraries being loaded in the same process.
globalThis.__DEV__ = process.env.NODE_ENV !== "production";
}
//# sourceMappingURL=nodeEnv.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/nodeEnv.ts"],"sourcesContent":["// Set the environment to production or development\n// lots of tools use this to determine if they should run in a dev mode.\nexport function setNodeEnv(mode: 'development' | 'production') {\n process.env.NODE_ENV = process.env.NODE_ENV || mode;\n process.env.BABEL_ENV = process.env.BABEL_ENV || process.env.NODE_ENV;\n\n // @ts-expect-error: Add support for external React libraries being loaded in the same process.\n globalThis.__DEV__ = process.env.NODE_ENV !== 'production';\n}\n"],"names":["setNodeEnv","mode","process","env","NODE_ENV","BABEL_ENV","globalThis","__DEV__"],"mappings":"AAAA,mDAAmD;AACnD,wEAAwE;AACxE;;;;+BAAgBA,YAAU;;aAAVA,UAAU;;AAAnB,SAASA,UAAU,CAACC,IAAkC,EAAE;IAC7DC,OAAO,CAACC,GAAG,CAACC,QAAQ,GAAGF,OAAO,CAACC,GAAG,CAACC,QAAQ,IAAIH,IAAI,CAAC;IACpDC,OAAO,CAACC,GAAG,CAACE,SAAS,GAAGH,OAAO,CAACC,GAAG,CAACE,SAAS,IAAIH,OAAO,CAACC,GAAG,CAACC,QAAQ,CAAC;IAEtE,+FAA+F;IAC/FE,UAAU,CAACC,OAAO,GAAGL,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,CAAC;AAC7D,CAAC"}

View File

@@ -0,0 +1,50 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "clearNodeModulesAsync", {
enumerable: true,
get: ()=>clearNodeModulesAsync
});
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
function _fs() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
_fs = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
const _ora = require("./ora");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
async function clearNodeModulesAsync(projectRoot) {
// This step can take a couple seconds, if the installation logs are enabled (with EXPO_DEBUG) then it
// ends up looking odd to see "Installing JavaScript dependencies" for ~5 seconds before the logs start showing up.
const cleanJsDepsStep = (0, _ora.logNewSection)("Cleaning JavaScript dependencies");
const time = Date.now();
// nuke the node modules
// TODO: this is substantially slower, we should find a better alternative to ensuring the modules are installed.
await _fs().default.promises.rm(_path().default.join(projectRoot, "node_modules"), {
recursive: true,
force: true
});
cleanJsDepsStep.succeed(`Cleaned JavaScript dependencies ${_chalk().default.gray(Date.now() - time + "ms")}`);
}
//# sourceMappingURL=nodeModules.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/nodeModules.ts"],"sourcesContent":["import chalk from 'chalk';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { logNewSection } from './ora';\n\nexport async function clearNodeModulesAsync(projectRoot: string) {\n // This step can take a couple seconds, if the installation logs are enabled (with EXPO_DEBUG) then it\n // ends up looking odd to see \"Installing JavaScript dependencies\" for ~5 seconds before the logs start showing up.\n const cleanJsDepsStep = logNewSection('Cleaning JavaScript dependencies');\n const time = Date.now();\n // nuke the node modules\n // TODO: this is substantially slower, we should find a better alternative to ensuring the modules are installed.\n await fs.promises.rm(path.join(projectRoot, 'node_modules'), { recursive: true, force: true });\n cleanJsDepsStep.succeed(\n `Cleaned JavaScript dependencies ${chalk.gray(Date.now() - time + 'ms')}`\n );\n}\n"],"names":["clearNodeModulesAsync","projectRoot","cleanJsDepsStep","logNewSection","time","Date","now","fs","promises","rm","path","join","recursive","force","succeed","chalk","gray"],"mappings":"AAAA;;;;+BAMsBA,uBAAqB;;aAArBA,qBAAqB;;;8DANzB,OAAO;;;;;;;8DACV,IAAI;;;;;;;8DACF,MAAM;;;;;;qBAEO,OAAO;;;;;;AAE9B,eAAeA,qBAAqB,CAACC,WAAmB,EAAE;IAC/D,sGAAsG;IACtG,mHAAmH;IACnH,MAAMC,eAAe,GAAGC,IAAAA,IAAa,cAAA,EAAC,kCAAkC,CAAC,AAAC;IAC1E,MAAMC,IAAI,GAAGC,IAAI,CAACC,GAAG,EAAE,AAAC;IACxB,wBAAwB;IACxB,iHAAiH;IACjH,MAAMC,GAAE,EAAA,QAAA,CAACC,QAAQ,CAACC,EAAE,CAACC,KAAI,EAAA,QAAA,CAACC,IAAI,CAACV,WAAW,EAAE,cAAc,CAAC,EAAE;QAAEW,SAAS,EAAE,IAAI;QAAEC,KAAK,EAAE,IAAI;KAAE,CAAC,CAAC;IAC/FX,eAAe,CAACY,OAAO,CACrB,CAAC,gCAAgC,EAAEC,MAAK,EAAA,QAAA,CAACC,IAAI,CAACX,IAAI,CAACC,GAAG,EAAE,GAAGF,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAC1E,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,183 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
sanitizeNpmPackageName: ()=>sanitizeNpmPackageName,
npmViewAsync: ()=>npmViewAsync,
getNpmUrlAsync: ()=>getNpmUrlAsync,
downloadAndExtractNpmModuleAsync: ()=>downloadAndExtractNpmModuleAsync,
extractLocalNpmTarballAsync: ()=>extractLocalNpmTarballAsync,
extractNpmTarballFromUrlAsync: ()=>extractNpmTarballFromUrlAsync,
extractNpmTarballAsync: ()=>extractNpmTarballAsync
});
function _spawnAsync() {
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/spawn-async"));
_spawnAsync = function() {
return data;
};
return data;
}
function _assert() {
const data = /*#__PURE__*/ _interopRequireDefault(require("assert"));
_assert = function() {
return data;
};
return data;
}
function _crypto() {
const data = /*#__PURE__*/ _interopRequireDefault(require("crypto"));
_crypto = function() {
return data;
};
return data;
}
function _fs() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
_fs = function() {
return data;
};
return data;
}
function _slugify() {
const data = /*#__PURE__*/ _interopRequireDefault(require("slugify"));
_slugify = function() {
return data;
};
return data;
}
function _stream() {
const data = require("stream");
_stream = function() {
return data;
};
return data;
}
function _tar() {
const data = /*#__PURE__*/ _interopRequireDefault(require("tar"));
_tar = function() {
return data;
};
return data;
}
function _util() {
const data = require("util");
_util = function() {
return data;
};
return data;
}
const _createFileTransform = require("./createFileTransform");
const _dir = require("./dir");
const _errors = require("./errors");
const _client = require("../api/rest/client");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const debug = require("debug")("expo:utils:npm");
const cachedFetch = (0, _client.createCachedFetch)({
cacheDirectory: "template-cache"
});
function sanitizeNpmPackageName(name) {
// https://github.com/npm/validate-npm-package-name/#naming-rules
return applyKnownNpmPackageNameRules(name) || applyKnownNpmPackageNameRules((0, _slugify().default)(name)) || // If nothing is left use 'app' like we do in Xcode projects.
"app";
}
function applyKnownNpmPackageNameRules(name) {
// https://github.com/npm/validate-npm-package-name/#naming-rules
// package name cannot start with '.' or '_'.
while(/^(\.|_)/.test(name)){
name = name.substring(1);
}
name = name.toLowerCase().replace(/[^a-zA-Z._\-/@]/g, "");
return name// .replace(/![a-z0-9-._~]+/g, '')
// Remove special characters
.normalize("NFD").replace(/[\u0300-\u036f]/g, "") || null;
}
async function npmViewAsync(...props) {
var ref;
const cmd = [
"view",
...props,
"--json"
];
const results = (ref = (await (0, _spawnAsync().default)("npm", cmd)).stdout) == null ? void 0 : ref.trim();
const cmdString = `npm ${cmd.join(" ")}`;
debug("Run:", cmdString);
if (!results) {
return null;
}
try {
return JSON.parse(results);
} catch (error) {
throw new Error(`Could not parse JSON returned from "${cmdString}".\n\n${results}\n\nError: ${error.message}`);
}
}
async function getNpmUrlAsync(packageName) {
const results = await npmViewAsync(packageName, "dist");
(0, _assert().default)(results, `Could not get npm url for package "${packageName}"`);
// Fully qualified url returns an object.
// Example:
// 𝝠 npm view expo-template-bare-minimum@sdk-33 dist --json
if (typeof results === "object" && !Array.isArray(results)) {
return results.tarball;
}
// When the tag is arbitrary, the tarball is an array, return the last value as it's the most recent.
// Example:
// 𝝠 npm view expo-template-bare-minimum@33 dist --json
if (Array.isArray(results)) {
const lastResult = results[results.length - 1];
if (lastResult && typeof lastResult === "object" && !Array.isArray(lastResult)) {
return lastResult.tarball;
}
}
throw new _errors.CommandError("Expected results of `npm view ...` to be an array or string. Instead found: " + results);
}
// @ts-ignore
const pipeline = (0, _util().promisify)(_stream().Stream.pipeline);
async function downloadAndExtractNpmModuleAsync(npmName, props) {
const url = await getNpmUrlAsync(npmName);
debug("Fetch from URL:", url);
return await extractNpmTarballFromUrlAsync(url, props);
}
async function extractLocalNpmTarballAsync(tarFilePath, props) {
const readStream = _fs().default.createReadStream(tarFilePath);
return await extractNpmTarballAsync(readStream, props);
}
async function createUrlStreamAsync(url) {
const response = await cachedFetch(url);
if (!response.ok) {
throw new Error(`Unexpected response: ${response.statusText}. From url: ${url}`);
}
return response.body;
}
async function extractNpmTarballFromUrlAsync(url, props) {
return await extractNpmTarballAsync(await createUrlStreamAsync(url), props);
}
async function extractNpmTarballAsync(stream, props) {
const { cwd , strip , name , fileList =[] , filter } = props;
await (0, _dir.ensureDirectoryAsync)(cwd);
var _checksumAlgorithm;
const hash = _crypto().default.createHash((_checksumAlgorithm = props.checksumAlgorithm) != null ? _checksumAlgorithm : "md5");
const transformStream = new (_stream()).PassThrough();
transformStream.on("data", (chunk)=>{
hash.update(chunk);
});
await pipeline(stream, transformStream, _tar().default.extract({
cwd,
filter,
onentry: (0, _createFileTransform.createEntryResolver)(name),
strip: strip != null ? strip : 1
}, fileList));
return hash.digest("hex");
}
//# sourceMappingURL=npm.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,53 @@
/** `lodash.get` */ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
get: ()=>get,
set: ()=>set,
pickBy: ()=>pickBy
});
function get(obj, key) {
const branches = key.split(".");
let current = obj;
let branch;
while(branch = branches.shift()){
if (!(branch in current)) {
return null;
}
current = current[branch];
}
return current;
}
function set(obj, key, value) {
const branches = key.split(".");
let current = obj;
let branch;
while(branch = branches.shift()){
if (branches.length === 0) {
current[branch] = value;
return obj;
}
if (!(branch in current)) {
current[branch] = {};
}
current = current[branch];
}
return null;
}
function pickBy(obj, predicate) {
return Object.entries(obj).reduce((acc, [key, value])=>{
if (predicate(value, key)) {
acc[key] = value;
}
return acc;
}, {});
}
//# sourceMappingURL=obj.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/obj.ts"],"sourcesContent":["/** `lodash.get` */\nexport function get(obj: any, key: string): any | null {\n const branches = key.split('.');\n let current: any = obj;\n let branch: string | undefined;\n while ((branch = branches.shift())) {\n if (!(branch in current)) {\n return null;\n }\n current = current[branch];\n }\n return current;\n}\n\n/** `lodash.set` */\nexport function set(obj: any, key: string, value: any): any | null {\n const branches = key.split('.');\n let current: any = obj;\n let branch: string | undefined;\n while ((branch = branches.shift())) {\n if (branches.length === 0) {\n current[branch] = value;\n return obj;\n }\n\n if (!(branch in current)) {\n current[branch] = {};\n }\n\n current = current[branch];\n }\n return null;\n}\n\n/** `lodash.pickBy` */\nexport function pickBy<T>(\n obj: { [key: string]: T },\n predicate: (value: T, key: string) => boolean | undefined\n) {\n return Object.entries(obj).reduce(\n (acc, [key, value]) => {\n if (predicate(value, key)) {\n acc[key] = value;\n }\n return acc;\n },\n {} as { [key: string]: T }\n );\n}\n"],"names":["get","set","pickBy","obj","key","branches","split","current","branch","shift","value","length","predicate","Object","entries","reduce","acc"],"mappings":"AAAA,iBAAiB,GACjB;;;;;;;;;;;IAAgBA,GAAG,MAAHA,GAAG;IAcHC,GAAG,MAAHA,GAAG;IAoBHC,MAAM,MAANA,MAAM;;AAlCf,SAASF,GAAG,CAACG,GAAQ,EAAEC,GAAW,EAAc;IACrD,MAAMC,QAAQ,GAAGD,GAAG,CAACE,KAAK,CAAC,GAAG,CAAC,AAAC;IAChC,IAAIC,OAAO,GAAQJ,GAAG,AAAC;IACvB,IAAIK,MAAM,AAAoB,AAAC;IAC/B,MAAQA,MAAM,GAAGH,QAAQ,CAACI,KAAK,EAAE,CAAG;QAClC,IAAI,CAAC,CAACD,MAAM,IAAID,OAAO,CAAC,EAAE;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACDA,OAAO,GAAGA,OAAO,CAACC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,OAAOD,OAAO,CAAC;AACjB,CAAC;AAGM,SAASN,GAAG,CAACE,GAAQ,EAAEC,GAAW,EAAEM,KAAU,EAAc;IACjE,MAAML,QAAQ,GAAGD,GAAG,CAACE,KAAK,CAAC,GAAG,CAAC,AAAC;IAChC,IAAIC,OAAO,GAAQJ,GAAG,AAAC;IACvB,IAAIK,MAAM,AAAoB,AAAC;IAC/B,MAAQA,MAAM,GAAGH,QAAQ,CAACI,KAAK,EAAE,CAAG;QAClC,IAAIJ,QAAQ,CAACM,MAAM,KAAK,CAAC,EAAE;YACzBJ,OAAO,CAACC,MAAM,CAAC,GAAGE,KAAK,CAAC;YACxB,OAAOP,GAAG,CAAC;QACb,CAAC;QAED,IAAI,CAAC,CAACK,MAAM,IAAID,OAAO,CAAC,EAAE;YACxBA,OAAO,CAACC,MAAM,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;QAEDD,OAAO,GAAGA,OAAO,CAACC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAGM,SAASN,MAAM,CACpBC,GAAyB,EACzBS,SAAyD,EACzD;IACA,OAAOC,MAAM,CAACC,OAAO,CAACX,GAAG,CAAC,CAACY,MAAM,CAC/B,CAACC,GAAG,EAAE,CAACZ,GAAG,EAAEM,KAAK,CAAC,GAAK;QACrB,IAAIE,SAAS,CAACF,KAAK,EAAEN,GAAG,CAAC,EAAE;YACzBY,GAAG,CAACZ,GAAG,CAAC,GAAGM,KAAK,CAAC;QACnB,CAAC;QACD,OAAOM,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CACH,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,35 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "openBrowserAsync", {
enumerable: true,
get: ()=>openBrowserAsync
});
function _betterOpn() {
const data = /*#__PURE__*/ _interopRequireDefault(require("better-opn"));
_betterOpn = function() {
return data;
};
return data;
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
async function openBrowserAsync(target, options) {
if (process.platform !== "win32") {
return await (0, _betterOpn().default)(target, options);
}
const oldSystemRoot = process.env.SYSTEMROOT;
try {
var _SYSTEMROOT;
process.env.SYSTEMROOT = (_SYSTEMROOT = process.env.SYSTEMROOT) != null ? _SYSTEMROOT : process.env.SystemRoot;
return await (0, _betterOpn().default)(target, options);
} finally{
process.env.SYSTEMROOT = oldSystemRoot;
}
}
//# sourceMappingURL=open.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/open.ts"],"sourcesContent":["import betterOpenBrowserAsync from 'better-opn';\n\n/**\n * Due to a bug in `open`, which is used as fallback on Windows, we need to ensure `process.env.SYSTEMROOT` is set.\n * This environment variable is set by Windows on `SystemRoot`, causing `open` to execute a command with an \"unknown\" drive letter.\n *\n * @see https://github.com/sindresorhus/open/issues/205\n */\nexport async function openBrowserAsync(\n target: string,\n options?: any\n): Promise<import('child_process').ChildProcess | false> {\n if (process.platform !== 'win32') {\n return await betterOpenBrowserAsync(target, options);\n }\n\n const oldSystemRoot = process.env.SYSTEMROOT;\n try {\n process.env.SYSTEMROOT = process.env.SYSTEMROOT ?? process.env.SystemRoot;\n return await betterOpenBrowserAsync(target, options);\n } finally {\n process.env.SYSTEMROOT = oldSystemRoot;\n }\n}\n"],"names":["openBrowserAsync","target","options","process","platform","betterOpenBrowserAsync","oldSystemRoot","env","SYSTEMROOT","SystemRoot"],"mappings":"AAAA;;;;+BAQsBA,kBAAgB;;aAAhBA,gBAAgB;;;8DARH,YAAY;;;;;;;;;;;AAQxC,eAAeA,gBAAgB,CACpCC,MAAc,EACdC,OAAa,EAC0C;IACvD,IAAIC,OAAO,CAACC,QAAQ,KAAK,OAAO,EAAE;QAChC,OAAO,MAAMC,IAAAA,UAAsB,EAAA,QAAA,EAACJ,MAAM,EAAEC,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,MAAMI,aAAa,GAAGH,OAAO,CAACI,GAAG,CAACC,UAAU,AAAC;IAC7C,IAAI;YACuBL,WAAsB;QAA/CA,OAAO,CAACI,GAAG,CAACC,UAAU,GAAGL,CAAAA,WAAsB,GAAtBA,OAAO,CAACI,GAAG,CAACC,UAAU,YAAtBL,WAAsB,GAAIA,OAAO,CAACI,GAAG,CAACE,UAAU,CAAC;QAC1E,OAAO,MAAMJ,IAAAA,UAAsB,EAAA,QAAA,EAACJ,MAAM,EAAEC,OAAO,CAAC,CAAC;IACvD,SAAU;QACRC,OAAO,CAACI,GAAG,CAACC,UAAU,GAAGF,aAAa,CAAC;IACzC,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,107 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
getAllSpinners: ()=>getAllSpinners,
ora: ()=>ora,
logNewSection: ()=>logNewSection
});
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
function _ora() {
const data = /*#__PURE__*/ _interopRequireDefault(require("ora"));
_ora = function() {
return data;
};
return data;
}
const _env = require("./env");
const _interactive = require("./interactive");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const logReal = console.log;
const infoReal = console.info;
const warnReal = console.warn;
const errorReal = console.error;
const runningSpinners = [];
function getAllSpinners() {
return runningSpinners;
}
function ora(options) {
const inputOptions = typeof options === "string" ? {
text: options
} : options || {};
const disabled = !(0, _interactive.isInteractive)() || _env.env.EXPO_DEBUG;
const spinner = (0, _ora().default)({
// Ensure our non-interactive mode emulates CI mode.
isEnabled: !disabled,
// In non-interactive mode, send the stream to stdout so it prevents looking like an error.
stream: disabled ? process.stdout : process.stderr,
...inputOptions
});
const oraStart = spinner.start.bind(spinner);
const oraStop = spinner.stop.bind(spinner);
const oraStopAndPersist = spinner.stopAndPersist.bind(spinner);
const logWrap = (method, args)=>{
oraStop();
method(...args);
spinner.start();
};
const wrapNativeLogs = ()=>{
console.log = (...args)=>logWrap(logReal, args);
console.info = (...args)=>logWrap(infoReal, args);
console.warn = (...args)=>logWrap(warnReal, args);
console.error = (...args)=>logWrap(errorReal, args);
runningSpinners.push(spinner);
};
const resetNativeLogs = ()=>{
console.log = logReal;
console.info = infoReal;
console.warn = warnReal;
console.error = errorReal;
const index = runningSpinners.indexOf(spinner);
if (index >= 0) {
runningSpinners.splice(index, 1);
}
};
spinner.start = (text)=>{
wrapNativeLogs();
return oraStart(text);
};
spinner.stopAndPersist = (options)=>{
const result = oraStopAndPersist(options);
resetNativeLogs();
return result;
};
spinner.stop = ()=>{
const result = oraStop();
resetNativeLogs();
return result;
};
// Always make the central logging module aware of the current spinner
// Log.setSpinner(spinner);
return spinner;
}
function logNewSection(title) {
const spinner = ora(_chalk().default.bold(title));
// Prevent the spinner from clashing with debug logs
spinner.start();
return spinner;
}
//# sourceMappingURL=ora.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,103 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
parsePlistAsync: ()=>parsePlistAsync,
parsePlistBuffer: ()=>parsePlistBuffer
});
function _plist() {
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/plist"));
_plist = function() {
return data;
};
return data;
}
function _bplistParser() {
const data = /*#__PURE__*/ _interopRequireDefault(require("bplist-parser"));
_bplistParser = function() {
return data;
};
return data;
}
function _promises() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs/promises"));
_promises = function() {
return data;
};
return data;
}
const _errors = require("./errors");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const CHAR_CHEVRON_OPEN = 60;
const CHAR_B_LOWER = 98;
async function parsePlistAsync(plistPath) {
_log.debug(`Parse plist: ${plistPath}`);
return parsePlistBuffer(await _promises().default.readFile(plistPath));
}
function parsePlistBuffer(contents) {
if (contents[0] === CHAR_CHEVRON_OPEN) {
const info = _plist().default.parse(contents.toString());
if (Array.isArray(info)) return info[0];
return info;
} else if (contents[0] === CHAR_B_LOWER) {
// @ts-expect-error
const info1 = _bplistParser().default.parseBuffer(contents);
if (Array.isArray(info1)) return info1[0];
return info1;
} else {
throw new _errors.CommandError("PLIST", `Cannot parse plist of type byte (0x${contents[0].toString(16)})`);
}
}
//# sourceMappingURL=plist.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/plist.ts"],"sourcesContent":["import plist from '@expo/plist';\nimport binaryPlist from 'bplist-parser';\nimport fs from 'fs/promises';\n\nimport { CommandError } from './errors';\nimport * as Log from '../log';\n\nconst CHAR_CHEVRON_OPEN = 60;\nconst CHAR_B_LOWER = 98;\n// .mobileprovision\n// const CHAR_ZERO = 30;\n\nexport async function parsePlistAsync(plistPath: string) {\n Log.debug(`Parse plist: ${plistPath}`);\n\n return parsePlistBuffer(await fs.readFile(plistPath));\n}\n\nexport function parsePlistBuffer(contents: Buffer) {\n if (contents[0] === CHAR_CHEVRON_OPEN) {\n const info = plist.parse(contents.toString());\n if (Array.isArray(info)) return info[0];\n return info;\n } else if (contents[0] === CHAR_B_LOWER) {\n // @ts-expect-error\n const info = binaryPlist.parseBuffer(contents);\n if (Array.isArray(info)) return info[0];\n return info;\n } else {\n throw new CommandError(\n 'PLIST',\n `Cannot parse plist of type byte (0x${contents[0].toString(16)})`\n );\n }\n}\n"],"names":["parsePlistAsync","parsePlistBuffer","CHAR_CHEVRON_OPEN","CHAR_B_LOWER","plistPath","Log","debug","fs","readFile","contents","info","plist","parse","toString","Array","isArray","binaryPlist","parseBuffer","CommandError"],"mappings":"AAAA;;;;;;;;;;;IAYsBA,eAAe,MAAfA,eAAe;IAMrBC,gBAAgB,MAAhBA,gBAAgB;;;8DAlBd,aAAa;;;;;;;8DACP,eAAe;;;;;;;8DACxB,aAAa;;;;;;wBAEC,UAAU;2DAClB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE7B,MAAMC,iBAAiB,GAAG,EAAE,AAAC;AAC7B,MAAMC,YAAY,GAAG,EAAE,AAAC;AAIjB,eAAeH,eAAe,CAACI,SAAiB,EAAE;IACvDC,IAAG,CAACC,KAAK,CAAC,CAAC,aAAa,EAAEF,SAAS,CAAC,CAAC,CAAC,CAAC;IAEvC,OAAOH,gBAAgB,CAAC,MAAMM,SAAE,EAAA,QAAA,CAACC,QAAQ,CAACJ,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC;AAEM,SAASH,gBAAgB,CAACQ,QAAgB,EAAE;IACjD,IAAIA,QAAQ,CAAC,CAAC,CAAC,KAAKP,iBAAiB,EAAE;QACrC,MAAMQ,IAAI,GAAGC,MAAK,EAAA,QAAA,CAACC,KAAK,CAACH,QAAQ,CAACI,QAAQ,EAAE,CAAC,AAAC;QAC9C,IAAIC,KAAK,CAACC,OAAO,CAACL,IAAI,CAAC,EAAE,OAAOA,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,OAAOA,IAAI,CAAC;IACd,OAAO,IAAID,QAAQ,CAAC,CAAC,CAAC,KAAKN,YAAY,EAAE;QACvC,mBAAmB;QACnB,MAAMO,KAAI,GAAGM,aAAW,EAAA,QAAA,CAACC,WAAW,CAACR,QAAQ,CAAC,AAAC;QAC/C,IAAIK,KAAK,CAACC,OAAO,CAACL,KAAI,CAAC,EAAE,OAAOA,KAAI,CAAC,CAAC,CAAC,CAAC;QACxC,OAAOA,KAAI,CAAC;IACd,OAAO;QACL,MAAM,IAAIQ,OAAY,aAAA,CACpB,OAAO,EACP,CAAC,mCAAmC,EAAET,QAAQ,CAAC,CAAC,CAAC,CAACI,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAClE,CAAC;IACJ,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,198 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
getFreePortAsync: ()=>getFreePortAsync,
ensurePortAvailabilityAsync: ()=>ensurePortAvailabilityAsync,
choosePortAsync: ()=>choosePortAsync,
resolvePortAsync: ()=>resolvePortAsync
});
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
function _freeportAsync() {
const data = /*#__PURE__*/ _interopRequireDefault(require("freeport-async"));
_freeportAsync = function() {
return data;
};
return data;
}
const _env = require("./env");
const _errors = require("./errors");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
async function getFreePortAsync(rangeStart) {
const port = await (0, _freeportAsync().default)(rangeStart, {
hostnames: [
null,
"localhost"
]
});
if (!port) {
throw new _errors.CommandError("NO_PORT_FOUND", "No available port found");
}
return port;
}
async function ensurePortAvailabilityAsync(projectRoot, { port }) {
const freePort = await (0, _freeportAsync().default)(port, {
hostnames: [
null
]
});
// Check if port has become busy during the build.
if (freePort === port) {
return true;
}
const isBusy = await isBusyPortRunningSameProcessAsync(projectRoot, {
port
});
if (!isBusy) {
throw new _errors.CommandError(`Port "${port}" became busy running another process while the app was compiling. Re-run command to use a new port.`);
}
// Log that the dev server will not be started and that the logs will appear in another window.
_log.log(" The dev server for this app is already running in another window. Logs will appear there.");
return false;
}
function isRestrictedPort(port) {
if (process.platform !== "win32" && port < 1024) {
const isRoot = process.getuid && process.getuid() === 0;
return !isRoot;
}
return false;
}
async function isBusyPortRunningSameProcessAsync(projectRoot, { port }) {
const { getRunningProcess } = require("./getRunningProcess");
const runningProcess = isRestrictedPort(port) ? null : getRunningProcess(port);
if (runningProcess) {
if (runningProcess.directory === projectRoot) {
return true;
} else {
return false;
}
}
return null;
}
async function choosePortAsync(projectRoot, { defaultPort , host , reuseExistingPort }) {
try {
const port = await (0, _freeportAsync().default)(defaultPort, {
hostnames: [
host != null ? host : null
]
});
if (port === defaultPort || defaultPort === 0) {
return port;
}
const isRestricted = isRestrictedPort(port);
let message = isRestricted ? `Admin permissions are required to run a server on a port below 1024` : `Port ${_chalk().default.bold(defaultPort)} is`;
const { getRunningProcess } = require("./getRunningProcess");
const runningProcess = isRestricted ? null : getRunningProcess(defaultPort);
if (runningProcess) {
const pidTag = _chalk().default.gray(`(pid ${runningProcess.pid})`);
if (runningProcess.directory === projectRoot) {
message += ` running this app in another window`;
if (reuseExistingPort) {
return null;
}
} else {
message += ` running ${_chalk().default.cyan(runningProcess.command)} in another window`;
}
message += "\n" + _chalk().default.gray(` ${runningProcess.directory} ${pidTag}`);
} else {
message += " being used by another process";
}
_log.log(`\u203A ${message}`);
const { confirmAsync } = require("./prompts");
const change = await confirmAsync({
message: `Use port ${port} instead?`,
initial: true
});
return change ? port : null;
} catch (error) {
if (error.code === "ABORTED") {
throw error;
} else if (error.code === "NON_INTERACTIVE") {
_log.warn(_chalk().default.yellow(error.message));
return null;
}
throw error;
}
}
async function resolvePortAsync(projectRoot, { /** Should opt to reuse a port that is running the same project in another window. */ reuseExistingPort , /** Preferred port. */ defaultPort , /** Backup port for when the default isn't available. */ fallbackPort } = {}) {
let port;
if (typeof defaultPort === "string") {
port = parseInt(defaultPort, 10);
} else if (typeof defaultPort === "number") {
port = defaultPort;
} else {
port = _env.env.RCT_METRO_PORT || fallbackPort || 8081;
}
// Only check the port when the bundler is running.
const resolvedPort = await choosePortAsync(projectRoot, {
defaultPort: port,
reuseExistingPort
});
if (resolvedPort == null) {
_log.log(" Skipping dev server");
// Skip bundling if the port is null
} else {
// Use the new or resolved port
process.env.RCT_METRO_PORT = String(resolvedPort);
}
return resolvedPort;
}
//# sourceMappingURL=port.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,90 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "profile", {
enumerable: true,
get: ()=>profile
});
function _chalk() {
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
const _env = require("./env");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
function profile(fn, functionName = fn.name) {
if (!_env.env.EXPO_PROFILE) {
return fn;
}
const name = _chalk().default.dim(`⏱ [profile] ${functionName != null ? functionName : "unknown"}`);
return (...args)=>{
// Start the timer.
_log.time(name);
// Invoke the method.
const results = fn(...args);
// If non-promise then return as-is.
if (!(results instanceof Promise)) {
_log.timeEnd(name);
return results;
}
// Otherwise await to profile after the promise resolves.
return new Promise((resolve, reject)=>{
results.then((results)=>{
resolve(results);
_log.timeEnd(name);
}, (reason)=>{
reject(reason);
_log.timeEnd(name);
});
});
};
}
//# sourceMappingURL=profile.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/profile.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport { env } from './env';\nimport * as Log from '../log';\n\n/**\n * Wrap a method and profile the time it takes to execute the method using `EXPO_PROFILE`.\n * Works best with named functions (i.e. not arrow functions).\n *\n * @param fn function to profile.\n * @param functionName optional name of the function to display in the profile output.\n */\nexport function profile<IArgs extends any[], T extends (...args: IArgs) => any>(\n fn: T,\n functionName: string = fn.name\n): T {\n if (!env.EXPO_PROFILE) {\n return fn;\n }\n\n const name = chalk.dim(`⏱ [profile] ${functionName ?? 'unknown'}`);\n\n return ((...args: IArgs) => {\n // Start the timer.\n Log.time(name);\n\n // Invoke the method.\n const results = fn(...args);\n\n // If non-promise then return as-is.\n if (!(results instanceof Promise)) {\n Log.timeEnd(name);\n return results;\n }\n\n // Otherwise await to profile after the promise resolves.\n return new Promise<Awaited<ReturnType<T>>>((resolve, reject) => {\n results.then(\n (results) => {\n resolve(results);\n Log.timeEnd(name);\n },\n (reason) => {\n reject(reason);\n Log.timeEnd(name);\n }\n );\n });\n }) as T;\n}\n"],"names":["profile","fn","functionName","name","env","EXPO_PROFILE","chalk","dim","args","Log","time","results","Promise","timeEnd","resolve","reject","then","reason"],"mappings":"AAAA;;;;+BAYgBA,SAAO;;aAAPA,OAAO;;;8DAZL,OAAO;;;;;;qBAEL,OAAO;2DACN,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAStB,SAASA,OAAO,CACrBC,EAAK,EACLC,YAAoB,GAAGD,EAAE,CAACE,IAAI,EAC3B;IACH,IAAI,CAACC,IAAG,IAAA,CAACC,YAAY,EAAE;QACrB,OAAOJ,EAAE,CAAC;IACZ,CAAC;IAED,MAAME,IAAI,GAAGG,MAAK,EAAA,QAAA,CAACC,GAAG,CAAC,CAAC,aAAa,EAAEL,YAAY,WAAZA,YAAY,GAAI,SAAS,CAAC,CAAC,CAAC,AAAC;IAEpE,OAAQ,CAAC,GAAGM,IAAI,AAAO,GAAK;QAC1B,mBAAmB;QACnBC,IAAG,CAACC,IAAI,CAACP,IAAI,CAAC,CAAC;QAEf,qBAAqB;QACrB,MAAMQ,OAAO,GAAGV,EAAE,IAAIO,IAAI,CAAC,AAAC;QAE5B,oCAAoC;QACpC,IAAI,CAAC,CAACG,OAAO,YAAYC,OAAO,CAAC,EAAE;YACjCH,IAAG,CAACI,OAAO,CAACV,IAAI,CAAC,CAAC;YAClB,OAAOQ,OAAO,CAAC;QACjB,CAAC;QAED,yDAAyD;QACzD,OAAO,IAAIC,OAAO,CAAyB,CAACE,OAAO,EAAEC,MAAM,GAAK;YAC9DJ,OAAO,CAACK,IAAI,CACV,CAACL,OAAO,GAAK;gBACXG,OAAO,CAACH,OAAO,CAAC,CAAC;gBACjBF,IAAG,CAACI,OAAO,CAACV,IAAI,CAAC,CAAC;YACpB,CAAC,EACD,CAACc,MAAM,GAAK;gBACVF,MAAM,CAACE,MAAM,CAAC,CAAC;gBACfR,IAAG,CAACI,OAAO,CAACV,IAAI,CAAC,CAAC;YACpB,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAO;AACV,CAAC"}

View File

@@ -0,0 +1,71 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
setProgressBar: ()=>setProgressBar,
getProgressBar: ()=>getProgressBar,
createProgressBar: ()=>createProgressBar
});
function _progress() {
const data = /*#__PURE__*/ _interopRequireDefault(require("progress"));
_progress = function() {
return data;
};
return data;
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
let currentProgress = null;
function setProgressBar(bar) {
currentProgress = bar;
}
function getProgressBar() {
return currentProgress;
}
function createProgressBar(barFormat, options) {
if (process.stderr.clearLine == null) {
return null;
}
const bar = new (_progress()).default(barFormat, options);
const logReal = console.log;
const infoReal = console.info;
const warnReal = console.warn;
const errorReal = console.error;
const wrapNativeLogs = ()=>{
// @ts-expect-error
console.log = (...args)=>bar.interrupt(...args);
// @ts-expect-error
console.info = (...args)=>bar.interrupt(...args);
// @ts-expect-error
console.warn = (...args)=>bar.interrupt(...args);
// @ts-expect-error
console.error = (...args)=>bar.interrupt(...args);
};
const resetNativeLogs = ()=>{
console.log = logReal;
console.info = infoReal;
console.warn = warnReal;
console.error = errorReal;
};
const originalTerminate = bar.terminate.bind(bar);
bar.terminate = ()=>{
resetNativeLogs();
setProgressBar(null);
originalTerminate();
};
wrapNativeLogs();
setProgressBar(bar);
return bar;
}
//# sourceMappingURL=progress.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/progress.ts"],"sourcesContent":["import ProgressBar from 'progress';\n\nlet currentProgress: ProgressBar | null = null;\n\nexport function setProgressBar(bar: ProgressBar | null): void {\n currentProgress = bar;\n}\n\nexport function getProgressBar(): ProgressBar | null {\n return currentProgress;\n}\n\nexport function createProgressBar(barFormat: string, options: ProgressBar.ProgressBarOptions) {\n if (process.stderr.clearLine == null) {\n return null;\n }\n\n const bar = new ProgressBar(barFormat, options);\n\n const logReal = console.log;\n const infoReal = console.info;\n const warnReal = console.warn;\n const errorReal = console.error;\n\n const wrapNativeLogs = (): void => {\n // @ts-expect-error\n console.log = (...args: any) => bar.interrupt(...args);\n // @ts-expect-error\n console.info = (...args: any) => bar.interrupt(...args);\n // @ts-expect-error\n console.warn = (...args: any) => bar.interrupt(...args);\n // @ts-expect-error\n console.error = (...args: any) => bar.interrupt(...args);\n };\n\n const resetNativeLogs = (): void => {\n console.log = logReal;\n console.info = infoReal;\n console.warn = warnReal;\n console.error = errorReal;\n };\n\n const originalTerminate = bar.terminate.bind(bar);\n bar.terminate = () => {\n resetNativeLogs();\n setProgressBar(null);\n originalTerminate();\n };\n\n wrapNativeLogs();\n setProgressBar(bar);\n return bar;\n}\n"],"names":["setProgressBar","getProgressBar","createProgressBar","currentProgress","bar","barFormat","options","process","stderr","clearLine","ProgressBar","logReal","console","log","infoReal","info","warnReal","warn","errorReal","error","wrapNativeLogs","args","interrupt","resetNativeLogs","originalTerminate","terminate","bind"],"mappings":"AAAA;;;;;;;;;;;IAIgBA,cAAc,MAAdA,cAAc;IAIdC,cAAc,MAAdA,cAAc;IAIdC,iBAAiB,MAAjBA,iBAAiB;;;8DAZT,UAAU;;;;;;;;;;;AAElC,IAAIC,eAAe,GAAuB,IAAI,AAAC;AAExC,SAASH,cAAc,CAACI,GAAuB,EAAQ;IAC5DD,eAAe,GAAGC,GAAG,CAAC;AACxB,CAAC;AAEM,SAASH,cAAc,GAAuB;IACnD,OAAOE,eAAe,CAAC;AACzB,CAAC;AAEM,SAASD,iBAAiB,CAACG,SAAiB,EAAEC,OAAuC,EAAE;IAC5F,IAAIC,OAAO,CAACC,MAAM,CAACC,SAAS,IAAI,IAAI,EAAE;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAML,GAAG,GAAG,IAAIM,CAAAA,SAAW,EAAA,CAAA,QAAA,CAACL,SAAS,EAAEC,OAAO,CAAC,AAAC;IAEhD,MAAMK,OAAO,GAAGC,OAAO,CAACC,GAAG,AAAC;IAC5B,MAAMC,QAAQ,GAAGF,OAAO,CAACG,IAAI,AAAC;IAC9B,MAAMC,QAAQ,GAAGJ,OAAO,CAACK,IAAI,AAAC;IAC9B,MAAMC,SAAS,GAAGN,OAAO,CAACO,KAAK,AAAC;IAEhC,MAAMC,cAAc,GAAG,IAAY;QACjC,mBAAmB;QACnBR,OAAO,CAACC,GAAG,GAAG,CAAC,GAAGQ,IAAI,AAAK,GAAKjB,GAAG,CAACkB,SAAS,IAAID,IAAI,CAAC,CAAC;QACvD,mBAAmB;QACnBT,OAAO,CAACG,IAAI,GAAG,CAAC,GAAGM,IAAI,AAAK,GAAKjB,GAAG,CAACkB,SAAS,IAAID,IAAI,CAAC,CAAC;QACxD,mBAAmB;QACnBT,OAAO,CAACK,IAAI,GAAG,CAAC,GAAGI,IAAI,AAAK,GAAKjB,GAAG,CAACkB,SAAS,IAAID,IAAI,CAAC,CAAC;QACxD,mBAAmB;QACnBT,OAAO,CAACO,KAAK,GAAG,CAAC,GAAGE,IAAI,AAAK,GAAKjB,GAAG,CAACkB,SAAS,IAAID,IAAI,CAAC,CAAC;IAC3D,CAAC,AAAC;IAEF,MAAME,eAAe,GAAG,IAAY;QAClCX,OAAO,CAACC,GAAG,GAAGF,OAAO,CAAC;QACtBC,OAAO,CAACG,IAAI,GAAGD,QAAQ,CAAC;QACxBF,OAAO,CAACK,IAAI,GAAGD,QAAQ,CAAC;QACxBJ,OAAO,CAACO,KAAK,GAAGD,SAAS,CAAC;IAC5B,CAAC,AAAC;IAEF,MAAMM,iBAAiB,GAAGpB,GAAG,CAACqB,SAAS,CAACC,IAAI,CAACtB,GAAG,CAAC,AAAC;IAClDA,GAAG,CAACqB,SAAS,GAAG,IAAM;QACpBF,eAAe,EAAE,CAAC;QAClBvB,cAAc,CAAC,IAAI,CAAC,CAAC;QACrBwB,iBAAiB,EAAE,CAAC;IACtB,CAAC,CAAC;IAEFJ,cAAc,EAAE,CAAC;IACjBpB,cAAc,CAACI,GAAG,CAAC,CAAC;IACpB,OAAOA,GAAG,CAAC;AACb,CAAC"}

View File

@@ -0,0 +1,133 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
default: ()=>prompt,
confirmAsync: ()=>confirmAsync,
selectAsync: ()=>selectAsync,
promptAsync: ()=>promptAsync,
addInteractionListener: ()=>addInteractionListener,
removeInteractionListener: ()=>removeInteractionListener,
pauseInteractions: ()=>pauseInteractions,
resumeInteractions: ()=>resumeInteractions,
createSelectionFilter: ()=>createSelectionFilter
});
function _assert() {
const data = /*#__PURE__*/ _interopRequireDefault(require("assert"));
_assert = function() {
return data;
};
return data;
}
function _prompts() {
const data = /*#__PURE__*/ _interopRequireDefault(require("prompts"));
_prompts = function() {
return data;
};
return data;
}
const _errors = require("./errors");
const _interactive = require("./interactive");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const debug = require("debug")("expo:utils:prompts");
/** Interaction observers for detecting when keystroke tracking should pause/resume. */ const listeners = [];
async function prompt(questions, { nonInteractiveHelp , ...options } = {}) {
questions = Array.isArray(questions) ? questions : [
questions
];
if (!(0, _interactive.isInteractive)() && questions.length !== 0) {
let message = `Input is required, but 'npx expo' is in non-interactive mode.\n`;
if (nonInteractiveHelp) {
message += nonInteractiveHelp;
} else {
const question = questions[0];
const questionMessage = typeof question.message === "function" ? question.message(undefined, {}, question) : question.message;
message += `Required input:\n${(questionMessage || "").trim().replace(/^/gm, "> ")}`;
}
throw new _errors.CommandError("NON_INTERACTIVE", message);
}
pauseInteractions();
try {
const results = await (0, _prompts().default)(questions, {
onCancel () {
throw new _errors.AbortCommandError();
},
...options
});
return results;
} finally{
resumeInteractions();
}
}
async function confirmAsync(questions, options) {
const { value } = await prompt({
initial: true,
...questions,
name: "value",
type: "confirm"
}, options);
return value != null ? value : null;
}
async function selectAsync(message, choices, options) {
const { value } = await prompt({
message,
choices,
name: "value",
type: "select"
}, options);
return value != null ? value : null;
}
const promptAsync = prompt;
function addInteractionListener(callback) {
listeners.push(callback);
}
function removeInteractionListener(callback) {
const listenerIndex = listeners.findIndex((_callback)=>_callback === callback);
(0, _assert().default)(listenerIndex >= 0, "removeInteractionListener(): cannot remove an unregistered event listener.");
listeners.splice(listenerIndex, 1);
}
function pauseInteractions(options = {}) {
debug("Interaction observers paused");
for (const listener of listeners){
listener({
pause: true,
...options
});
}
}
function resumeInteractions(options = {}) {
debug("Interaction observers resumed");
for (const listener of listeners){
listener({
pause: false,
...options
});
}
}
function createSelectionFilter() {
function escapeRegex(string) {
return string.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
}
return async (input, choices)=>{
try {
const regex = new RegExp(escapeRegex(input), "i");
return choices.filter((choice)=>regex.test(choice.title));
} catch (error) {
debug("Error filtering choices", error);
return [];
}
};
}
//# sourceMappingURL=prompts.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,149 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
resolveStringOrBooleanArgsAsync: ()=>resolveStringOrBooleanArgsAsync,
resolveCustomBooleanArgsAsync: ()=>resolveCustomBooleanArgsAsync,
"_resolveStringOrBooleanArgs": ()=>_resolveStringOrBooleanArgs,
collapseAliases: ()=>collapseAliases,
assertUnknownArgs: ()=>assertUnknownArgs,
assertDuplicateArgs: ()=>assertDuplicateArgs
});
const _array = require("./array");
const _errors = require("./errors");
/** Split up arguments that are formatted like `--foo=bar` or `-f="bar"` to `['--foo', 'bar']` */ function splitArgs(args) {
const result = [];
for (const arg of args){
if (arg.startsWith("-")) {
const [key, ...props] = arg.split("=");
result.push(key);
if (props.length) {
result.push(props.join("="));
}
} else {
result.push(arg);
}
}
return result;
}
async function resolveStringOrBooleanArgsAsync(args, rawMap, extraArgs) {
args = splitArgs(args);
// Assert any missing arguments
assertUnknownArgs({
...rawMap,
...extraArgs
}, args);
// Collapse aliases into fully qualified arguments.
args = collapseAliases(extraArgs, args);
// Resolve all of the string or boolean arguments and the project root.
return _resolveStringOrBooleanArgs({
...rawMap,
...extraArgs
}, args);
}
async function resolveCustomBooleanArgsAsync(args, rawMap, extraArgs) {
const results = await resolveStringOrBooleanArgsAsync(args, rawMap, extraArgs);
return {
...results,
args: Object.fromEntries(Object.entries(results.args).map(([key, value])=>{
if (extraArgs[key]) {
if (typeof value === "string") {
if (![
"true",
"false"
].includes(value)) {
throw new _errors.CommandError("BAD_ARGS", `Invalid boolean argument: ${key}=${value}. Expected one of: true, false`);
}
return [
key,
value === "true"
];
}
}
return [
key,
value
];
}))
};
}
function _resolveStringOrBooleanArgs(arg, args) {
// Default project root, if a custom one is defined then it will overwrite this.
let projectRoot = ".";
// The resolved arguments.
const settings = {};
// Create a list of possible arguments, this will filter out aliases.
const possibleArgs = Object.entries(arg).filter(([, value])=>typeof value !== "string").map(([key])=>key);
// Loop over arguments in reverse order so we can resolve if a value belongs to a flag.
for(let i = args.length - 1; i > -1; i--){
const value = args[i];
// At this point we should have converted all aliases to fully qualified arguments.
if (value.startsWith("--")) {
// If we ever find an argument then it must be a boolean because we are checking in reverse
// and removing arguments from the array if we find a string.
// We don't override arguments that are already set
if (!(value in settings)) {
settings[value] = true;
}
} else {
// Get the previous argument in the array.
const nextValue = i > 0 ? args[i - 1] : null;
if (nextValue && possibleArgs.includes(nextValue)) {
// We don't override arguments that are already set
if (!(nextValue in settings)) {
settings[nextValue] = value;
}
i--;
} else if (// If the last value is not a flag and it doesn't have a recognized flag before it (instead having a string value or nothing)
// then it must be the project root.
i === args.length - 1) {
projectRoot = value;
} else {
// This will asserts if two strings are passed in a row and not at the end of the line.
throw new _errors.CommandError("BAD_ARGS", `Unknown argument: ${value}`);
}
}
}
return {
args: settings,
projectRoot
};
}
function collapseAliases(arg, args) {
const aliasMap = getAliasTuples(arg);
for (const [arg1, alias] of aliasMap){
args = (0, _array.replaceValue)(args, arg1, alias);
}
// Assert if there are duplicate flags after we collapse the aliases.
assertDuplicateArgs(args, aliasMap);
return args;
}
function assertUnknownArgs(arg, args) {
const allowedArgs = Object.keys(arg);
const unknownArgs = args.filter((arg)=>!allowedArgs.includes(arg) && arg.startsWith("-"));
if (unknownArgs.length > 0) {
throw new _errors.CommandError(`Unknown arguments: ${unknownArgs.join(", ")}`);
}
}
function getAliasTuples(arg) {
return Object.entries(arg).filter(([, value])=>typeof value === "string");
}
function assertDuplicateArgs(args, argNameAliasTuple) {
for (const [argName, argNameAlias] of argNameAliasTuple){
if (args.filter((a)=>[
argName,
argNameAlias
].includes(a)).length > 1) {
throw new _errors.CommandError("BAD_ARGS", `Can only provide one instance of ${argName} or ${argNameAlias}`);
}
}
}
//# sourceMappingURL=resolveArgs.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,204 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
getSchemesForIosAsync: ()=>getSchemesForIosAsync,
getSchemesForAndroidAsync: ()=>getSchemesForAndroidAsync,
getOptionalDevClientSchemeAsync: ()=>getOptionalDevClientSchemeAsync
});
function _config() {
const data = require("@expo/config");
_config = function() {
return data;
};
return data;
}
function _configPlugins() {
const data = require("@expo/config-plugins");
_configPlugins = function() {
return data;
};
return data;
}
function _getInfoPlistPath() {
const data = require("@expo/config-plugins/build/ios/utils/getInfoPlistPath");
_getInfoPlistPath = function() {
return data;
};
return data;
}
function _plist() {
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/plist"));
_plist = function() {
return data;
};
return data;
}
function _fs() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
_fs = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
function _resolveFrom() {
const data = /*#__PURE__*/ _interopRequireDefault(require("resolve-from"));
_resolveFrom = function() {
return data;
};
return data;
}
const _array = require("./array");
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
const _clearNativeFolder = require("../prebuild/clearNativeFolder");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const debug = require("debug")("expo:utils:scheme");
// sort longest to ensure uniqueness.
// this might be undesirable as it causes the QR code to be longer.
function sortLongest(obj) {
return obj.sort((a, b)=>b.length - a.length);
}
/**
* Resolve the scheme for the dev client using two methods:
* - filter on known Expo schemes, starting with `exp+`, avoiding 3rd party schemes.
* - filter on longest to ensure uniqueness.
*/ function resolveExpoOrLongestScheme(schemes) {
const expoOnlySchemes = schemes.filter((scheme)=>scheme.startsWith("exp+"));
return expoOnlySchemes.length > 0 ? sortLongest(expoOnlySchemes) : sortLongest(schemes);
}
async function getSchemesForIosAsync(projectRoot) {
try {
const infoPlistBuildProperty = (0, _getInfoPlistPath().getInfoPlistPathFromPbxproj)(projectRoot);
debug(`ios application Info.plist path:`, infoPlistBuildProperty);
if (infoPlistBuildProperty) {
const configPath = _path().default.join(projectRoot, "ios", infoPlistBuildProperty);
const rawPlist = _fs().default.readFileSync(configPath, "utf8");
const plistObject = _plist().default.parse(rawPlist);
const schemes = _configPlugins().IOSConfig.Scheme.getSchemesFromPlist(plistObject);
debug(`ios application schemes:`, schemes);
return resolveExpoOrLongestScheme(schemes);
}
} catch (error) {
debug(`expected error collecting ios application schemes for the main target:`, error);
}
// No ios folder or some other error
return [];
}
async function getSchemesForAndroidAsync(projectRoot) {
try {
const configPath = await _configPlugins().AndroidConfig.Paths.getAndroidManifestAsync(projectRoot);
const manifest = await _configPlugins().AndroidConfig.Manifest.readAndroidManifestAsync(configPath);
const schemes = await _configPlugins().AndroidConfig.Scheme.getSchemesFromManifest(manifest);
debug(`android application schemes:`, schemes);
return resolveExpoOrLongestScheme(schemes);
} catch (error) {
debug(`expected error collecting android application schemes for the main activity:`, error);
// No android folder or some other error
return [];
}
}
// TODO: Revisit and test after run code is merged.
async function getManagedDevClientSchemeAsync(projectRoot) {
const { exp } = (0, _config().getConfig)(projectRoot);
try {
const getDefaultScheme = require((0, _resolveFrom().default)(projectRoot, "expo-dev-client/getDefaultScheme"));
const scheme = getDefaultScheme(exp);
return scheme;
} catch {
_log.warn("\nDevelopment build: Unable to get the default URI scheme for the project. Please make sure the expo-dev-client package is installed.");
return null;
}
}
async function getOptionalDevClientSchemeAsync(projectRoot) {
const [hasIos, hasAndroid] = await Promise.all([
(0, _clearNativeFolder.hasRequiredIOSFilesAsync)(projectRoot),
(0, _clearNativeFolder.hasRequiredAndroidFilesAsync)(projectRoot),
]);
const [ios, android] = await Promise.all([
getSchemesForIosAsync(projectRoot),
getSchemesForAndroidAsync(projectRoot),
]);
// Allow managed projects
if (!hasIos && !hasAndroid) {
return {
scheme: await getManagedDevClientSchemeAsync(projectRoot),
resolution: "config"
};
}
// Allow for only one native project to exist.
if (!hasIos) {
return {
scheme: android[0],
resolution: "android"
};
} else if (!hasAndroid) {
return {
scheme: ios[0],
resolution: "ios"
};
} else {
return {
scheme: (0, _array.intersecting)(ios, android)[0],
resolution: "shared"
};
}
}
//# sourceMappingURL=scheme.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,31 @@
/**
* Joins strings with commas and 'and', based on English rules, limiting the number of items enumerated to keep from filling the console.
* @param items strings to join
* @param limit max number of strings to enumerate before using 'others'
* @returns joined string
*/ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "joinWithCommasAnd", {
enumerable: true,
get: ()=>joinWithCommasAnd
});
function joinWithCommasAnd(items, limit = 10) {
if (!items.length) {
return "";
}
const uniqueItems = items.filter((value, index, array)=>array.indexOf(value) === index);
if (uniqueItems.length === 1) {
return uniqueItems[0];
}
if (limit && uniqueItems.length > limit) {
const first = uniqueItems.slice(0, limit);
const remaining = uniqueItems.length - limit;
return `${first.join(", ")}, and ${remaining} ${remaining > 1 ? "others" : "other"}`;
}
const last = uniqueItems.pop();
return `${uniqueItems.join(", ")}${uniqueItems.length >= 2 ? "," : ""} and ${last}`;
}
//# sourceMappingURL=strings.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/strings.ts"],"sourcesContent":["/**\n * Joins strings with commas and 'and', based on English rules, limiting the number of items enumerated to keep from filling the console.\n * @param items strings to join\n * @param limit max number of strings to enumerate before using 'others'\n * @returns joined string\n */\nexport function joinWithCommasAnd(items: string[], limit: number | undefined = 10): string {\n if (!items.length) {\n return '';\n }\n\n const uniqueItems = items.filter((value, index, array) => array.indexOf(value) === index);\n\n if (uniqueItems.length === 1) {\n return uniqueItems[0];\n }\n\n if (limit && uniqueItems.length > limit) {\n const first = uniqueItems.slice(0, limit);\n const remaining = uniqueItems.length - limit;\n return `${first.join(', ')}, and ${remaining} ${remaining > 1 ? 'others' : 'other'}`;\n }\n\n const last = uniqueItems.pop();\n return `${uniqueItems.join(', ')}${uniqueItems.length >= 2 ? ',' : ''} and ${last}`;\n}\n"],"names":["joinWithCommasAnd","items","limit","length","uniqueItems","filter","value","index","array","indexOf","first","slice","remaining","join","last","pop"],"mappings":"AAAA;;;;;CAKC,GACD;;;;+BAAgBA,mBAAiB;;aAAjBA,iBAAiB;;AAA1B,SAASA,iBAAiB,CAACC,KAAe,EAAEC,KAAyB,GAAG,EAAE,EAAU;IACzF,IAAI,CAACD,KAAK,CAACE,MAAM,EAAE;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAMC,WAAW,GAAGH,KAAK,CAACI,MAAM,CAAC,CAACC,KAAK,EAAEC,KAAK,EAAEC,KAAK,GAAKA,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,KAAKC,KAAK,CAAC,AAAC;IAE1F,IAAIH,WAAW,CAACD,MAAM,KAAK,CAAC,EAAE;QAC5B,OAAOC,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,IAAIF,KAAK,IAAIE,WAAW,CAACD,MAAM,GAAGD,KAAK,EAAE;QACvC,MAAMQ,KAAK,GAAGN,WAAW,CAACO,KAAK,CAAC,CAAC,EAAET,KAAK,CAAC,AAAC;QAC1C,MAAMU,SAAS,GAAGR,WAAW,CAACD,MAAM,GAAGD,KAAK,AAAC;QAC7C,OAAO,CAAC,EAAEQ,KAAK,CAACG,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAED,SAAS,CAAC,CAAC,EAAEA,SAAS,GAAG,CAAC,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,MAAME,IAAI,GAAGV,WAAW,CAACW,GAAG,EAAE,AAAC;IAC/B,OAAO,CAAC,EAAEX,WAAW,CAACS,IAAI,CAAC,IAAI,CAAC,CAAC,EAAET,WAAW,CAACD,MAAM,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,KAAK,EAAEW,IAAI,CAAC,CAAC,CAAC;AACtF,CAAC"}

View File

@@ -0,0 +1,95 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "extractAsync", {
enumerable: true,
get: ()=>extractAsync
});
function _spawnAsync() {
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/spawn-async"));
_spawnAsync = function() {
return data;
};
return data;
}
function _tar() {
const data = /*#__PURE__*/ _interopRequireDefault(require("tar"));
_tar = function() {
return data;
};
return data;
}
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const debug = require("debug")("expo:utils:tar");
async function extractAsync(input, output) {
try {
if (process.platform !== "win32") {
debug(`Extracting ${input} to ${output}`);
await (0, _spawnAsync().default)("tar", [
"-xf",
input,
"-C",
output
], {
stdio: "inherit"
});
return;
}
} catch (error) {
_log.warn(`Failed to extract tar using native tools, falling back on JS tar module. ${error.message}`);
}
debug(`Extracting ${input} to ${output} using JS tar module`);
// tar node module has previously had problems with big files, and seems to
// be slower, so only use it as a backup.
await _tar().default.extract({
file: input,
cwd: output
});
}
//# sourceMappingURL=tar.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/tar.ts"],"sourcesContent":["import spawnAsync from '@expo/spawn-async';\nimport tar from 'tar';\n\nimport * as Log from '../log';\n\nconst debug = require('debug')('expo:utils:tar') as typeof console.log;\n\n/** Extract a tar using built-in tools if available and falling back on Node.js. */\nexport async function extractAsync(input: string, output: string): Promise<void> {\n try {\n if (process.platform !== 'win32') {\n debug(`Extracting ${input} to ${output}`);\n await spawnAsync('tar', ['-xf', input, '-C', output], {\n stdio: 'inherit',\n });\n return;\n }\n } catch (error: any) {\n Log.warn(\n `Failed to extract tar using native tools, falling back on JS tar module. ${error.message}`\n );\n }\n debug(`Extracting ${input} to ${output} using JS tar module`);\n // tar node module has previously had problems with big files, and seems to\n // be slower, so only use it as a backup.\n await tar.extract({ file: input, cwd: output });\n}\n"],"names":["extractAsync","debug","require","input","output","process","platform","spawnAsync","stdio","error","Log","warn","message","tar","extract","file","cwd"],"mappings":"AAAA;;;;+BAQsBA,cAAY;;aAAZA,YAAY;;;8DARX,mBAAmB;;;;;;;8DAC1B,KAAK;;;;;;2DAEA,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE7B,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,AAAsB,AAAC;AAGhE,eAAeF,YAAY,CAACG,KAAa,EAAEC,MAAc,EAAiB;IAC/E,IAAI;QACF,IAAIC,OAAO,CAACC,QAAQ,KAAK,OAAO,EAAE;YAChCL,KAAK,CAAC,CAAC,WAAW,EAAEE,KAAK,CAAC,IAAI,EAAEC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAMG,IAAAA,WAAU,EAAA,QAAA,EAAC,KAAK,EAAE;gBAAC,KAAK;gBAAEJ,KAAK;gBAAE,IAAI;gBAAEC,MAAM;aAAC,EAAE;gBACpDI,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;IACH,EAAE,OAAOC,KAAK,EAAO;QACnBC,IAAG,CAACC,IAAI,CACN,CAAC,yEAAyE,EAAEF,KAAK,CAACG,OAAO,CAAC,CAAC,CAC5F,CAAC;IACJ,CAAC;IACDX,KAAK,CAAC,CAAC,WAAW,EAAEE,KAAK,CAAC,IAAI,EAAEC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC9D,2EAA2E;IAC3E,yCAAyC;IACzC,MAAMS,IAAG,EAAA,QAAA,CAACC,OAAO,CAAC;QAAEC,IAAI,EAAEZ,KAAK;QAAEa,GAAG,EAAEZ,MAAM;KAAE,CAAC,CAAC;AAClD,CAAC"}

View File

@@ -0,0 +1,96 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "DetachedClient", {
enumerable: true,
get: ()=>DetachedClient
});
function _childProcess() {
const data = require("child_process");
_childProcess = function() {
return data;
};
return data;
}
function _fs() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
_fs = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
function _tempy() {
const data = /*#__PURE__*/ _interopRequireDefault(require("tempy"));
_tempy = function() {
return data;
};
return data;
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const debug = require("debug")("expo:telemetry:detachedClient");
class DetachedClient {
records = [];
get isIdentified() {
return !!this.actor;
}
async identify(actor) {
if (!actor) return;
debug("Actor received");
this.actor = actor;
}
async record(record) {
debug("Event received: %s", record.event);
this.records.push({
...record,
originalTimestamp: new Date()
});
}
async flush() {
try {
if (!this.records.length) {
return debug("No records to flush, skipping...");
}
const file = _tempy().default.file({
name: "expo-telemetry.json"
});
const data = {
actor: this.actor,
records: this.records
};
this.records = [];
await _fs().default.promises.mkdir(_path().default.dirname(file), {
recursive: true
});
await _fs().default.promises.writeFile(file, JSON.stringify(data));
const child = (0, _childProcess().spawn)(process.execPath, [
require.resolve("./flushDetached"),
file
], {
detached: true,
windowsHide: true,
shell: false,
stdio: "ignore"
});
child.unref();
debug("Detached flush started");
} catch (error) {
// This could fail if any direct or indirect import used by this code changes during an upgrade to the `expo` dependency via `npx expo install --fix`,
// since this file may no longer be present after the upgrade, but before the process under the old Expo CLI version is terminated.
debug("Exception while initiating detached flush:", error);
}
}
}
//# sourceMappingURL=DetachedClient.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/utils/telemetry/DetachedClient.ts"],"sourcesContent":["import { spawn } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport tempy from 'tempy';\n\nimport type { TelemetryClient, TelemetryRecord, TelemetryRecordWithDate } from './types';\nimport type { Actor } from '../../api/user/user';\n\nconst debug = require('debug')('expo:telemetry:detachedClient') as typeof console.log;\n\nexport type DetachedTelemetry = {\n actor?: Actor;\n records: TelemetryRecordWithDate[];\n};\n\nexport class DetachedClient implements TelemetryClient {\n private actor: Actor | undefined;\n private records: TelemetryRecordWithDate[] = [];\n\n get isIdentified() {\n return !!this.actor;\n }\n\n async identify(actor?: Actor) {\n if (!actor) return;\n debug('Actor received');\n this.actor = actor;\n }\n\n async record(record: TelemetryRecord) {\n debug('Event received: %s', record.event);\n this.records.push({ ...record, originalTimestamp: new Date() });\n }\n\n async flush() {\n try {\n if (!this.records.length) {\n return debug('No records to flush, skipping...');\n }\n\n const file = tempy.file({ name: 'expo-telemetry.json' });\n const data: DetachedTelemetry = { actor: this.actor, records: this.records };\n\n this.records = [];\n\n await fs.promises.mkdir(path.dirname(file), { recursive: true });\n await fs.promises.writeFile(file, JSON.stringify(data));\n\n const child = spawn(process.execPath, [require.resolve('./flushDetached'), file], {\n detached: true,\n windowsHide: true,\n shell: false,\n stdio: 'ignore',\n });\n\n child.unref();\n\n debug('Detached flush started');\n } catch (error) {\n // This could fail if any direct or indirect import used by this code changes during an upgrade to the `expo` dependency via `npx expo install --fix`,\n // since this file may no longer be present after the upgrade, but before the process under the old Expo CLI version is terminated.\n debug('Exception while initiating detached flush:', error);\n }\n }\n}\n"],"names":["DetachedClient","debug","require","records","isIdentified","actor","identify","record","event","push","originalTimestamp","Date","flush","length","file","tempy","name","data","fs","promises","mkdir","path","dirname","recursive","writeFile","JSON","stringify","child","spawn","process","execPath","resolve","detached","windowsHide","shell","stdio","unref","error"],"mappings":"AAAA;;;;+BAeaA,gBAAc;;aAAdA,cAAc;;;yBAfL,eAAe;;;;;;;8DACtB,IAAI;;;;;;;8DACF,MAAM;;;;;;;8DACL,OAAO;;;;;;;;;;;AAKzB,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,+BAA+B,CAAC,AAAsB,AAAC;AAO/E,MAAMF,cAAc;IAEzB,AAAQG,OAAO,GAA8B,EAAE,CAAC;QAE5CC,YAAY,GAAG;QACjB,OAAO,CAAC,CAAC,IAAI,CAACC,KAAK,CAAC;IACtB;UAEMC,QAAQ,CAACD,KAAa,EAAE;QAC5B,IAAI,CAACA,KAAK,EAAE,OAAO;QACnBJ,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxB,IAAI,CAACI,KAAK,GAAGA,KAAK,CAAC;IACrB;UAEME,MAAM,CAACA,MAAuB,EAAE;QACpCN,KAAK,CAAC,oBAAoB,EAAEM,MAAM,CAACC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAACL,OAAO,CAACM,IAAI,CAAC;YAAE,GAAGF,MAAM;YAAEG,iBAAiB,EAAE,IAAIC,IAAI,EAAE;SAAE,CAAC,CAAC;IAClE;UAEMC,KAAK,GAAG;QACZ,IAAI;YACF,IAAI,CAAC,IAAI,CAACT,OAAO,CAACU,MAAM,EAAE;gBACxB,OAAOZ,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACnD,CAAC;YAED,MAAMa,IAAI,GAAGC,MAAK,EAAA,QAAA,CAACD,IAAI,CAAC;gBAAEE,IAAI,EAAE,qBAAqB;aAAE,CAAC,AAAC;YACzD,MAAMC,IAAI,GAAsB;gBAAEZ,KAAK,EAAE,IAAI,CAACA,KAAK;gBAAEF,OAAO,EAAE,IAAI,CAACA,OAAO;aAAE,AAAC;YAE7E,IAAI,CAACA,OAAO,GAAG,EAAE,CAAC;YAElB,MAAMe,GAAE,EAAA,QAAA,CAACC,QAAQ,CAACC,KAAK,CAACC,KAAI,EAAA,QAAA,CAACC,OAAO,CAACR,IAAI,CAAC,EAAE;gBAAES,SAAS,EAAE,IAAI;aAAE,CAAC,CAAC;YACjE,MAAML,GAAE,EAAA,QAAA,CAACC,QAAQ,CAACK,SAAS,CAACV,IAAI,EAAEW,IAAI,CAACC,SAAS,CAACT,IAAI,CAAC,CAAC,CAAC;YAExD,MAAMU,KAAK,GAAGC,IAAAA,aAAK,EAAA,MAAA,EAACC,OAAO,CAACC,QAAQ,EAAE;gBAAC5B,OAAO,CAAC6B,OAAO,CAAC,iBAAiB,CAAC;gBAAEjB,IAAI;aAAC,EAAE;gBAChFkB,QAAQ,EAAE,IAAI;gBACdC,WAAW,EAAE,IAAI;gBACjBC,KAAK,EAAE,KAAK;gBACZC,KAAK,EAAE,QAAQ;aAChB,CAAC,AAAC;YAEHR,KAAK,CAACS,KAAK,EAAE,CAAC;YAEdnC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAClC,EAAE,OAAOoC,KAAK,EAAE;YACd,sJAAsJ;YACtJ,mIAAmI;YACnIpC,KAAK,CAAC,4CAA4C,EAAEoC,KAAK,CAAC,CAAC;QAC7D,CAAC;IACH;CACD"}

View File

@@ -0,0 +1,101 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "RudderClient", {
enumerable: true,
get: ()=>RudderClient
});
function _rudderSdkNode() {
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/rudder-sdk-node"));
_rudderSdkNode = function() {
return data;
};
return data;
}
const _getContext = require("./getContext");
const _userSettings = /*#__PURE__*/ _interopRequireDefault(require("../../api/user/UserSettings"));
const _user = require("../../api/user/user");
const _env = require("../env");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const debug = require("debug")("expo:telemetry:rudderClient");
class RudderClient {
constructor(sdk, mode = "attached"){
this.mode = mode;
if (!sdk) {
sdk = new (_rudderSdkNode()).default(_env.env.EXPO_STAGING || _env.env.EXPO_LOCAL ? "24TKICqYKilXM480mA7ktgVDdea" : "24TKR7CQAaGgIrLTgu3Fp4OdOkI", "https://cdp.expo.dev/v1/batch", {
flushInterval: 300
});
}
this.rudderstack = sdk;
}
/**
* Wait until the initial identification is complete.
* This may be called multiple times, from `.record()`, but only calls `getUserAsync` once.
* Note, this method won't retry after the initial identification returns `undefined`.
*/ async waitUntilInitialIdentification() {
if (!this.identity && !this.initialIdentify) {
// This method has a side-effect that calls `.identify()` internally
this.initialIdentify = (0, _user.getUserAsync)();
}
if (!this.identity && this.initialIdentify) {
await this.initialIdentify;
}
}
get isIdentified() {
return !!this.identity;
}
async identify(actor) {
var ref, ref1;
if (!actor) return;
debug("Actor received");
const userId = actor.id;
const anonymousId = await _userSettings.default.getAnonymousIdentifierAsync();
if (((ref = this.identity) == null ? void 0 : ref.userId) === userId && ((ref1 = this.identity) == null ? void 0 : ref1.anonymousId) === anonymousId) {
return;
}
this.identity = {
userId,
anonymousId
};
this.rudderstack.identify({
userId,
anonymousId,
traits: {
username: (0, _user.getActorDisplayName)(actor),
user_id: actor.id,
user_type: actor.__typename
}
});
}
async record(record) {
if (!this.identity) {
await this.waitUntilInitialIdentification();
}
if (this.identity) {
debug("Event received: %s", record.event);
const originalTimestamp = "originalTimestamp" in record ? record.originalTimestamp : undefined;
await this.rudderstack.track({
event: record.event,
originalTimestamp,
properties: record.properties,
...this.identity,
context: {
...(0, _getContext.getContext)(),
client: {
mode: this.mode
}
}
});
}
}
async flush() {
await this.rudderstack.flush();
}
}
//# sourceMappingURL=RudderClient.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,44 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _fs() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
_fs = function() {
return data;
};
return data;
}
const _rudderClient = require("./RudderClient");
const _user = require("../../api/user/user");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const telemetryFile = process.argv[2];
flush().catch(()=>_fs().default.promises.unlink(telemetryFile)).finally(()=>process.exit(0));
async function flush() {
if (!telemetryFile) return;
let json;
let data;
try {
json = await _fs().default.promises.readFile(telemetryFile, "utf8");
data = JSON.parse(json);
} catch (error) {
if (error.code === "ENOENT") return;
throw error;
}
if (!data.records.length) {
return;
}
const client = new _rudderClient.RudderClient(undefined, "detached");
await client.identify(data.actor || await (0, _user.getUserAsync)());
for (const record of data.records){
await client.record(record);
}
await client.flush();
await _fs().default.promises.unlink(telemetryFile);
}
//# sourceMappingURL=flushDetached.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/utils/telemetry/flushDetached.ts"],"sourcesContent":["import fs from 'fs';\n\nimport type { DetachedTelemetry } from './DetachedClient';\nimport { RudderClient } from './RudderClient';\nimport { getUserAsync } from '../../api/user/user';\n\nconst telemetryFile = process.argv[2];\n\nflush()\n .catch(() => fs.promises.unlink(telemetryFile))\n .finally(() => process.exit(0));\n\nasync function flush() {\n if (!telemetryFile) return;\n\n let json: string;\n let data: DetachedTelemetry;\n\n try {\n json = await fs.promises.readFile(telemetryFile, 'utf8');\n data = JSON.parse(json) as DetachedTelemetry;\n } catch (error: any) {\n if (error.code === 'ENOENT') return;\n throw error;\n }\n\n if (!data.records.length) {\n return;\n }\n\n const client = new RudderClient(undefined, 'detached');\n await client.identify(data.actor || (await getUserAsync()));\n\n for (const record of data.records) {\n await client.record(record);\n }\n\n await client.flush();\n await fs.promises.unlink(telemetryFile);\n}\n"],"names":["telemetryFile","process","argv","flush","catch","fs","promises","unlink","finally","exit","json","data","readFile","JSON","parse","error","code","records","length","client","RudderClient","undefined","identify","actor","getUserAsync","record"],"mappings":"AAAA;;;;;8DAAe,IAAI;;;;;;8BAGU,gBAAgB;sBAChB,qBAAqB;;;;;;AAElD,MAAMA,aAAa,GAAGC,OAAO,CAACC,IAAI,CAAC,CAAC,CAAC,AAAC;AAEtCC,KAAK,EAAE,CACJC,KAAK,CAAC,IAAMC,GAAE,EAAA,QAAA,CAACC,QAAQ,CAACC,MAAM,CAACP,aAAa,CAAC,CAAC,CAC9CQ,OAAO,CAAC,IAAMP,OAAO,CAACQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAElC,eAAeN,KAAK,GAAG;IACrB,IAAI,CAACH,aAAa,EAAE,OAAO;IAE3B,IAAIU,IAAI,AAAQ,AAAC;IACjB,IAAIC,IAAI,AAAmB,AAAC;IAE5B,IAAI;QACFD,IAAI,GAAG,MAAML,GAAE,EAAA,QAAA,CAACC,QAAQ,CAACM,QAAQ,CAACZ,aAAa,EAAE,MAAM,CAAC,CAAC;QACzDW,IAAI,GAAGE,IAAI,CAACC,KAAK,CAACJ,IAAI,CAAC,AAAqB,CAAC;IAC/C,EAAE,OAAOK,KAAK,EAAO;QACnB,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE,OAAO;QACpC,MAAMD,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAACJ,IAAI,CAACM,OAAO,CAACC,MAAM,EAAE;QACxB,OAAO;IACT,CAAC;IAED,MAAMC,MAAM,GAAG,IAAIC,aAAY,aAAA,CAACC,SAAS,EAAE,UAAU,CAAC,AAAC;IACvD,MAAMF,MAAM,CAACG,QAAQ,CAACX,IAAI,CAACY,KAAK,IAAK,MAAMC,IAAAA,KAAY,aAAA,GAAE,AAAC,CAAC,CAAC;IAE5D,KAAK,MAAMC,MAAM,IAAId,IAAI,CAACM,OAAO,CAAE;QACjC,MAAME,MAAM,CAACM,MAAM,CAACA,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,MAAMN,MAAM,CAAChB,KAAK,EAAE,CAAC;IACrB,MAAME,GAAE,EAAA,QAAA,CAACC,QAAQ,CAACC,MAAM,CAACP,aAAa,CAAC,CAAC;AAC1C,CAAC"}

Some files were not shown because too many files have changed in this diff Show More