- 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
135 lines
4.9 KiB
JavaScript
135 lines
4.9 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.ensureSlash = ensureSlash;
|
|
exports.getFileWithExtensions = getFileWithExtensions;
|
|
exports.getPossibleProjectRoot = getPossibleProjectRoot;
|
|
exports.resolveEntryPoint = resolveEntryPoint;
|
|
function _fs() {
|
|
const data = _interopRequireDefault(require("fs"));
|
|
_fs = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _path() {
|
|
const data = _interopRequireDefault(require("path"));
|
|
_path = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _resolveFrom() {
|
|
const data = _interopRequireDefault(require("resolve-from"));
|
|
_resolveFrom = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _extensions() {
|
|
const data = require("./extensions");
|
|
_extensions = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _Config() {
|
|
const data = require("../Config");
|
|
_Config = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _Errors() {
|
|
const data = require("../Errors");
|
|
_Errors = function () {
|
|
return data;
|
|
};
|
|
return data;
|
|
}
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
// https://github.com/facebook/create-react-app/blob/9750738cce89a967cc71f28390daf5d4311b193c/packages/react-scripts/config/paths.js#L22
|
|
function ensureSlash(inputPath, needsSlash) {
|
|
const hasSlash = inputPath.endsWith('/');
|
|
if (hasSlash && !needsSlash) {
|
|
return inputPath.substr(0, inputPath.length - 1);
|
|
} else if (!hasSlash && needsSlash) {
|
|
return `${inputPath}/`;
|
|
} else {
|
|
return inputPath;
|
|
}
|
|
}
|
|
function getPossibleProjectRoot() {
|
|
return _fs().default.realpathSync(process.cwd());
|
|
}
|
|
const nativePlatforms = ['ios', 'android'];
|
|
|
|
/** @returns the absolute entry file for an Expo project. */
|
|
function resolveEntryPoint(projectRoot, {
|
|
platform,
|
|
pkg = (0, _Config().getPackageJson)(projectRoot)
|
|
} = {}) {
|
|
const platforms = !platform ? [] : nativePlatforms.includes(platform) ? [platform, 'native'] : [platform];
|
|
const extensions = (0, _extensions().getBareExtensions)(platforms);
|
|
|
|
// If the config doesn't define a custom entry then we want to look at the `package.json`s `main` field, and try again.
|
|
const {
|
|
main
|
|
} = pkg;
|
|
if (main && typeof main === 'string') {
|
|
// Testing the main field against all of the provided extensions - for legacy reasons we can't use node module resolution as the package.json allows you to pass in a file without a relative path and expect it as a relative path.
|
|
let entry = getFileWithExtensions(projectRoot, main, extensions);
|
|
if (!entry) {
|
|
// Allow for paths like: `{ "main": "expo/AppEntry" }`
|
|
entry = resolveFromSilentWithExtensions(projectRoot, main, extensions);
|
|
if (!entry) throw new (_Errors().ConfigError)(`Cannot resolve entry file: The \`main\` field defined in your \`package.json\` points to an unresolvable or non-existent path.`, 'ENTRY_NOT_FOUND');
|
|
}
|
|
return entry;
|
|
}
|
|
|
|
// Check for a root index.* file in the project root.
|
|
const entry = resolveFromSilentWithExtensions(projectRoot, './index', extensions);
|
|
if (entry) {
|
|
return entry;
|
|
}
|
|
try {
|
|
// If none of the default files exist then we will attempt to use the main Expo entry point.
|
|
// This requires `expo` to be installed in the project to work as it will use `node_module/expo/AppEntry.js`
|
|
// Doing this enables us to create a bare minimum Expo project.
|
|
|
|
// TODO(Bacon): We may want to do a check against `./App` and `expo` in the `package.json` `dependencies` as we can more accurately ensure that the project is expo-min without needing the modules installed.
|
|
return (0, _resolveFrom().default)(projectRoot, 'expo/AppEntry');
|
|
} catch {
|
|
throw new (_Errors().ConfigError)(`The project entry file could not be resolved. Define it in the \`main\` field of the \`package.json\`, create an \`index.js\`, or install the \`expo\` package.`, 'ENTRY_NOT_FOUND');
|
|
}
|
|
}
|
|
|
|
// Resolve from but with the ability to resolve like a bundler
|
|
function resolveFromSilentWithExtensions(fromDirectory, moduleId, extensions) {
|
|
for (const extension of extensions) {
|
|
const modulePath = _resolveFrom().default.silent(fromDirectory, `${moduleId}.${extension}`);
|
|
if (modulePath?.endsWith(extension)) {
|
|
return modulePath;
|
|
}
|
|
}
|
|
return _resolveFrom().default.silent(fromDirectory, moduleId) || null;
|
|
}
|
|
|
|
// Statically attempt to resolve a module but with the ability to resolve like a bundler.
|
|
// This won't use node module resolution.
|
|
function getFileWithExtensions(fromDirectory, moduleId, extensions) {
|
|
const modulePath = _path().default.join(fromDirectory, moduleId);
|
|
if (_fs().default.existsSync(modulePath)) {
|
|
return modulePath;
|
|
}
|
|
for (const extension of extensions) {
|
|
const modulePath = _path().default.join(fromDirectory, `${moduleId}.${extension}`);
|
|
if (_fs().default.existsSync(modulePath)) {
|
|
return modulePath;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
//# sourceMappingURL=paths.js.map
|