This commit is contained in:
MichaelDvP
2024-02-21 15:59:56 +01:00
274 changed files with 2579 additions and 3145 deletions

14
.gitignore vendored
View File

@@ -2,7 +2,7 @@
.vscode/c_cpp_properties.json .vscode/c_cpp_properties.json
.vscode/extensions.json .vscode/extensions.json
.vscode/launch.json .vscode/launch.json
# .vscode/settings.json .vscode/settings.json
# c++ compiling # c++ compiling
.clang_complete .clang_complete
@@ -12,11 +12,11 @@ cppcheck.out.xml
# platformio # platformio
.pio .pio
pio_local.ini pio_local.ini
*_old
# OS specific # OS specific
.DS_Store .DS_Store
*Thumbs.db *Thumbs.db
emsesp
# web specfic # web specfic
build/ build/
@@ -43,7 +43,7 @@ interface/analyse.html
test.sh test.sh
scripts/run.sh scripts/run.sh
scripts/__pycache__ scripts/__pycache__
/scripts/stackdmp.txt scripts/stackdmp.txt
# i18n generated files # i18n generated files
interface/src/i18n/i18n-react.tsx interface/src/i18n/i18n-react.tsx
@@ -57,9 +57,5 @@ interface/src/i18n/i18n-util.async.ts
sonar/ sonar/
bw-output/ bw-output/
# entity dump results # testing
# dump_entities.csv emsesp
# dump_entities.xls*
*_old

View File

@@ -4,6 +4,8 @@
## **IMPORTANT! BREAKING CHANGES** ## **IMPORTANT! BREAKING CHANGES**
- The Wifi Tx Power setting in Network Settings will be reset to Auto
## Added ## Added
- thermostat boost mode and boost time [#1446](https://github.com/emsesp/EMS-ESP32/issues/1446) - thermostat boost mode and boost time [#1446](https://github.com/emsesp/EMS-ESP32/issues/1446)
@@ -28,9 +30,14 @@
- MQTT autodiscovery in Domoticz not working [#1360](https://github.com/emsesp/EMS-ESP32/issues/1528) - MQTT autodiscovery in Domoticz not working [#1360](https://github.com/emsesp/EMS-ESP32/issues/1528)
- dhw comfort for new ems+, [#1495](https://github.com/emsesp/EMS-ESP32/issues/1495) - dhw comfort for new ems+, [#1495](https://github.com/emsesp/EMS-ESP32/issues/1495)
- added writeable icon to Web's Custom Entity page for each entity shown in the table - added writeable icon to Web's Custom Entity page for each entity shown in the table
- Wifi Tx Power not adjusted [#1614](https://github.com/emsesp/EMS-ESP32/issues/1614)
- MQTT discovery of custom entity doesn't consider type of data [#1587](https://github.com/emsesp/EMS-ESP32/issues/1587)
- WiFi TxPower wasn't correctly used. Added an 'Auto' setting, which is the default.
## Changed ## Changed
- HA don't set entity_category to Diagnostic/Configuration for EMS entities [#1459](https://github.com/emsesp/EMS-ESP32/discussions/1459) - HA don't set entity_category to Diagnostic/Configuration for EMS entities [#1459](https://github.com/emsesp/EMS-ESP32/discussions/1459)
- upgraded ArduinoJson to 7.0.0 #1538 and then 7.0.2 - upgraded ArduinoJson to 7.0.0 #1538 and then 7.0.2
- small changes to the API for analog and temperature sensors - small changes to the API for analog and temperature sensors
- Length of mqtt Broker adress [#1619](https://github.com/emsesp/EMS-ESP32/issues/1619)
- C++ optimizations - see <https://github.com/emsesp/EMS-ESP32/pull/1615>

View File

@@ -36,7 +36,6 @@ build_flags =
-D FACTORY_MQTT_PORT=1883 -D FACTORY_MQTT_PORT=1883
-D FACTORY_MQTT_USERNAME=\"\" -D FACTORY_MQTT_USERNAME=\"\"
-D FACTORY_MQTT_PASSWORD=\"\" -D FACTORY_MQTT_PASSWORD=\"\"
-D FACTORY_MQTT_CLIENT_ID=\"ems-esp\"
-D FACTORY_MQTT_KEEP_ALIVE=60 -D FACTORY_MQTT_KEEP_ALIVE=60
-D FACTORY_MQTT_CLEAN_SESSION=false -D FACTORY_MQTT_CLEAN_SESSION=false
-D FACTORY_MQTT_MAX_TOPIC_LENGTH=128 -D FACTORY_MQTT_MAX_TOPIC_LENGTH=128

View File

@@ -5,8 +5,8 @@
}, },
"extends": [ "extends": [
"eslint:recommended", "eslint:recommended",
"airbnb/hooks", // "airbnb/hooks",
"airbnb-typescript", // "airbnb-typescript",
"plugin:react/recommended", "plugin:react/recommended",
"plugin:react/jsx-runtime", "plugin:react/jsx-runtime",
"plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended",

View File

@@ -26,14 +26,14 @@
"@babel/core": "^7.23.9", "@babel/core": "^7.23.9",
"@emotion/react": "^11.11.3", "@emotion/react": "^11.11.3",
"@emotion/styled": "^11.11.0", "@emotion/styled": "^11.11.0",
"@mui/icons-material": "^5.15.7", "@mui/icons-material": "^5.15.10",
"@mui/material": "^5.15.7", "@mui/material": "^5.15.10",
"@table-library/react-table-library": "4.1.7", "@table-library/react-table-library": "4.1.7",
"@types/imagemin": "^8.0.5", "@types/imagemin": "^8.0.5",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/node": "^20.11.16", "@types/node": "^20.11.17",
"@types/react": "^18.2.52", "@types/react": "^18.2.55",
"@types/react-dom": "^18.2.18", "@types/react-dom": "^18.2.19",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
"alova": "^2.17.0", "alova": "^2.17.0",
"async-validator": "^4.2.5", "async-validator": "^4.2.5",
@@ -54,12 +54,10 @@
"devDependencies": { "devDependencies": {
"@preact/compat": "^17.1.2", "@preact/compat": "^17.1.2",
"@preact/preset-vite": "^2.8.1", "@preact/preset-vite": "^2.8.1",
"@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/eslint-plugin": "^7.0.1",
"@typescript-eslint/parser": "^6.20.0", "@typescript-eslint/parser": "^7.0.1",
"concurrently": "^8.2.2", "concurrently": "^8.2.2",
"eslint": "^8.56.0", "eslint": "^8.56.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-typescript": "^17.1.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-import-resolver-typescript": "^3.6.1", "eslint-import-resolver-typescript": "^3.6.1",
"eslint-plugin-autofix": "^1.1.0", "eslint-plugin-autofix": "^1.1.0",
@@ -68,11 +66,11 @@
"eslint-plugin-prettier": "alpha", "eslint-plugin-prettier": "alpha",
"eslint-plugin-react": "^7.33.2", "eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-hooks": "^4.6.0",
"preact": "^10.19.3", "preact": "^10.19.4",
"prettier": "^3.2.5", "prettier": "^3.2.5",
"rollup-plugin-visualizer": "^5.12.0", "rollup-plugin-visualizer": "^5.12.0",
"terser": "^5.27.0", "terser": "^5.27.0",
"vite": "^5.0.12", "vite": "^5.1.1",
"vite-plugin-imagemin": "^0.6.1", "vite-plugin-imagemin": "^0.6.1",
"vite-tsconfig-paths": "^4.3.1" "vite-tsconfig-paths": "^4.3.1"
}, },

View File

@@ -2,6 +2,7 @@ import { readdirSync, existsSync, unlinkSync, readFileSync, createWriteStream }
import { resolve, relative, sep } from 'path'; import { resolve, relative, sep } from 'path';
import zlib from 'zlib'; import zlib from 'zlib';
import mime from 'mime-types'; import mime from 'mime-types';
import crypto from 'crypto';
const ARDUINO_INCLUDES = '#include <Arduino.h>\n\n'; const ARDUINO_INCLUDES = '#include <Arduino.h>\n\n';
const INDENT = ' '; const INDENT = ' ';
@@ -11,14 +12,17 @@ const bytesPerLine = 20;
var totalSize = 0; var totalSize = 0;
const generateWWWClass = () => const generateWWWClass = () =>
`typedef std::function<void(const String& uri, const String& contentType, const uint8_t * content, size_t len)> RouteRegistrationHandler; `typedef std::function<void(const String& uri, const String& contentType, const uint8_t * content, size_t len, const String& hash)> RouteRegistrationHandler;
// Total size is ${totalSize} bytes // Total size is ${totalSize} bytes
class WWWData { class WWWData {
${indent}public: ${indent}public:
${indent.repeat(2)}static void registerRoutes(RouteRegistrationHandler handler) { ${indent.repeat(2)}static void registerRoutes(RouteRegistrationHandler handler) {
${fileInfo ${fileInfo
.map((file) => `${indent.repeat(3)}handler("${file.uri}", "${file.mimeType}", ${file.variable}, ${file.size});`) .map(
(file) =>
`${indent.repeat(3)}handler("${file.uri}", "${file.mimeType}", ${file.variable}, ${file.size}, "${file.hash}");`
)
.join('\n')} .join('\n')}
${indent.repeat(2)}} ${indent.repeat(2)}}
}; };
@@ -50,6 +54,12 @@ const writeFile = (relativeFilePath, buffer) => {
writeStream.write('const uint8_t ' + variable + '[] = {'); writeStream.write('const uint8_t ' + variable + '[] = {');
// const zipBuffer = zlib.brotliCompressSync(buffer, { quality: 1 }); // const zipBuffer = zlib.brotliCompressSync(buffer, { quality: 1 });
const zipBuffer = zlib.gzipSync(buffer, { level: 9 }); const zipBuffer = zlib.gzipSync(buffer, { level: 9 });
// create sha
const hashSum = crypto.createHash('sha256');
hashSum.update(zipBuffer);
const hash = hashSum.digest('hex');
zipBuffer.forEach((b) => { zipBuffer.forEach((b) => {
if (!(size % bytesPerLine)) { if (!(size % bytesPerLine)) {
writeStream.write('\n'); writeStream.write('\n');
@@ -58,15 +68,19 @@ const writeFile = (relativeFilePath, buffer) => {
writeStream.write('0x' + ('00' + b.toString(16).toUpperCase()).slice(-2) + ','); writeStream.write('0x' + ('00' + b.toString(16).toUpperCase()).slice(-2) + ',');
size++; size++;
}); });
if (size % bytesPerLine) { if (size % bytesPerLine) {
writeStream.write('\n'); writeStream.write('\n');
} }
writeStream.write('};\n\n'); writeStream.write('};\n\n');
fileInfo.push({ fileInfo.push({
uri: '/' + relativeFilePath.replace(sep, '/'), uri: '/' + relativeFilePath.replace(sep, '/'),
mimeType, mimeType,
variable, variable,
size size,
hash
}); });
// console.log(relativeFilePath + ' (size ' + size + ' bytes)'); // console.log(relativeFilePath + ' (size ' + size + ' bytes)');

View File

@@ -4,7 +4,6 @@ import { ToastContainer, Slide } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.min.css'; import 'react-toastify/dist/ReactToastify.min.css';
import { localStorageDetector } from 'typesafe-i18n/detectors'; import { localStorageDetector } from 'typesafe-i18n/detectors';
import { FeaturesLoader } from './contexts/features';
import type { FC } from 'react'; import type { FC } from 'react';
import AppRouting from 'AppRouting'; import AppRouting from 'AppRouting';
import CustomTheme from 'CustomTheme'; import CustomTheme from 'CustomTheme';
@@ -27,9 +26,7 @@ const App: FC = () => {
return ( return (
<TypesafeI18n locale={detectedLocale}> <TypesafeI18n locale={detectedLocale}>
<CustomTheme> <CustomTheme>
<FeaturesLoader> <AppRouting />
<AppRouting />
</FeaturesLoader>
<ToastContainer <ToastContainer
position="bottom-left" position="bottom-left"
autoClose={3000} autoClose={3000}

View File

@@ -3,7 +3,6 @@ import { Box, Paper, Typography, MenuItem, TextField, Button } from '@mui/materi
import { useRequest } from 'alova'; import { useRequest } from 'alova';
import { useContext, useState } from 'react'; import { useContext, useState } from 'react';
import { toast } from 'react-toastify'; import { toast } from 'react-toastify';
import { FeaturesContext } from './contexts/features';
import type { ValidateFieldsError } from 'async-validator'; import type { ValidateFieldsError } from 'async-validator';
import type { Locales } from 'i18n/i18n-types'; import type { Locales } from 'i18n/i18n-types';
@@ -35,8 +34,6 @@ const SignIn: FC = () => {
const { LL, setLocale, locale } = useContext(I18nContext); const { LL, setLocale, locale } = useContext(I18nContext);
const { features } = useContext(FeaturesContext);
const [signInRequest, setSignInRequest] = useState<SignInRequest>({ const [signInRequest, setSignInRequest] = useState<SignInRequest>({
username: '', username: '',
password: '' password: ''
@@ -112,7 +109,6 @@ const SignIn: FC = () => {
})} })}
> >
<Typography variant="h4">{PROJECT_NAME}</Typography> <Typography variant="h4">{PROJECT_NAME}</Typography>
<Typography variant="subtitle2">{features.version}</Typography>
<TextField name="locale" variant="outlined" value={locale} onChange={onLocaleSelected} size="small" select> <TextField name="locale" variant="outlined" value={locale} onChange={onLocaleSelected} size="small" select>
<MenuItem key="de" value="de"> <MenuItem key="de" value="de">

View File

@@ -1,5 +0,0 @@
import { alovaInstance } from './endpoints';
import type { Features } from 'types';
export const readFeatures = () => alovaInstance.Get<Features>('/rest/features');

View File

@@ -1,25 +0,0 @@
import { useRequest } from 'alova';
import { FeaturesContext } from '.';
import type { FC } from 'react';
import type { RequiredChildrenProps } from 'utils';
import * as FeaturesApi from 'api/features';
const FeaturesLoader: FC<RequiredChildrenProps> = (props) => {
const { data: features } = useRequest(FeaturesApi.readFeatures);
if (features) {
return (
<FeaturesContext.Provider
value={{
features
}}
>
{props.children}
</FeaturesContext.Provider>
);
}
};
export default FeaturesLoader;

View File

@@ -1,10 +0,0 @@
import { createContext } from 'react';
import type { Features } from 'types';
export interface FeaturesContextValue {
features: Features;
}
const FeaturesContextDefaultValue = {} as FeaturesContextValue;
export const FeaturesContext = createContext(FeaturesContextDefaultValue);

View File

@@ -1,2 +0,0 @@
export * from './context';
export { default as FeaturesLoader } from './FeaturesLoader';

View File

@@ -72,6 +72,7 @@ const MqttSettingsForm: FC = () => {
name="host" name="host"
label={LL.ADDRESS_OF(LL.BROKER())} label={LL.ADDRESS_OF(LL.BROKER())}
fullWidth fullWidth
multiline
variant="outlined" variant="outlined"
value={data.host} value={data.host}
onChange={updateFormValue} onChange={updateFormValue}

View File

@@ -15,8 +15,8 @@ import {
ListItemSecondaryAction, ListItemSecondaryAction,
ListItemText, ListItemText,
Typography, Typography,
InputAdornment, TextField,
TextField MenuItem
} from '@mui/material'; } from '@mui/material';
// eslint-disable-next-line import/named // eslint-disable-next-line import/named
import { updateState, useRequest } from 'alova'; import { updateState, useRequest } from 'alova';
@@ -43,7 +43,7 @@ import {
} from 'components'; } from 'components';
import { useI18nContext } from 'i18n/i18n-react'; import { useI18nContext } from 'i18n/i18n-react';
import { numberValue, updateValueDirty, useRest } from 'utils'; import { updateValueDirty, useRest } from 'utils';
import { validate } from 'validators'; import { validate } from 'validators';
import { createNetworkSettingsValidator } from 'validators/network'; import { createNetworkSettingsValidator } from 'validators/network';
@@ -88,7 +88,7 @@ const WiFiSettingsForm: FC = () => {
static_ip_config: false, static_ip_config: false,
enableIPv6: false, enableIPv6: false,
bandwidth20: false, bandwidth20: false,
tx_power: 20, tx_power: 0,
nosleep: false, nosleep: false,
enableMDNS: true, enableMDNS: true,
enableCORS: false, enableCORS: false,
@@ -196,20 +196,27 @@ const WiFiSettingsForm: FC = () => {
margin="normal" margin="normal"
/> />
)} )}
<ValidatedTextField <TextField
fieldErrors={fieldErrors}
name="tx_power" name="tx_power"
label={LL.TX_POWER()} label={LL.TX_POWER()}
InputProps={{
endAdornment: <InputAdornment position="end">dBm</InputAdornment>
}}
fullWidth fullWidth
variant="outlined" variant="outlined"
value={numberValue(data.tx_power)} value={data.tx_power}
onChange={updateFormValue} onChange={updateFormValue}
type="number"
margin="normal" margin="normal"
/> select
>
<MenuItem value={0}>Auto</MenuItem>
<MenuItem value={78}>19.5 dBm</MenuItem>
<MenuItem value={76}>19 dBm</MenuItem>
<MenuItem value={74}>18.5 dBm</MenuItem>
<MenuItem value={68}>17 dBm</MenuItem>
<MenuItem value={60}>15 dBm</MenuItem>
<MenuItem value={52}>13 dBm</MenuItem>
<MenuItem value={44}>11 dBm</MenuItem>
<MenuItem value={34}>8.5 dBm</MenuItem>
<MenuItem value={28}>7 dBm</MenuItem>
</TextField>
<BlockFormControlLabel <BlockFormControlLabel
control={<Checkbox name="nosleep" checked={data.nosleep} onChange={updateFormValue} />} control={<Checkbox name="nosleep" checked={data.nosleep} onChange={updateFormValue} />}
label={LL.NETWORK_DISABLE_SLEEP()} label={LL.NETWORK_DISABLE_SLEEP()}

View File

@@ -29,7 +29,6 @@ import {
import { useRequest } from 'alova'; import { useRequest } from 'alova';
import { useContext, useState } from 'react'; import { useContext, useState } from 'react';
import { toast } from 'react-toastify'; import { toast } from 'react-toastify';
import { FeaturesContext } from '../../contexts/features';
import RestartMonitor from './RestartMonitor'; import RestartMonitor from './RestartMonitor';
import SystemStatusVersionDialog from './SystemStatusVersionDialog'; import SystemStatusVersionDialog from './SystemStatusVersionDialog';
import type { FC } from 'react'; import type { FC } from 'react';
@@ -54,8 +53,6 @@ const SystemStatusForm: FC = () => {
const [restarting, setRestarting] = useState<boolean>(); const [restarting, setRestarting] = useState<boolean>();
const [versionDialogOpen, setVersionDialogOpen] = useState<boolean>(false); const [versionDialogOpen, setVersionDialogOpen] = useState<boolean>(false);
const { features } = useContext(FeaturesContext);
const { send: restartCommand } = useRequest(SystemApi.restart(), { const { send: restartCommand } = useRequest(SystemApi.restart(), {
immediate: false immediate: false
}); });
@@ -215,7 +212,7 @@ const SystemStatusForm: FC = () => {
<DevicesIcon /> <DevicesIcon />
</Avatar> </Avatar>
</ListItemAvatar> </ListItemAvatar>
<ListItemText primary="SDK" secondary={data.arduino_version + ' / ESP-IDF v' + data.sdk_version} /> <ListItemText primary="SDK" secondary={data.arduino_version + ' / ESP-IDF ' + data.sdk_version} />
</ListItem> </ListItem>
<Divider variant="inset" component="li" /> <Divider variant="inset" component="li" />
<ListItem> <ListItem>
@@ -355,7 +352,7 @@ const SystemStatusForm: FC = () => {
open={versionDialogOpen} open={versionDialogOpen}
onClose={() => setVersionDialogOpen(false)} onClose={() => setVersionDialogOpen(false)}
version={data.emsesp_version} version={data.emsesp_version}
platform={features.platform} platform={data.esp_platform}
/> />
)} )}
</SectionContent> </SectionContent>

View File

@@ -94,8 +94,14 @@ const DashboardDevices: FC = () => {
}, []); }, []);
const leftOffset = () => { const leftOffset = () => {
const left = document.getElementById('devices-window')?.getBoundingClientRect().left; const devicesWindow = document.getElementById('devices-window');
const right = document.getElementById('devices-window')?.getBoundingClientRect().right; if (!devicesWindow) {
return 0;
}
const clientRect = devicesWindow.getBoundingClientRect();
const left = clientRect.left;
const right = clientRect.right;
if (!left || !right) { if (!left || !right) {
return 0; return 0;
@@ -416,11 +422,11 @@ const DashboardDevices: FC = () => {
const renderCoreData = () => ( const renderCoreData = () => (
<IconContext.Provider value={{ color: 'lightblue', size: '24', style: { verticalAlign: 'middle' } }}> <IconContext.Provider value={{ color: 'lightblue', size: '24', style: { verticalAlign: 'middle' } }}>
{!coreData.connected && <MessageBox my={2} level="error" message={LL.EMS_BUS_WARNING()} />} {!coreData.connected && <MessageBox my={2} level="error" message={LL.EMS_BUS_WARNING()} />}
{coreData.connected && coreData.devices.length === 0 && ( {/* {coreData.connected && coreData.devices.length === 0 && (
<MessageBox my={2} level="warning" message={LL.EMS_BUS_SCANNING()} /> <MessageBox my={2} level="warning" message={LL.EMS_BUS_SCANNING()} />
)} )} */}
{coreData.devices.length !== 0 && ( {coreData.connected && (
<Table data={{ nodes: coreData.devices }} select={device_select} theme={device_theme} layout={{ custom: true }}> <Table data={{ nodes: coreData.devices }} select={device_select} theme={device_theme} layout={{ custom: true }}>
{(tableList: any) => ( {(tableList: any) => (
<> <>

View File

@@ -1,5 +1,4 @@
export * from './ap'; export * from './ap';
export * from './features';
export * from './me'; export * from './me';
export * from './mqtt'; export * from './mqtt';
export * from './ntp'; export * from './ntp';

View File

@@ -14,9 +14,5 @@ export const createNetworkSettingsValidator = (networkSettings: NetworkSettings)
subnet_mask: [{ required: true, message: 'Subnet mask is required' }, IP_ADDRESS_VALIDATOR], subnet_mask: [{ required: true, message: 'Subnet mask is required' }, IP_ADDRESS_VALIDATOR],
dns_ip_1: IP_ADDRESS_VALIDATOR, dns_ip_1: IP_ADDRESS_VALIDATOR,
dns_ip_2: IP_ADDRESS_VALIDATOR dns_ip_2: IP_ADDRESS_VALIDATOR
}), })
tx_power: [
{ required: true, message: 'Tx Power is required' },
{ type: 'number', min: 0, max: 20, message: 'Tx Power must be between 0 and 20dBm' }
]
}); });

View File

@@ -33,7 +33,7 @@ export const IP_ADDRESS_VALIDATOR = {
} }
}; };
const HOSTNAME_LENGTH_REGEXP = /^.{0,63}$/; const HOSTNAME_LENGTH_REGEXP = /^.{0,200}$/;
const HOSTNAME_PATTERN_REGEXP = const HOSTNAME_PATTERN_REGEXP =
/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/; /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/;
@@ -42,7 +42,7 @@ const isValidHostname = (value: string) => HOSTNAME_LENGTH_REGEXP.test(value) &&
export const HOSTNAME_VALIDATOR = { export const HOSTNAME_VALIDATOR = {
validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) { validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) {
if (value && !isValidHostname(value)) { if (value && !isValidHostname(value)) {
callback('Must be a valid hostname of up to 63 characters'); callback('Must be a valid hostname');
} else { } else {
callback(); callback();
} }
@@ -52,7 +52,7 @@ export const HOSTNAME_VALIDATOR = {
export const IP_OR_HOSTNAME_VALIDATOR = { export const IP_OR_HOSTNAME_VALIDATOR = {
validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) { validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) {
if (value && !(isValidIpAddress(value) || isValidHostname(value))) { if (value && !(isValidIpAddress(value) || isValidHostname(value))) {
callback('Must be a valid IP address or hostname of up to 63 characters'); callback('Must be a valid IP address or hostname');
} else { } else {
callback(); callback();
} }

View File

@@ -992,14 +992,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@mui/base@npm:5.0.0-beta.34": "@mui/base@npm:5.0.0-beta.36":
version: 5.0.0-beta.34 version: 5.0.0-beta.36
resolution: "@mui/base@npm:5.0.0-beta.34" resolution: "@mui/base@npm:5.0.0-beta.36"
dependencies: dependencies:
"@babel/runtime": "npm:^7.23.9" "@babel/runtime": "npm:^7.23.9"
"@floating-ui/react-dom": "npm:^2.0.8" "@floating-ui/react-dom": "npm:^2.0.8"
"@mui/types": "npm:^7.2.13" "@mui/types": "npm:^7.2.13"
"@mui/utils": "npm:^5.15.7" "@mui/utils": "npm:^5.15.9"
"@popperjs/core": "npm:^2.11.8" "@popperjs/core": "npm:^2.11.8"
clsx: "npm:^2.1.0" clsx: "npm:^2.1.0"
prop-types: "npm:^15.8.1" prop-types: "npm:^15.8.1"
@@ -1010,20 +1010,20 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
"@types/react": "@types/react":
optional: true optional: true
checksum: 10/8705872e4290bec1a0e19cdb62cf0ead3b18c2fc4d404a4c2913107cc3418524d2f53c337878636af59595c5ac3631d1f108cbc236f6f9cd51b6efe768b65ea5 checksum: 10/32be203df3ffa2e36095d37295adae7870489fb2ed82a156c10f9ea4a51c3d06b0c3415e8503b110aa2ee98d3d86d6c1c50e190e85130aa1c1db694afa56ab7a
languageName: node languageName: node
linkType: hard linkType: hard
"@mui/core-downloads-tracker@npm:^5.15.7": "@mui/core-downloads-tracker@npm:^5.15.10":
version: 5.15.7 version: 5.15.10
resolution: "@mui/core-downloads-tracker@npm:5.15.7" resolution: "@mui/core-downloads-tracker@npm:5.15.10"
checksum: 10/cdaea04222020086fd68e25bdf0f4dfdfc9a3b58a558297ef0a247f02cce8ea7671f9a31c07c5b53cfe553d24110baed2b03b701b1bea60f5c2b2e3ba56ba6fc checksum: 10/aeb16b31f60c08cc03585fedadceadd54aa48dda394fb945ab885f884c1b1692efb72309465641b6ca2367bd53d5fdce15f189d4691f42b59206622ffb2d6f0f
languageName: node languageName: node
linkType: hard linkType: hard
"@mui/icons-material@npm:^5.15.7": "@mui/icons-material@npm:^5.15.10":
version: 5.15.7 version: 5.15.10
resolution: "@mui/icons-material@npm:5.15.7" resolution: "@mui/icons-material@npm:5.15.10"
dependencies: dependencies:
"@babel/runtime": "npm:^7.23.9" "@babel/runtime": "npm:^7.23.9"
peerDependencies: peerDependencies:
@@ -1033,23 +1033,23 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
"@types/react": "@types/react":
optional: true optional: true
checksum: 10/d6c612aab0f10f57462e5bd467f8e32240123bc59728d471b7ae3724be4b02247db694e21e03ab58341e7737da87cef3aab35f98bbed14883688b8d667ff0f30 checksum: 10/ce22c02dc7ed960a21f8d5ea7c4d4fc03d9f71e8a26ced02f75da1ffd6c768e6fa0682a308a03be53bffc2325a5aaf68be69f9e192b0a57c6752f7548e5b9045
languageName: node languageName: node
linkType: hard linkType: hard
"@mui/material@npm:^5.15.7": "@mui/material@npm:^5.15.10":
version: 5.15.7 version: 5.15.10
resolution: "@mui/material@npm:5.15.7" resolution: "@mui/material@npm:5.15.10"
dependencies: dependencies:
"@babel/runtime": "npm:^7.23.9" "@babel/runtime": "npm:^7.23.9"
"@mui/base": "npm:5.0.0-beta.34" "@mui/base": "npm:5.0.0-beta.36"
"@mui/core-downloads-tracker": "npm:^5.15.7" "@mui/core-downloads-tracker": "npm:^5.15.10"
"@mui/system": "npm:^5.15.7" "@mui/system": "npm:^5.15.9"
"@mui/types": "npm:^7.2.13" "@mui/types": "npm:^7.2.13"
"@mui/utils": "npm:^5.15.7" "@mui/utils": "npm:^5.15.9"
"@types/react-transition-group": "npm:^4.4.10" "@types/react-transition-group": "npm:^4.4.10"
clsx: "npm:^2.1.0" clsx: "npm:^2.1.0"
csstype: "npm:^3.1.2" csstype: "npm:^3.1.3"
prop-types: "npm:^15.8.1" prop-types: "npm:^15.8.1"
react-is: "npm:^18.2.0" react-is: "npm:^18.2.0"
react-transition-group: "npm:^4.4.5" react-transition-group: "npm:^4.4.5"
@@ -1066,16 +1066,16 @@ __metadata:
optional: true optional: true
"@types/react": "@types/react":
optional: true optional: true
checksum: 10/bc7a31e53770b27b49786567d4d2912d6ecf163a438d75806ec98dea8fa2f0e0b2daeb6ee97cba57c9636ed2d7e3b42c5c801f9d3479f02716933f839b7df6a4 checksum: 10/a88ad1287a905549ed516742544c8ba32f0cd7e1b184564efc8ceba5f43060d37b5cd113db605f1bb5be6c74cbdad7321d3fd7df410ba33d55548cf7c5bbf8d0
languageName: node languageName: node
linkType: hard linkType: hard
"@mui/private-theming@npm:^5.15.7": "@mui/private-theming@npm:^5.15.9":
version: 5.15.7 version: 5.15.9
resolution: "@mui/private-theming@npm:5.15.7" resolution: "@mui/private-theming@npm:5.15.9"
dependencies: dependencies:
"@babel/runtime": "npm:^7.23.9" "@babel/runtime": "npm:^7.23.9"
"@mui/utils": "npm:^5.15.7" "@mui/utils": "npm:^5.15.9"
prop-types: "npm:^15.8.1" prop-types: "npm:^15.8.1"
peerDependencies: peerDependencies:
"@types/react": ^17.0.0 || ^18.0.0 "@types/react": ^17.0.0 || ^18.0.0
@@ -1083,17 +1083,17 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
"@types/react": "@types/react":
optional: true optional: true
checksum: 10/07d85483924f1ab641ff9810f5379d28bd0661db1b42604e1c1602d610d114396c1bd187eefd26b9c303727d7d16a4758ca5c8ffbc1b410cbae156edf8b9472f checksum: 10/ca6d0643289eb14e127d46a516311807a7935994dcbb14a108e756ba9fe39bf08e2fe2f2bd75cec5a71817f3b2fe74de2f3322b67931539ced5e2f13aa9e2326
languageName: node languageName: node
linkType: hard linkType: hard
"@mui/styled-engine@npm:^5.15.7": "@mui/styled-engine@npm:^5.15.9":
version: 5.15.7 version: 5.15.9
resolution: "@mui/styled-engine@npm:5.15.7" resolution: "@mui/styled-engine@npm:5.15.9"
dependencies: dependencies:
"@babel/runtime": "npm:^7.23.9" "@babel/runtime": "npm:^7.23.9"
"@emotion/cache": "npm:^11.11.0" "@emotion/cache": "npm:^11.11.0"
csstype: "npm:^3.1.2" csstype: "npm:^3.1.3"
prop-types: "npm:^15.8.1" prop-types: "npm:^15.8.1"
peerDependencies: peerDependencies:
"@emotion/react": ^11.4.1 "@emotion/react": ^11.4.1
@@ -1104,21 +1104,21 @@ __metadata:
optional: true optional: true
"@emotion/styled": "@emotion/styled":
optional: true optional: true
checksum: 10/965e5738577db0d40904554b341395d337c93d7b4ebba783cb5362b6aa7f7e0be2cf1999d7c14daca6caba37a51f13188eaf260ff5b4099a269b1c155eee3773 checksum: 10/ddf0bda85507419829c8fe3735b5b05d9544fea0f954de574a9841d46d14dd750050834aae5b1f0b676a1dc5fe1278c22fb16415df7d6202d6aa49fea12d59de
languageName: node languageName: node
linkType: hard linkType: hard
"@mui/system@npm:^5.15.7": "@mui/system@npm:^5.15.9":
version: 5.15.7 version: 5.15.9
resolution: "@mui/system@npm:5.15.7" resolution: "@mui/system@npm:5.15.9"
dependencies: dependencies:
"@babel/runtime": "npm:^7.23.9" "@babel/runtime": "npm:^7.23.9"
"@mui/private-theming": "npm:^5.15.7" "@mui/private-theming": "npm:^5.15.9"
"@mui/styled-engine": "npm:^5.15.7" "@mui/styled-engine": "npm:^5.15.9"
"@mui/types": "npm:^7.2.13" "@mui/types": "npm:^7.2.13"
"@mui/utils": "npm:^5.15.7" "@mui/utils": "npm:^5.15.9"
clsx: "npm:^2.1.0" clsx: "npm:^2.1.0"
csstype: "npm:^3.1.2" csstype: "npm:^3.1.3"
prop-types: "npm:^15.8.1" prop-types: "npm:^15.8.1"
peerDependencies: peerDependencies:
"@emotion/react": ^11.5.0 "@emotion/react": ^11.5.0
@@ -1132,7 +1132,7 @@ __metadata:
optional: true optional: true
"@types/react": "@types/react":
optional: true optional: true
checksum: 10/49db180adf1e3341cf14791c93711d16c76aad371dd43966da49c8727751d5c611835be8bac61278269414820c8f6bbd41481fa615df9a1cbc79be5846ef8896 checksum: 10/85c2d18f3846cc1554db48071606a52f22186cf4ac1b0be748b275a8e200c12528c477acb794b8eb545e4603e5b8566186ea022eb09b5b1a3668554dd0ea9c7d
languageName: node languageName: node
linkType: hard linkType: hard
@@ -1148,9 +1148,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@mui/utils@npm:^5.15.7": "@mui/utils@npm:^5.15.9":
version: 5.15.7 version: 5.15.9
resolution: "@mui/utils@npm:5.15.7" resolution: "@mui/utils@npm:5.15.9"
dependencies: dependencies:
"@babel/runtime": "npm:^7.23.9" "@babel/runtime": "npm:^7.23.9"
"@types/prop-types": "npm:^15.7.11" "@types/prop-types": "npm:^15.7.11"
@@ -1162,7 +1162,7 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
"@types/react": "@types/react":
optional: true optional: true
checksum: 10/34f4ed23d1ac8ed7cc4c027789ea60def6a85d922f742ff57a614c0a77a839d38de40031895a867c0dadc1e5f226ac7044f2fea084297201326f0201c3f85237 checksum: 10/8628e4402856427bbc1ee3628afff596149ae3067ca6d62a1890d7b15217248fbeb65ec9360afc6963b330c08945fe6452deef2849d8ca35d894b42746cdad77
languageName: node languageName: node
linkType: hard linkType: hard
@@ -1590,12 +1590,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/node@npm:^20.11.16": "@types/node@npm:^20.11.17":
version: 20.11.16 version: 20.11.17
resolution: "@types/node@npm:20.11.16" resolution: "@types/node@npm:20.11.17"
dependencies: dependencies:
undici-types: "npm:~5.26.4" undici-types: "npm:~5.26.4"
checksum: 10/751f50ec5c9332b11515e82fe37c71479ac4449b711280aa3c7910edf67b1e3f5ac00041512add543f9a892096a68356406998bf02a2c809a73d176c44c28414 checksum: 10/3342df87258d1c56154bcd4b85180f48675427b235971e6e6e2e037353f5a2ae9aaa05ba5df0fe1e2d2f1022c8d856fd39056b9d7f50ea30c0ca3214137cae1d
languageName: node languageName: node
linkType: hard linkType: hard
@@ -1620,12 +1620,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/react-dom@npm:^18.2.18": "@types/react-dom@npm:^18.2.19":
version: 18.2.18 version: 18.2.19
resolution: "@types/react-dom@npm:18.2.18" resolution: "@types/react-dom@npm:18.2.19"
dependencies: dependencies:
"@types/react": "npm:*" "@types/react": "npm:*"
checksum: 10/4ef7725b4cebd4a32e049097ddfdfd855a178e63ead97ab6d3084872e7d6c1acd71aa923488123cd1015f0e0b11489d2b44f674a1df8fe82d7827eabbec6dbf1 checksum: 10/98eb760ce78f1016d97c70f605f0b1a53873a548d3c2192b40c897f694fd9c8bb12baeada16581a9c7b26f5022c1d2613547be98284d8f1b82d1611b1e3e7df0
languageName: node languageName: node
linkType: hard linkType: hard
@@ -1670,14 +1670,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/react@npm:^18.2.52": "@types/react@npm:^18.2.55":
version: 18.2.52 version: 18.2.55
resolution: "@types/react@npm:18.2.52" resolution: "@types/react@npm:18.2.55"
dependencies: dependencies:
"@types/prop-types": "npm:*" "@types/prop-types": "npm:*"
"@types/scheduler": "npm:*" "@types/scheduler": "npm:*"
csstype: "npm:^3.0.2" csstype: "npm:^3.0.2"
checksum: 10/0ab90a37fd82028c3559f18ce50790d01b262589a2ea49d014d8888291f47d9c91e65cb7db031a3e5d58818cb5376577afb4b593068473abfd0c695fa7e6b7c4 checksum: 10/bf8fe19e73575489e63c0726355f164157cd69e75f2a862436ad2c0586e732cb953a7255a6bc73145e8f9506ee7a723f9a569ca9a39c53984e5b12b84e1c718a
languageName: node languageName: node
linkType: hard linkType: hard
@@ -1713,15 +1713,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/eslint-plugin@npm:^6.20.0": "@typescript-eslint/eslint-plugin@npm:^7.0.1":
version: 6.20.0 version: 7.0.1
resolution: "@typescript-eslint/eslint-plugin@npm:6.20.0" resolution: "@typescript-eslint/eslint-plugin@npm:7.0.1"
dependencies: dependencies:
"@eslint-community/regexpp": "npm:^4.5.1" "@eslint-community/regexpp": "npm:^4.5.1"
"@typescript-eslint/scope-manager": "npm:6.20.0" "@typescript-eslint/scope-manager": "npm:7.0.1"
"@typescript-eslint/type-utils": "npm:6.20.0" "@typescript-eslint/type-utils": "npm:7.0.1"
"@typescript-eslint/utils": "npm:6.20.0" "@typescript-eslint/utils": "npm:7.0.1"
"@typescript-eslint/visitor-keys": "npm:6.20.0" "@typescript-eslint/visitor-keys": "npm:7.0.1"
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
graphemer: "npm:^1.4.0" graphemer: "npm:^1.4.0"
ignore: "npm:^5.2.4" ignore: "npm:^5.2.4"
@@ -1729,73 +1729,73 @@ __metadata:
semver: "npm:^7.5.4" semver: "npm:^7.5.4"
ts-api-utils: "npm:^1.0.1" ts-api-utils: "npm:^1.0.1"
peerDependencies: peerDependencies:
"@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha "@typescript-eslint/parser": ^7.0.0
eslint: ^7.0.0 || ^8.0.0 eslint: ^8.56.0
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 10/dee6a2392c831e6ae69611ecc4de06e66a7b16f6bf6d8e3bfd25091eb14d88c9d0bb9c9cd634efcfa318902341f7a459cf48f713d55cb1d610145ca1f52af4d3 checksum: 10/0862e8ec8677fcea794394fc9eab8dba11043c08452722790e0d296d4ee84713180676e1e3135be4203ace7bb73933c94159255cb9190c7bc13bf7f03a361915
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/parser@npm:^6.20.0": "@typescript-eslint/parser@npm:^7.0.1":
version: 6.20.0 version: 7.0.1
resolution: "@typescript-eslint/parser@npm:6.20.0" resolution: "@typescript-eslint/parser@npm:7.0.1"
dependencies: dependencies:
"@typescript-eslint/scope-manager": "npm:6.20.0" "@typescript-eslint/scope-manager": "npm:7.0.1"
"@typescript-eslint/types": "npm:6.20.0" "@typescript-eslint/types": "npm:7.0.1"
"@typescript-eslint/typescript-estree": "npm:6.20.0" "@typescript-eslint/typescript-estree": "npm:7.0.1"
"@typescript-eslint/visitor-keys": "npm:6.20.0" "@typescript-eslint/visitor-keys": "npm:7.0.1"
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^8.56.0
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 10/691062d47cae7977604ede848ffff3689162428a53577f298989f585954aa3a3450e7fd5c2b363d024cd5f16022c163cecf0f1f1d138234bbd78048050b4b8bf checksum: 10/b4ba1743ab730268a1924139f072e4a0a56959526fb6377e1b3964518b6c6851733ae446a44d29fed1cb96669e2913cca524895ce77a6205aaed8bda00e8cd5d
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/scope-manager@npm:6.20.0": "@typescript-eslint/scope-manager@npm:7.0.1":
version: 6.20.0 version: 7.0.1
resolution: "@typescript-eslint/scope-manager@npm:6.20.0" resolution: "@typescript-eslint/scope-manager@npm:7.0.1"
dependencies: dependencies:
"@typescript-eslint/types": "npm:6.20.0" "@typescript-eslint/types": "npm:7.0.1"
"@typescript-eslint/visitor-keys": "npm:6.20.0" "@typescript-eslint/visitor-keys": "npm:7.0.1"
checksum: 10/2c1a644f2931454b34875f2e6dffad52a1fc7b6ac508d7d1ad3cd9da028a7dff9c6191feeea2c9ca691deba199ac9e83cbd0036914be4cd45b6954437f03c09a checksum: 10/dade6055bb853adb54de795cc3da5ab8550236d4186f108573fdb02e636ab7fc4300a55b506698ced4087ca43b143a5593931cb3195ab4790470b456d9ff8846
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/type-utils@npm:6.20.0": "@typescript-eslint/type-utils@npm:7.0.1":
version: 6.20.0 version: 7.0.1
resolution: "@typescript-eslint/type-utils@npm:6.20.0" resolution: "@typescript-eslint/type-utils@npm:7.0.1"
dependencies: dependencies:
"@typescript-eslint/typescript-estree": "npm:6.20.0" "@typescript-eslint/typescript-estree": "npm:7.0.1"
"@typescript-eslint/utils": "npm:6.20.0" "@typescript-eslint/utils": "npm:7.0.1"
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
ts-api-utils: "npm:^1.0.1" ts-api-utils: "npm:^1.0.1"
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^8.56.0
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 10/bc2f2793cfec3463164b5f5ded31b4e169e21c3a1990c1ce4effe70a359c486d92fbbc4cd92758bbf1c30a468ad0839e0fa890bd452c707d0c294cb3a7b14021 checksum: 10/cf20a3c0e56121ac62467e48121e135798db6d2999bd4f96ed44edc39f2597812d12b1bd6a378adec54d6c5e7db75fa5f98a27ce399792a2c8a5bbd3649952f7
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/types@npm:6.20.0": "@typescript-eslint/types@npm:7.0.1":
version: 6.20.0 version: 7.0.1
resolution: "@typescript-eslint/types@npm:6.20.0" resolution: "@typescript-eslint/types@npm:7.0.1"
checksum: 10/74ed1761e27c3c1a29fd260fe51096f42cfb1472b20390d6df6ec41de0420208f379e809de416e81cd7c00fdc3d5550b2391872be56bf4a1b0c595f71db0b1ea checksum: 10/c08b2d34bab2a877a45a1e4c2923f50d03022b682b7aaba929ae2a9a5ad32db0e46265544a6616ccb98654b434250621be0e282fc5b21b8ccaf6b78741d68f67
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/typescript-estree@npm:6.20.0": "@typescript-eslint/typescript-estree@npm:7.0.1":
version: 6.20.0 version: 7.0.1
resolution: "@typescript-eslint/typescript-estree@npm:6.20.0" resolution: "@typescript-eslint/typescript-estree@npm:7.0.1"
dependencies: dependencies:
"@typescript-eslint/types": "npm:6.20.0" "@typescript-eslint/types": "npm:7.0.1"
"@typescript-eslint/visitor-keys": "npm:6.20.0" "@typescript-eslint/visitor-keys": "npm:7.0.1"
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
globby: "npm:^11.1.0" globby: "npm:^11.1.0"
is-glob: "npm:^4.0.3" is-glob: "npm:^4.0.3"
@@ -1805,34 +1805,34 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 10/55b280c6e71c79cb009ac80189a7f0e1aa9011bc7206c810bbb52d9703a894aa2817dfd44d947edf64d62f3aa0962e01f3423fcb21d2f39964a4840287d9e196 checksum: 10/b0b0adc84502d1ffcf3a0024179e0f2780be5f8b0a18328db46d430efc4e38a7965656b4392dd47d6176bbb1ee200aec6dd8581c39b606e260750574358cde9f
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/utils@npm:6.20.0": "@typescript-eslint/utils@npm:7.0.1":
version: 6.20.0 version: 7.0.1
resolution: "@typescript-eslint/utils@npm:6.20.0" resolution: "@typescript-eslint/utils@npm:7.0.1"
dependencies: dependencies:
"@eslint-community/eslint-utils": "npm:^4.4.0" "@eslint-community/eslint-utils": "npm:^4.4.0"
"@types/json-schema": "npm:^7.0.12" "@types/json-schema": "npm:^7.0.12"
"@types/semver": "npm:^7.5.0" "@types/semver": "npm:^7.5.0"
"@typescript-eslint/scope-manager": "npm:6.20.0" "@typescript-eslint/scope-manager": "npm:7.0.1"
"@typescript-eslint/types": "npm:6.20.0" "@typescript-eslint/types": "npm:7.0.1"
"@typescript-eslint/typescript-estree": "npm:6.20.0" "@typescript-eslint/typescript-estree": "npm:7.0.1"
semver: "npm:^7.5.4" semver: "npm:^7.5.4"
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^8.56.0
checksum: 10/6d4604be6123e0073dd5e7dd357c95b370c678572d2e982478d0d6937d4d65f0cad0ac207b8b724f3bce239e64ba1ddd6bece11e1592734d8bf691177e6971e6 checksum: 10/b7e0cb2994f73b3f416684dc175d4e1da5f8306d6c81abbad2f219fa3e4f29154063a3c9568e4a1f879a38b79c62250e596e4ed7265f7bd1ed9b3db806cb92b7
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/visitor-keys@npm:6.20.0": "@typescript-eslint/visitor-keys@npm:7.0.1":
version: 6.20.0 version: 7.0.1
resolution: "@typescript-eslint/visitor-keys@npm:6.20.0" resolution: "@typescript-eslint/visitor-keys@npm:7.0.1"
dependencies: dependencies:
"@typescript-eslint/types": "npm:6.20.0" "@typescript-eslint/types": "npm:7.0.1"
eslint-visitor-keys: "npm:^3.4.1" eslint-visitor-keys: "npm:^3.4.1"
checksum: 10/df066c73f3880ad78880c442f307e58f026e6047d9caab9d7c356d13276f4fe466fab3e8d19cdb1e6749e87639cb7c4babcfe118f554fcd2d3929ce9f4983216 checksum: 10/915c5b19302a4c76e843cd2d04a9a2b11907e658d7018c8b55c338b090d9115d3719809aa05b8af130cc1b216c77626d210c20f705b732e83d04ceae0c112f6b
languageName: node languageName: node
linkType: hard linkType: hard
@@ -1851,25 +1851,23 @@ __metadata:
"@babel/core": "npm:^7.23.9" "@babel/core": "npm:^7.23.9"
"@emotion/react": "npm:^11.11.3" "@emotion/react": "npm:^11.11.3"
"@emotion/styled": "npm:^11.11.0" "@emotion/styled": "npm:^11.11.0"
"@mui/icons-material": "npm:^5.15.7" "@mui/icons-material": "npm:^5.15.10"
"@mui/material": "npm:^5.15.7" "@mui/material": "npm:^5.15.10"
"@preact/compat": "npm:^17.1.2" "@preact/compat": "npm:^17.1.2"
"@preact/preset-vite": "npm:^2.8.1" "@preact/preset-vite": "npm:^2.8.1"
"@table-library/react-table-library": "npm:4.1.7" "@table-library/react-table-library": "npm:4.1.7"
"@types/imagemin": "npm:^8.0.5" "@types/imagemin": "npm:^8.0.5"
"@types/lodash-es": "npm:^4.17.12" "@types/lodash-es": "npm:^4.17.12"
"@types/node": "npm:^20.11.16" "@types/node": "npm:^20.11.17"
"@types/react": "npm:^18.2.52" "@types/react": "npm:^18.2.55"
"@types/react-dom": "npm:^18.2.18" "@types/react-dom": "npm:^18.2.19"
"@types/react-router-dom": "npm:^5.3.3" "@types/react-router-dom": "npm:^5.3.3"
"@typescript-eslint/eslint-plugin": "npm:^6.20.0" "@typescript-eslint/eslint-plugin": "npm:^7.0.1"
"@typescript-eslint/parser": "npm:^6.20.0" "@typescript-eslint/parser": "npm:^7.0.1"
alova: "npm:^2.17.0" alova: "npm:^2.17.0"
async-validator: "npm:^4.2.5" async-validator: "npm:^4.2.5"
concurrently: "npm:^8.2.2" concurrently: "npm:^8.2.2"
eslint: "npm:^8.56.0" eslint: "npm:^8.56.0"
eslint-config-airbnb: "npm:^19.0.4"
eslint-config-airbnb-typescript: "npm:^17.1.0"
eslint-config-prettier: "npm:^9.1.0" eslint-config-prettier: "npm:^9.1.0"
eslint-import-resolver-typescript: "npm:^3.6.1" eslint-import-resolver-typescript: "npm:^3.6.1"
eslint-plugin-autofix: "npm:^1.1.0" eslint-plugin-autofix: "npm:^1.1.0"
@@ -1882,7 +1880,7 @@ __metadata:
jwt-decode: "npm:^4.0.0" jwt-decode: "npm:^4.0.0"
lodash-es: "npm:^4.17.21" lodash-es: "npm:^4.17.21"
mime-types: "npm:^2.1.35" mime-types: "npm:^2.1.35"
preact: "npm:^10.19.3" preact: "npm:^10.19.4"
prettier: "npm:^3.2.5" prettier: "npm:^3.2.5"
react: "npm:latest" react: "npm:latest"
react-dom: "npm:latest" react-dom: "npm:latest"
@@ -1895,7 +1893,7 @@ __metadata:
terser: "npm:^5.27.0" terser: "npm:^5.27.0"
typesafe-i18n: "npm:^5.26.2" typesafe-i18n: "npm:^5.26.2"
typescript: "npm:^5.3.3" typescript: "npm:^5.3.3"
vite: "npm:^5.0.12" vite: "npm:^5.1.1"
vite-plugin-imagemin: "npm:^0.6.1" vite-plugin-imagemin: "npm:^0.6.1"
vite-tsconfig-paths: "npm:^4.3.1" vite-tsconfig-paths: "npm:^4.3.1"
languageName: unknown languageName: unknown
@@ -2738,13 +2736,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"confusing-browser-globals@npm:^1.0.10":
version: 1.0.11
resolution: "confusing-browser-globals@npm:1.0.11"
checksum: 10/3afc635abd37e566477f610e7978b15753f0e84025c25d49236f1f14d480117185516bdd40d2a2167e6bed8048641a9854964b9c067e3dcdfa6b5d0ad3c3a5ef
languageName: node
linkType: hard
"console-control-strings@npm:^1.1.0": "console-control-strings@npm:^1.1.0":
version: 1.1.0 version: 1.1.0
resolution: "console-control-strings@npm:1.1.0" resolution: "console-control-strings@npm:1.1.0"
@@ -2889,13 +2880,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"csstype@npm:^3.0.2, csstype@npm:^3.1.2": "csstype@npm:^3.0.2":
version: 3.1.2 version: 3.1.2
resolution: "csstype@npm:3.1.2" resolution: "csstype@npm:3.1.2"
checksum: 10/1f39c541e9acd9562996d88bc9fb62d1cb234786ef11ed275567d4b2bd82e1ceacde25debc8de3d3b4871ae02c2933fa02614004c97190711caebad6347debc2 checksum: 10/1f39c541e9acd9562996d88bc9fb62d1cb234786ef11ed275567d4b2bd82e1ceacde25debc8de3d3b4871ae02c2933fa02614004c97190711caebad6347debc2
languageName: node languageName: node
linkType: hard linkType: hard
"csstype@npm:^3.1.3":
version: 3.1.3
resolution: "csstype@npm:3.1.3"
checksum: 10/f593cce41ff5ade23f44e77521e3a1bcc2c64107041e1bf6c3c32adc5187d0d60983292fda326154d20b01079e24931aa5b08e4467cc488b60bb1e7f6d478ade
languageName: node
linkType: hard
"currently-unhandled@npm:^0.4.1": "currently-unhandled@npm:^0.4.1":
version: 0.4.1 version: 0.4.1
resolution: "currently-unhandled@npm:0.4.1" resolution: "currently-unhandled@npm:0.4.1"
@@ -3783,52 +3781,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint-config-airbnb-base@npm:^15.0.0":
version: 15.0.0
resolution: "eslint-config-airbnb-base@npm:15.0.0"
dependencies:
confusing-browser-globals: "npm:^1.0.10"
object.assign: "npm:^4.1.2"
object.entries: "npm:^1.1.5"
semver: "npm:^6.3.0"
peerDependencies:
eslint: ^7.32.0 || ^8.2.0
eslint-plugin-import: ^2.25.2
checksum: 10/daa68a1dcb7bff338747a952723b5fa9d159980ec3554c395a4b52a7f7d4f00a45e7b465420eb6d4d87a82cef6361e4cfd6dbb38c2f3f52f2140b6cf13654803
languageName: node
linkType: hard
"eslint-config-airbnb-typescript@npm:^17.1.0":
version: 17.1.0
resolution: "eslint-config-airbnb-typescript@npm:17.1.0"
dependencies:
eslint-config-airbnb-base: "npm:^15.0.0"
peerDependencies:
"@typescript-eslint/eslint-plugin": ^5.13.0 || ^6.0.0
"@typescript-eslint/parser": ^5.0.0 || ^6.0.0
eslint: ^7.32.0 || ^8.2.0
eslint-plugin-import: ^2.25.3
checksum: 10/a2238d820909ac005704e04d29ed495cebbe024869c488330273ea108e18cbf74b6b13e09d54d22a598fe793b9ed5ae593a7e8f9bdc6ea17614d5f2add340960
languageName: node
linkType: hard
"eslint-config-airbnb@npm:^19.0.4":
version: 19.0.4
resolution: "eslint-config-airbnb@npm:19.0.4"
dependencies:
eslint-config-airbnb-base: "npm:^15.0.0"
object.assign: "npm:^4.1.2"
object.entries: "npm:^1.1.5"
peerDependencies:
eslint: ^7.32.0 || ^8.2.0
eslint-plugin-import: ^2.25.3
eslint-plugin-jsx-a11y: ^6.5.1
eslint-plugin-react: ^7.28.0
eslint-plugin-react-hooks: ^4.3.0
checksum: 10/f2086523cfd20c42fd620c757281bd028aa8ce9dadc7293c5c23ea60947a2d3ca04404ede77b40f5a65250fe3c04502acafc4f2f6946819fe6c257d76d9644e5
languageName: node
linkType: hard
"eslint-config-prettier@npm:^9.1.0": "eslint-config-prettier@npm:^9.1.0":
version: 9.1.0 version: 9.1.0
resolution: "eslint-config-prettier@npm:9.1.0" resolution: "eslint-config-prettier@npm:9.1.0"
@@ -6596,7 +6548,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": "object.assign@npm:^4.1.4":
version: 4.1.4 version: 4.1.4
resolution: "object.assign@npm:4.1.4" resolution: "object.assign@npm:4.1.4"
dependencies: dependencies:
@@ -6608,7 +6560,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"object.entries@npm:^1.1.5, object.entries@npm:^1.1.6, object.entries@npm:^1.1.7": "object.entries@npm:^1.1.6, object.entries@npm:^1.1.7":
version: 1.1.7 version: 1.1.7
resolution: "object.entries@npm:1.1.7" resolution: "object.entries@npm:1.1.7"
dependencies: dependencies:
@@ -7058,21 +7010,21 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"postcss@npm:^8.4.32": "postcss@npm:^8.4.35":
version: 8.4.32 version: 8.4.35
resolution: "postcss@npm:8.4.32" resolution: "postcss@npm:8.4.35"
dependencies: dependencies:
nanoid: "npm:^3.3.7" nanoid: "npm:^3.3.7"
picocolors: "npm:^1.0.0" picocolors: "npm:^1.0.0"
source-map-js: "npm:^1.0.2" source-map-js: "npm:^1.0.2"
checksum: 10/28084864122f29148e1f632261c408444f5ead0e0b9ea9bd9729d0468818ebe73fe5dc0075acd50c1365dbe639b46a79cba27d355ec857723a24bc9af0f18525 checksum: 10/93a7ce50cd6188f5f486a9ca98950ad27c19dfed996c45c414fa242944497e4d084a8760d3537f078630226f2bd3c6ab84b813b488740f4432e7c7039cd73a20
languageName: node languageName: node
linkType: hard linkType: hard
"preact@npm:^10.19.3": "preact@npm:^10.19.4":
version: 10.19.3 version: 10.19.4
resolution: "preact@npm:10.19.3" resolution: "preact@npm:10.19.4"
checksum: 10/16478272162a986f03bbde7bb681103339dd00bfe0a6dffe78f9124f3999586647a31e9cb2324ae59ca51eb7d8dd5659eef6df0f7a5f424107cd9f99dddb08e8 checksum: 10/e79051c08d61c6723a4535606c9136ea752f8bae984ae8056039e2a56f6d58d6200aa941850478dc822dca38c16469d23368e9f75d7a7e57f9ca4df70a305d0f
languageName: node languageName: node
linkType: hard linkType: hard
@@ -7732,7 +7684,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": "semver@npm:^6.0.0, semver@npm:^6.3.1":
version: 6.3.1 version: 6.3.1
resolution: "semver@npm:6.3.1" resolution: "semver@npm:6.3.1"
bin: bin:
@@ -8786,13 +8738,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"vite@npm:^5.0.12": "vite@npm:^5.1.1":
version: 5.0.12 version: 5.1.1
resolution: "vite@npm:5.0.12" resolution: "vite@npm:5.1.1"
dependencies: dependencies:
esbuild: "npm:^0.19.3" esbuild: "npm:^0.19.3"
fsevents: "npm:~2.3.3" fsevents: "npm:~2.3.3"
postcss: "npm:^8.4.32" postcss: "npm:^8.4.35"
rollup: "npm:^4.2.0" rollup: "npm:^4.2.0"
peerDependencies: peerDependencies:
"@types/node": ^18.0.0 || >=20.0.0 "@types/node": ^18.0.0 || >=20.0.0
@@ -8822,7 +8774,7 @@ __metadata:
optional: true optional: true
bin: bin:
vite: bin/vite.js vite: bin/vite.js
checksum: 10/ed0bb26a0d0c8e1dae0b70af9e36adffd7e15d80297443fe4da762596dc81570bad7f0291f590a57c1553f5e435338d8c7ffc483bd9431a95c09d9ac90665fad checksum: 10/bdb8e683caddaa0a9adcbf40144ca8ea3660836b208862b07d43787ea867845919af16e58745365bd13ed3b7f66bbf9788a6869ee22cfaacac01645b59729c34
languageName: node languageName: node
linkType: hard linkType: hard

0
lib/ArduinoJson/ArduinoJson.h Normal file → Executable file
View File

7
lib/ArduinoJson/CHANGELOG.md Normal file → Executable file
View File

@@ -1,6 +1,13 @@
ArduinoJson: change log ArduinoJson: change log
======================= =======================
v7.0.3 (2024-02-05)
------
* Improve error messages when using `char` or `char*` (issue #2043)
* Reduce stack consumption (issue #2046)
* Fix compatibility with GCC 4.8 (issue #2045)
v7.0.2 (2024-01-19) v7.0.2 (2024-01-19)
------ ------

View File

@@ -1,25 +0,0 @@
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2024, Benoit BLANCHON
# MIT License
cmake_minimum_required(VERSION 3.15)
if(ESP_PLATFORM)
# Build ArduinoJson as an ESP-IDF component
idf_component_register(INCLUDE_DIRS src)
return()
endif()
project(ArduinoJson VERSION 7.0.2)
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
include(CTest)
endif()
add_subdirectory(src)
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING)
include(extras/CompileOptions.cmake)
add_subdirectory(extras/tests)
add_subdirectory(extras/fuzzing)
endif()

0
lib/ArduinoJson/LICENSE.txt Normal file → Executable file
View File

155
lib/ArduinoJson/README.md Executable file
View File

@@ -0,0 +1,155 @@
<p align="center">
<a href="https://arduinojson.org/"><img alt="ArduinoJson" src="https://arduinojson.org/images/logo.svg" width="200" /></a>
</p>
---
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/bblanchon/ArduinoJson/ci.yml?branch=7.x&logo=github)](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A7.x)
[![Continuous Integration](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/7.x?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/7.x)
[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/arduinojson.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson)
[![Coveralls branch](https://img.shields.io/coveralls/github/bblanchon/ArduinoJson/7.x?logo=coveralls)](https://coveralls.io/github/bblanchon/ArduinoJson?branch=7.x)
[![GitHub stars](https://img.shields.io/github/stars/bblanchon/ArduinoJson?style=flat&logo=github&color=orange)](https://github.com/bblanchon/ArduinoJson/stargazers)
[![GitHub Sponsors](https://img.shields.io/github/sponsors/bblanchon?logo=github&color=orange)](https://github.com/sponsors/bblanchon)
ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things).
## Features
* [JSON deserialization](https://arduinojson.org/v7/api/json/deserializejson/)
* [Optionally decodes UTF-16 escape sequences to UTF-8](https://arduinojson.org/v7/api/config/decode_unicode/)
* [Optionally supports comments in the input](https://arduinojson.org/v7/api/config/enable_comments/)
* [Optionally filters the input to keep only desired values](https://arduinojson.org/v7/api/json/deserializejson/#filtering)
* Supports single quotes as a string delimiter
* Compatible with [NDJSON](http://ndjson.org/) and [JSON Lines](https://jsonlines.org/)
* [JSON serialization](https://arduinojson.org/v7/api/json/serializejson/)
* [Can write to a buffer or a stream](https://arduinojson.org/v7/api/json/serializejson/)
* [Optionally indents the document (prettified JSON)](https://arduinojson.org/v7/api/json/serializejsonpretty/)
* [MessagePack serialization](https://arduinojson.org/v7/api/msgpack/serializemsgpack/)
* [MessagePack deserialization](https://arduinojson.org/v7/api/msgpack/deserializemsgpack/)
* Efficient
* [Twice smaller than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/)
* [Almost 10% faster than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/)
* [Consumes roughly 10% less RAM than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/)
* [Deduplicates strings](https://arduinojson.org/news/2020/08/01/version-6-16-0/)
* Versatile
* Supports [custom allocators (to use external RAM chip, for example)](https://arduinojson.org/v7/how-to/use-external-ram-on-esp32/)
* Supports [`String`](https://arduinojson.org/v7/api/config/enable_arduino_string/), [`std::string`](https://arduinojson.org/v7/api/config/enable_std_string/), and [`std::string_view`](https://arduinojson.org/v7/api/config/enable_string_view/)
* Supports [`Stream`](https://arduinojson.org/v7/api/config/enable_arduino_stream/) and [`std::istream`/`std::ostream`](https://arduinojson.org/v7/api/config/enable_std_stream/)
* Supports [Flash strings](https://arduinojson.org/v7/api/config/enable_progmem/)
* Supports [custom readers](https://arduinojson.org/v7/api/json/deserializejson/#custom-reader) and [custom writers](https://arduinojson.org/v7/api/json/serializejson/#custom-writer)
* Supports [custom converters](https://arduinojson.org/news/2021/05/04/version-6-18-0/)
* Portable
* Usable on any C++ project (not limited to Arduino)
* Compatible with C++11, C++14 and C++17
* Support for C++98/C++03 available on [ArduinoJson 6.20.x](https://github.com/bblanchon/ArduinoJson/tree/6.20.x)
* Zero warnings with `-Wall -Wextra -pedantic` and `/W4`
* [Header-only library](https://en.wikipedia.org/wiki/Header-only)
* Works with virtually any board
* Arduino boards: [Uno](https://amzn.to/38aL2ik), [Due](https://amzn.to/36YkWi2), [Micro](https://amzn.to/35WkdwG), [Nano](https://amzn.to/2QTvwRX), [Mega](https://amzn.to/36XWhuf), [Yun](https://amzn.to/30odURc), [Leonardo](https://amzn.to/36XWjlR)...
* Espressif chips: [ESP8266](https://amzn.to/36YluV8), [ESP32](https://amzn.to/2G4pRCB)
* Lolin (WeMos) boards: [D1 mini](https://amzn.to/2QUpz7q), [D1 Mini Pro](https://amzn.to/36UsGSs)...
* Teensy boards: [4.0](https://amzn.to/30ljXGq), [3.2](https://amzn.to/2FT0EuC), [2.0](https://amzn.to/2QXUMXj)
* Particle boards: [Argon](https://amzn.to/2FQHa9X), [Boron](https://amzn.to/36WgLUd), [Electron](https://amzn.to/30vEc4k), [Photon](https://amzn.to/387F9Cd)...
* Texas Instruments boards: [MSP430](https://amzn.to/30nJWgg)...
* Soft cores: [Nios II](https://en.wikipedia.org/wiki/Nios_II)...
* Tested on all major development environments
* [Arduino IDE](https://www.arduino.cc/en/Main/Software)
* [Atmel Studio](http://www.atmel.com/microsite/atmel-studio/)
* [Atollic TrueSTUDIO](https://atollic.com/truestudio/)
* [Energia](http://energia.nu/)
* [IAR Embedded Workbench](https://www.iar.com/iar-embedded-workbench/)
* [Keil uVision](http://www.keil.com/)
* [MPLAB X IDE](http://www.microchip.com/mplab/mplab-x-ide)
* [Particle](https://www.particle.io/)
* [PlatformIO](http://platformio.org/)
* [Sloeber plugin for Eclipse](https://eclipse.baeyens.it/)
* [Visual Micro](http://www.visualmicro.com/)
* [Visual Studio](https://www.visualstudio.com/)
* [Even works with online compilers like wandbox.org](https://wandbox.org/permlink/RlZSKy17DjJ6HcdN)
* [CMake friendly](https://arduinojson.org/v7/how-to/use-arduinojson-with-cmake/)
* Well designed
* [Elegant API](http://arduinojson.org/v7/example/)
* [Thread-safe](https://en.wikipedia.org/wiki/Thread_safety)
* Self-contained (no external dependency)
* `const` friendly
* [`for` friendly](https://arduinojson.org/v7/api/jsonobject/begin_end/)
* [TMP friendly](https://en.wikipedia.org/wiki/Template_metaprogramming)
* Handles [integer overflows](https://arduinojson.org/v7/api/jsonvariant/as/#integer-overflows)
* Well tested
* [Unit test coverage close to 100%](https://coveralls.io/github/bblanchon/ArduinoJson?branch=7.x)
* Continuously tested on
* [Visual Studio 2017, 2019, 2022](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/7.x)
* [GCC 4.8, 5, 6, 7, 8, 9, 10, 11, 12](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22)
* [Clang 3.9, 4.0, 5.0, 6.0, 7, 8, 9, 10, 11, 12, 13, 14, 15](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22)
* [Continuously fuzzed with Google OSS Fuzz](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson)
* Passes all default checks of [clang-tidy](https://releases.llvm.org/10.0.0/tools/clang/tools/extra/docs/clang-tidy/)
* Well documented
* [Tutorials](https://arduinojson.org/v7/doc/deserialization/)
* [Examples](https://arduinojson.org/v7/example/)
* [How-tos](https://arduinojson.org/v7/example/)
* [FAQ](https://arduinojson.org/v7/faq/)
* [Troubleshooter](https://arduinojson.org/v7/troubleshooter/)
* [Book](https://arduinojson.org/book/)
* [Changelog](CHANGELOG.md)
* Vibrant user community
* Most popular of all Arduino libraries on [GitHub](https://github.com/search?o=desc&q=arduino+library&s=stars&type=Repositories)
* [Used in hundreds of projects](https://www.hackster.io/search?i=projects&q=arduinojson)
* [Responsive support](https://github.com/bblanchon/ArduinoJson/issues?q=is%3Aissue+is%3Aclosed)
## Quickstart
### Deserialization
Here is a program that parses a JSON document with ArduinoJson.
```c++
const char* json = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
JsonDocument doc;
deserializeJson(doc, json);
const char* sensor = doc["sensor"];
long time = doc["time"];
double latitude = doc["data"][0];
double longitude = doc["data"][1];
```
See the [tutorial on arduinojson.org](https://arduinojson.org/v7/doc/deserialization/)
### Serialization
Here is a program that generates a JSON document with ArduinoJson:
```c++
JsonDocument doc;
doc["sensor"] = "gps";
doc["time"] = 1351824120;
doc["data"][0] = 48.756080;
doc["data"][1] = 2.302038;
serializeJson(doc, Serial);
// This prints:
// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
```
See the [tutorial on arduinojson.org](https://arduinojson.org/v7/doc/serialization/)
## Sponsors
ArduinoJson is thankful to its sponsors. Please give them a visit; they deserve it!
<p>
<a href="https://www.programmingelectronics.com/" rel="sponsored">
<img src="https://arduinojson.org/images/2021/10/programmingeleactronicsacademy.png" alt="Programming Electronics Academy" width="200">
</a>
</p>
<p>
<a href="https://github.com/1technophile" rel="sponsored">
<img alt="1technophile" src="https://avatars.githubusercontent.com/u/12672732?s=40&v=4">
</a>
</p>
If you run a commercial project that embeds ArduinoJson, think about [sponsoring the library's development](https://github.com/sponsors/bblanchon): it ensures the code that your products rely on stays actively maintained. It can also give your project some exposure to the makers' community.
If you are an individual user and want to support the development (or give a sign of appreciation), consider purchasing the book [Mastering ArduinoJson](https://arduinojson.org/book/)&nbsp;❤, or simply [cast a star](https://github.com/bblanchon/ArduinoJson/stargazers)&nbsp;⭐.

27
lib/ArduinoJson/SUPPORT.md Executable file
View File

@@ -0,0 +1,27 @@
# ArduinoJson Support
First off, thank you very much for using ArduinoJson.
We'll be very happy to help you, but first please read the following.
## Before asking for help
1. Read the [FAQ](https://arduinojson.org/faq/?utm_source=github&utm_medium=support)
2. Search in the [API Reference](https://arduinojson.org/api/?utm_source=github&utm_medium=support)
If you did not find the answer, please create a [new issue on GitHub](https://github.com/bblanchon/ArduinoJson/issues/new).
It is OK to add a comment to a currently opened issue, but please avoid adding comments to a closed issue.
## Before hitting the Submit button
Please provide all the relevant information:
* Good title
* Short description of the problem
* Target platform
* Compiler model and version
* [MVCE](https://stackoverflow.com/help/mcve)
* Compiler output
Good questions get fast answers!

View File

@@ -1,13 +0,0 @@
version: "7.0.2"
description: >-
A simple and efficient JSON library for embedded C++.
⭐ 6444 stars on GitHub!
Supports serialization, deserialization, MessagePack, streams, filtering, and more.
Fully tested and documented.
url: https://arduinojson.org/
files:
exclude:
- "**/.vs/**/*"
- ".devcontainer/**/*"
- "examples/**/*"
- "extras/**/*"

View File

@@ -1,23 +0,0 @@
{
"name": "ArduinoJson",
"keywords": "json, rest, http, web",
"description": "A simple and efficient JSON library for embedded C++. ⭐ 6444 stars on GitHub! Supports serialization, deserialization, MessagePack, streams, filtering, and more. Fully tested and documented.",
"homepage": "https://arduinojson.org/?utm_source=meta&utm_medium=library.json",
"repository": {
"type": "git",
"url": "https://github.com/bblanchon/ArduinoJson.git"
},
"version": "7.0.2",
"authors": {
"name": "Benoit Blanchon",
"url": "https://blog.benoitblanchon.fr"
},
"export": {
"include": ["src", "examples", "LICENSE.txt", "ArduinoJson.h"]
},
"frameworks": "*",
"platforms": "*",
"build": {
"libArchive": false
}
}

View File

@@ -1,11 +0,0 @@
name=ArduinoJson
version=7.0.2
author=Benoit Blanchon <blog.benoitblanchon.fr>
maintainer=Benoit Blanchon <blog.benoitblanchon.fr>
sentence=A simple and efficient JSON library for embedded C++.
paragraph=⭐ 6444 stars on GitHub! Supports serialization, deserialization, MessagePack, streams, filtering, and more. Fully tested and documented.
category=Data Processing
url=https://arduinojson.org/?utm_source=meta&utm_medium=library.properties
architectures=*
repository=https://github.com/bblanchon/ArduinoJson.git
license=MIT

0
lib/ArduinoJson/src/ArduinoJson.h Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Array/ArrayData.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Array/ArrayImpl.hpp Normal file → Executable file
View File

10
lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp Normal file → Executable file
View File

@@ -22,25 +22,25 @@ class ElementProxy : public VariantRefBase<ElementProxy<TUpstream>>,
ElementProxy(const ElementProxy& src) ElementProxy(const ElementProxy& src)
: upstream_(src.upstream_), index_(src.index_) {} : upstream_(src.upstream_), index_(src.index_) {}
FORCE_INLINE ElementProxy& operator=(const ElementProxy& src) { ElementProxy& operator=(const ElementProxy& src) {
this->set(src); this->set(src);
return *this; return *this;
} }
template <typename T> template <typename T>
FORCE_INLINE ElementProxy& operator=(const T& src) { ElementProxy& operator=(const T& src) {
this->set(src); this->set(src);
return *this; return *this;
} }
template <typename T> template <typename T>
FORCE_INLINE ElementProxy& operator=(T* src) { ElementProxy& operator=(T* src) {
this->set(src); this->set(src);
return *this; return *this;
} }
private: private:
FORCE_INLINE ResourceManager* getResourceManager() const { ResourceManager* getResourceManager() const {
return VariantAttorney::getResourceManager(upstream_); return VariantAttorney::getResourceManager(upstream_);
} }
@@ -50,7 +50,7 @@ class ElementProxy : public VariantRefBase<ElementProxy<TUpstream>>,
VariantAttorney::getResourceManager(upstream_)); VariantAttorney::getResourceManager(upstream_));
} }
FORCE_INLINE VariantData* getOrCreateData() const { VariantData* getOrCreateData() const {
auto data = VariantAttorney::getOrCreateData(upstream_); auto data = VariantAttorney::getOrCreateData(upstream_);
if (!data) if (!data)
return nullptr; return nullptr;

29
lib/ArduinoJson/src/ArduinoJson/Array/JsonArray.hpp Normal file → Executable file
View File

@@ -20,11 +20,10 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
typedef JsonArrayIterator iterator; typedef JsonArrayIterator iterator;
// Constructs an unbound reference. // Constructs an unbound reference.
FORCE_INLINE JsonArray() : data_(0), resources_(0) {} JsonArray() : data_(0), resources_(0) {}
// INTERNAL USE ONLY // INTERNAL USE ONLY
FORCE_INLINE JsonArray(detail::ArrayData* data, JsonArray(detail::ArrayData* data, detail::ResourceManager* resources)
detail::ResourceManager* resources)
: data_(data), resources_(resources) {} : data_(data), resources_(resources) {}
// Returns a JsonVariant pointing to the array. // Returns a JsonVariant pointing to the array.
@@ -63,20 +62,20 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// Appends a value to the array. // Appends a value to the array.
// https://arduinojson.org/v7/api/jsonarray/add/ // https://arduinojson.org/v7/api/jsonarray/add/
template <typename T> template <typename T>
FORCE_INLINE bool add(const T& value) const { bool add(const T& value) const {
return add<JsonVariant>().set(value); return add<JsonVariant>().set(value);
} }
// Appends a value to the array. // Appends a value to the array.
// https://arduinojson.org/v7/api/jsonarray/add/ // https://arduinojson.org/v7/api/jsonarray/add/
template <typename T> template <typename T>
FORCE_INLINE bool add(T* value) const { bool add(T* value) const {
return add<JsonVariant>().set(value); return add<JsonVariant>().set(value);
} }
// Returns an iterator to the first element of the array. // Returns an iterator to the first element of the array.
// https://arduinojson.org/v7/api/jsonarray/begin/ // https://arduinojson.org/v7/api/jsonarray/begin/
FORCE_INLINE iterator begin() const { iterator begin() const {
if (!data_) if (!data_)
return iterator(); return iterator();
return iterator(data_->createIterator(resources_), resources_); return iterator(data_->createIterator(resources_), resources_);
@@ -84,13 +83,13 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// Returns an iterator following the last element of the array. // Returns an iterator following the last element of the array.
// https://arduinojson.org/v7/api/jsonarray/end/ // https://arduinojson.org/v7/api/jsonarray/end/
FORCE_INLINE iterator end() const { iterator end() const {
return iterator(); return iterator();
} }
// Copies an array. // Copies an array.
// https://arduinojson.org/v7/api/jsonarray/set/ // https://arduinojson.org/v7/api/jsonarray/set/
FORCE_INLINE bool set(JsonArrayConst src) const { bool set(JsonArrayConst src) const {
if (!data_) if (!data_)
return false; return false;
@@ -105,13 +104,13 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// Removes the element at the specified iterator. // Removes the element at the specified iterator.
// https://arduinojson.org/v7/api/jsonarray/remove/ // https://arduinojson.org/v7/api/jsonarray/remove/
FORCE_INLINE void remove(iterator it) const { void remove(iterator it) const {
detail::ArrayData::remove(data_, it.iterator_, resources_); detail::ArrayData::remove(data_, it.iterator_, resources_);
} }
// Removes the element at the specified index. // Removes the element at the specified index.
// https://arduinojson.org/v7/api/jsonarray/remove/ // https://arduinojson.org/v7/api/jsonarray/remove/
FORCE_INLINE void remove(size_t index) const { void remove(size_t index) const {
detail::ArrayData::removeElement(data_, index, resources_); detail::ArrayData::removeElement(data_, index, resources_);
} }
@@ -123,7 +122,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// Gets or sets the element at the specified index. // Gets or sets the element at the specified index.
// https://arduinojson.org/v7/api/jsonarray/subscript/ // https://arduinojson.org/v7/api/jsonarray/subscript/
FORCE_INLINE detail::ElementProxy<JsonArray> operator[](size_t index) const { detail::ElementProxy<JsonArray> operator[](size_t index) const {
return {*this, index}; return {*this, index};
} }
@@ -133,25 +132,25 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// Returns true if the reference is unbound. // Returns true if the reference is unbound.
// https://arduinojson.org/v7/api/jsonarray/isnull/ // https://arduinojson.org/v7/api/jsonarray/isnull/
FORCE_INLINE bool isNull() const { bool isNull() const {
return data_ == 0; return data_ == 0;
} }
// Returns true if the reference is bound. // Returns true if the reference is bound.
// https://arduinojson.org/v7/api/jsonarray/isnull/ // https://arduinojson.org/v7/api/jsonarray/isnull/
FORCE_INLINE operator bool() const { operator bool() const {
return data_ != 0; return data_ != 0;
} }
// Returns the depth (nesting level) of the array. // Returns the depth (nesting level) of the array.
// https://arduinojson.org/v7/api/jsonarray/nesting/ // https://arduinojson.org/v7/api/jsonarray/nesting/
FORCE_INLINE size_t nesting() const { size_t nesting() const {
return detail::VariantData::nesting(collectionToVariant(data_), resources_); return detail::VariantData::nesting(collectionToVariant(data_), resources_);
} }
// Returns the number of elements in the array. // Returns the number of elements in the array.
// https://arduinojson.org/v7/api/jsonarray/size/ // https://arduinojson.org/v7/api/jsonarray/size/
FORCE_INLINE size_t size() const { size_t size() const {
return data_ ? data_->size(resources_) : 0; return data_ ? data_->size(resources_) : 0;
} }

View File

@@ -23,7 +23,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
// Returns an iterator to the first element of the array. // Returns an iterator to the first element of the array.
// https://arduinojson.org/v7/api/jsonarrayconst/begin/ // https://arduinojson.org/v7/api/jsonarrayconst/begin/
FORCE_INLINE iterator begin() const { iterator begin() const {
if (!data_) if (!data_)
return iterator(); return iterator();
return iterator(data_->createIterator(resources_), resources_); return iterator(data_->createIterator(resources_), resources_);
@@ -31,21 +31,21 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
// Returns an iterator to the element following the last element of the array. // Returns an iterator to the element following the last element of the array.
// https://arduinojson.org/v7/api/jsonarrayconst/end/ // https://arduinojson.org/v7/api/jsonarrayconst/end/
FORCE_INLINE iterator end() const { iterator end() const {
return iterator(); return iterator();
} }
// Creates an unbound reference. // Creates an unbound reference.
FORCE_INLINE JsonArrayConst() : data_(0) {} JsonArrayConst() : data_(0) {}
// INTERNAL USE ONLY // INTERNAL USE ONLY
FORCE_INLINE JsonArrayConst(const detail::ArrayData* data, JsonArrayConst(const detail::ArrayData* data,
const detail::ResourceManager* resources) const detail::ResourceManager* resources)
: data_(data), resources_(resources) {} : data_(data), resources_(resources) {}
// Returns the element at the specified index. // Returns the element at the specified index.
// https://arduinojson.org/v7/api/jsonarrayconst/subscript/ // https://arduinojson.org/v7/api/jsonarrayconst/subscript/
FORCE_INLINE JsonVariantConst operator[](size_t index) const { JsonVariantConst operator[](size_t index) const {
return JsonVariantConst( return JsonVariantConst(
detail::ArrayData::getElement(data_, index, resources_), resources_); detail::ArrayData::getElement(data_, index, resources_), resources_);
} }
@@ -56,25 +56,25 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
// Returns true if the reference is unbound. // Returns true if the reference is unbound.
// https://arduinojson.org/v7/api/jsonarrayconst/isnull/ // https://arduinojson.org/v7/api/jsonarrayconst/isnull/
FORCE_INLINE bool isNull() const { bool isNull() const {
return data_ == 0; return data_ == 0;
} }
// Returns true if the reference is bound. // Returns true if the reference is bound.
// https://arduinojson.org/v7/api/jsonarrayconst/isnull/ // https://arduinojson.org/v7/api/jsonarrayconst/isnull/
FORCE_INLINE operator bool() const { operator bool() const {
return data_ != 0; return data_ != 0;
} }
// Returns the depth (nesting level) of the array. // Returns the depth (nesting level) of the array.
// https://arduinojson.org/v7/api/jsonarrayconst/nesting/ // https://arduinojson.org/v7/api/jsonarrayconst/nesting/
FORCE_INLINE size_t nesting() const { size_t nesting() const {
return detail::VariantData::nesting(getData(), resources_); return detail::VariantData::nesting(getData(), resources_);
} }
// Returns the number of elements in the array. // Returns the number of elements in the array.
// https://arduinojson.org/v7/api/jsonarrayconst/size/ // https://arduinojson.org/v7/api/jsonarrayconst/size/
FORCE_INLINE size_t size() const { size_t size() const {
return data_ ? data_->size(resources_) : 0; return data_ ? data_->size(resources_) : 0;
} }

View File

0
lib/ArduinoJson/src/ArduinoJson/Array/Utilities.hpp Normal file → Executable file
View File

View File

@@ -107,6 +107,10 @@ class CollectionData {
return collection->remove(it, resources); return collection->remove(it, resources);
} }
SlotId head() const {
return head_;
}
protected: protected:
iterator addSlot(ResourceManager*); iterator addSlot(ResourceManager*);

View File

0
lib/ArduinoJson/src/ArduinoJson/Configuration.hpp Normal file → Executable file
View File

View File

View File

View File

View File

View File

View File

@@ -30,7 +30,8 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
} }
// Move-constructor // Move-constructor
JsonDocument(JsonDocument&& src) : JsonDocument() { JsonDocument(JsonDocument&& src)
: JsonDocument(detail::DefaultAllocator::instance()) {
swap(*this, src); swap(*this, src);
} }
@@ -169,9 +170,8 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
// Gets or sets a root object's member. // Gets or sets a root object's member.
// https://arduinojson.org/v7/api/jsondocument/subscript/ // https://arduinojson.org/v7/api/jsondocument/subscript/
template <typename TString> template <typename TString>
FORCE_INLINE typename detail::enable_if< typename detail::enable_if<detail::IsString<TString>::value,
detail::IsString<TString>::value, detail::MemberProxy<JsonDocument&, TString>>::type
detail::MemberProxy<JsonDocument&, TString>>::type
operator[](const TString& key) { operator[](const TString& key) {
return {*this, key}; return {*this, key};
} }
@@ -179,9 +179,8 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
// Gets or sets a root object's member. // Gets or sets a root object's member.
// https://arduinojson.org/v7/api/jsondocument/subscript/ // https://arduinojson.org/v7/api/jsondocument/subscript/
template <typename TChar> template <typename TChar>
FORCE_INLINE typename detail::enable_if< typename detail::enable_if<detail::IsString<TChar*>::value,
detail::IsString<TChar*>::value, detail::MemberProxy<JsonDocument&, TChar*>>::type
detail::MemberProxy<JsonDocument&, TChar*>>::type
operator[](TChar* key) { operator[](TChar* key) {
return {*this, key}; return {*this, key};
} }
@@ -189,8 +188,8 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
// Gets a root object's member. // Gets a root object's member.
// https://arduinojson.org/v7/api/jsondocument/subscript/ // https://arduinojson.org/v7/api/jsondocument/subscript/
template <typename TString> template <typename TString>
FORCE_INLINE typename detail::enable_if<detail::IsString<TString>::value, typename detail::enable_if<detail::IsString<TString>::value,
JsonVariantConst>::type JsonVariantConst>::type
operator[](const TString& key) const { operator[](const TString& key) const {
return JsonVariantConst( return JsonVariantConst(
data_.getMember(detail::adaptString(key), &resources_), &resources_); data_.getMember(detail::adaptString(key), &resources_), &resources_);
@@ -199,8 +198,8 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
// Gets a root object's member. // Gets a root object's member.
// https://arduinojson.org/v7/api/jsondocument/subscript/ // https://arduinojson.org/v7/api/jsondocument/subscript/
template <typename TChar> template <typename TChar>
FORCE_INLINE typename detail::enable_if<detail::IsString<TChar*>::value, typename detail::enable_if<detail::IsString<TChar*>::value,
JsonVariantConst>::type JsonVariantConst>::type
operator[](TChar* key) const { operator[](TChar* key) const {
return JsonVariantConst( return JsonVariantConst(
data_.getMember(detail::adaptString(key), &resources_), &resources_); data_.getMember(detail::adaptString(key), &resources_), &resources_);
@@ -208,13 +207,13 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
// Gets or sets a root array's element. // Gets or sets a root array's element.
// https://arduinojson.org/v7/api/jsondocument/subscript/ // https://arduinojson.org/v7/api/jsondocument/subscript/
FORCE_INLINE detail::ElementProxy<JsonDocument&> operator[](size_t index) { detail::ElementProxy<JsonDocument&> operator[](size_t index) {
return {*this, index}; return {*this, index};
} }
// Gets a root array's member. // Gets a root array's member.
// https://arduinojson.org/v7/api/jsondocument/subscript/ // https://arduinojson.org/v7/api/jsondocument/subscript/
FORCE_INLINE JsonVariantConst operator[](size_t index) const { JsonVariantConst operator[](size_t index) const {
return JsonVariantConst(data_.getElement(index, &resources_), &resources_); return JsonVariantConst(data_.getElement(index, &resources_), &resources_);
} }
@@ -239,28 +238,28 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
// Appends a value to the root array. // Appends a value to the root array.
// https://arduinojson.org/v7/api/jsondocument/add/ // https://arduinojson.org/v7/api/jsondocument/add/
template <typename TValue> template <typename TValue>
FORCE_INLINE bool add(const TValue& value) { bool add(const TValue& value) {
return add<JsonVariant>().set(value); return add<JsonVariant>().set(value);
} }
// Appends a value to the root array. // Appends a value to the root array.
// https://arduinojson.org/v7/api/jsondocument/add/ // https://arduinojson.org/v7/api/jsondocument/add/
template <typename TChar> template <typename TChar>
FORCE_INLINE bool add(TChar* value) { bool add(TChar* value) {
return add<JsonVariant>().set(value); return add<JsonVariant>().set(value);
} }
// Removes an element of the root array. // Removes an element of the root array.
// https://arduinojson.org/v7/api/jsondocument/remove/ // https://arduinojson.org/v7/api/jsondocument/remove/
FORCE_INLINE void remove(size_t index) { void remove(size_t index) {
detail::VariantData::removeElement(getData(), index, getResourceManager()); detail::VariantData::removeElement(getData(), index, getResourceManager());
} }
// Removes a member of the root object. // Removes a member of the root object.
// https://arduinojson.org/v7/api/jsondocument/remove/ // https://arduinojson.org/v7/api/jsondocument/remove/
template <typename TChar> template <typename TChar>
FORCE_INLINE typename detail::enable_if<detail::IsString<TChar*>::value>::type typename detail::enable_if<detail::IsString<TChar*>::value>::type remove(
remove(TChar* key) { TChar* key) {
detail::VariantData::removeMember(getData(), detail::adaptString(key), detail::VariantData::removeMember(getData(), detail::adaptString(key),
getResourceManager()); getResourceManager());
} }
@@ -268,18 +267,18 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
// Removes a member of the root object. // Removes a member of the root object.
// https://arduinojson.org/v7/api/jsondocument/remove/ // https://arduinojson.org/v7/api/jsondocument/remove/
template <typename TString> template <typename TString>
FORCE_INLINE
typename detail::enable_if<detail::IsString<TString>::value>::type typename detail::enable_if<detail::IsString<TString>::value>::type remove(
remove(const TString& key) { const TString& key) {
detail::VariantData::removeMember(getData(), detail::adaptString(key), detail::VariantData::removeMember(getData(), detail::adaptString(key),
getResourceManager()); getResourceManager());
} }
FORCE_INLINE operator JsonVariant() { operator JsonVariant() {
return getVariant(); return getVariant();
} }
FORCE_INLINE operator JsonVariantConst() const { operator JsonVariantConst() const {
return getVariant(); return getVariant();
} }

View File

View File

34
lib/ArduinoJson/src/ArduinoJson/Json/JsonSerializer.hpp Normal file → Executable file
View File

@@ -19,19 +19,20 @@ class JsonSerializer : public VariantDataVisitor<size_t> {
JsonSerializer(TWriter writer, const ResourceManager* resources) JsonSerializer(TWriter writer, const ResourceManager* resources)
: formatter_(writer), resources_(resources) {} : formatter_(writer), resources_(resources) {}
FORCE_INLINE size_t visit(const ArrayData& array) { size_t visit(const ArrayData& array) {
write('['); write('[');
auto it = array.createIterator(resources_); auto slotId = array.head();
while (!it.done()) { while (slotId != NULL_SLOT) {
it->accept(*this); auto slot = resources_->getSlot(slotId);
it.next(resources_); slot->data()->accept(*this);
if (it.done())
break;
write(','); slotId = slot->next();
if (slotId != NULL_SLOT)
write(',');
} }
write(']'); write(']');
@@ -41,18 +42,19 @@ class JsonSerializer : public VariantDataVisitor<size_t> {
size_t visit(const ObjectData& object) { size_t visit(const ObjectData& object) {
write('{'); write('{');
auto it = object.createIterator(resources_); auto slotId = object.head();
while (!it.done()) { while (slotId != NULL_SLOT) {
formatter_.writeString(it.key()); auto slot = resources_->getSlot(slotId);
formatter_.writeString(slot->key());
write(':'); write(':');
it->accept(*this); slot->data()->accept(*this);
it.next(resources_); slotId = slot->next();
if (it.done())
break;
write(','); if (slotId != NULL_SLOT)
write(',');
} }
write('}'); write('}');

0
lib/ArduinoJson/src/ArduinoJson/Json/Latch.hpp Normal file → Executable file
View File

View File

0
lib/ArduinoJson/src/ArduinoJson/Json/TextFormatter.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Json/Utf16.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Json/Utf8.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Memory/Alignment.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Memory/Allocator.hpp Normal file → Executable file
View File

View File

View File

0
lib/ArduinoJson/src/ArduinoJson/Memory/StringNode.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Memory/StringPool.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Memory/VariantPool.hpp Normal file → Executable file
View File

View File

View File

View File

View File

View File

@@ -59,10 +59,14 @@ class MsgPackSerializer : public VariantDataVisitor<size_t> {
writeByte(0xDD); writeByte(0xDD);
writeInteger(uint32_t(n)); writeInteger(uint32_t(n));
} }
for (auto it = array.createIterator(resources_); !it.done();
it.next(resources_)) { auto slotId = array.head();
it->accept(*this); while (slotId != NULL_SLOT) {
auto slot = resources_->getSlot(slotId);
slot->data()->accept(*this);
slotId = slot->next();
} }
return bytesWritten(); return bytesWritten();
} }
@@ -77,11 +81,15 @@ class MsgPackSerializer : public VariantDataVisitor<size_t> {
writeByte(0xDF); writeByte(0xDF);
writeInteger(uint32_t(n)); writeInteger(uint32_t(n));
} }
for (auto it = object.createIterator(resources_); !it.done();
it.next(resources_)) { auto slotId = object.head();
visit(it.key()); while (slotId != NULL_SLOT) {
it->accept(*this); auto slot = resources_->getSlot(slotId);
visit(slot->key());
slot->data()->accept(*this);
slotId = slot->next();
} }
return bytesWritten(); return bytesWritten();
} }

0
lib/ArduinoJson/src/ArduinoJson/MsgPack/endianess.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/MsgPack/ieee754.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Namespace.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Numbers/FloatParts.hpp Normal file → Executable file
View File

View File

0
lib/ArduinoJson/src/ArduinoJson/Numbers/JsonFloat.hpp Normal file → Executable file
View File

View File

View File

View File

View File

47
lib/ArduinoJson/src/ArduinoJson/Object/JsonObject.hpp Normal file → Executable file
View File

@@ -20,11 +20,10 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
typedef JsonObjectIterator iterator; typedef JsonObjectIterator iterator;
// Creates an unbound reference. // Creates an unbound reference.
FORCE_INLINE JsonObject() : data_(0), resources_(0) {} JsonObject() : data_(0), resources_(0) {}
// INTERNAL USE ONLY // INTERNAL USE ONLY
FORCE_INLINE JsonObject(detail::ObjectData* data, JsonObject(detail::ObjectData* data, detail::ResourceManager* resource)
detail::ResourceManager* resource)
: data_(data), resources_(resource) {} : data_(data), resources_(resource) {}
operator JsonVariant() const { operator JsonVariant() const {
@@ -43,31 +42,31 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// Returns true if the reference is unbound. // Returns true if the reference is unbound.
// https://arduinojson.org/v7/api/jsonobject/isnull/ // https://arduinojson.org/v7/api/jsonobject/isnull/
FORCE_INLINE bool isNull() const { bool isNull() const {
return data_ == 0; return data_ == 0;
} }
// Returns true if the reference is bound. // Returns true if the reference is bound.
// https://arduinojson.org/v7/api/jsonobject/isnull/ // https://arduinojson.org/v7/api/jsonobject/isnull/
FORCE_INLINE operator bool() const { operator bool() const {
return data_ != 0; return data_ != 0;
} }
// Returns the depth (nesting level) of the object. // Returns the depth (nesting level) of the object.
// https://arduinojson.org/v7/api/jsonobject/nesting/ // https://arduinojson.org/v7/api/jsonobject/nesting/
FORCE_INLINE size_t nesting() const { size_t nesting() const {
return detail::VariantData::nesting(collectionToVariant(data_), resources_); return detail::VariantData::nesting(collectionToVariant(data_), resources_);
} }
// Returns the number of members in the object. // Returns the number of members in the object.
// https://arduinojson.org/v7/api/jsonobject/size/ // https://arduinojson.org/v7/api/jsonobject/size/
FORCE_INLINE size_t size() const { size_t size() const {
return data_ ? data_->size(resources_) : 0; return data_ ? data_->size(resources_) : 0;
} }
// Returns an iterator to the first key-value pair of the object. // Returns an iterator to the first key-value pair of the object.
// https://arduinojson.org/v7/api/jsonobject/begin/ // https://arduinojson.org/v7/api/jsonobject/begin/
FORCE_INLINE iterator begin() const { iterator begin() const {
if (!data_) if (!data_)
return iterator(); return iterator();
return iterator(data_->createIterator(resources_), resources_); return iterator(data_->createIterator(resources_), resources_);
@@ -75,7 +74,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// Returns an iterator following the last key-value pair of the object. // Returns an iterator following the last key-value pair of the object.
// https://arduinojson.org/v7/api/jsonobject/end/ // https://arduinojson.org/v7/api/jsonobject/end/
FORCE_INLINE iterator end() const { iterator end() const {
return iterator(); return iterator();
} }
@@ -87,7 +86,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// Copies an object. // Copies an object.
// https://arduinojson.org/v7/api/jsonobject/set/ // https://arduinojson.org/v7/api/jsonobject/set/
FORCE_INLINE bool set(JsonObjectConst src) { bool set(JsonObjectConst src) {
if (!data_ || !src.data_) if (!data_ || !src.data_)
return false; return false;
@@ -103,20 +102,20 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// Gets or sets the member with specified key. // Gets or sets the member with specified key.
// https://arduinojson.org/v7/api/jsonobject/subscript/ // https://arduinojson.org/v7/api/jsonobject/subscript/
template <typename TString> template <typename TString>
FORCE_INLINE
typename detail::enable_if<detail::IsString<TString>::value, typename detail::enable_if<detail::IsString<TString>::value,
detail::MemberProxy<JsonObject, TString>>::type detail::MemberProxy<JsonObject, TString>>::type
operator[](const TString& key) const { operator[](const TString& key) const {
return {*this, key}; return {*this, key};
} }
// Gets or sets the member with specified key. // Gets or sets the member with specified key.
// https://arduinojson.org/v7/api/jsonobject/subscript/ // https://arduinojson.org/v7/api/jsonobject/subscript/
template <typename TChar> template <typename TChar>
FORCE_INLINE
typename detail::enable_if<detail::IsString<TChar*>::value, typename detail::enable_if<detail::IsString<TChar*>::value,
detail::MemberProxy<JsonObject, TChar*>>::type detail::MemberProxy<JsonObject, TChar*>>::type
operator[](TChar* key) const { operator[](TChar* key) const {
return {*this, key}; return {*this, key};
} }
@@ -145,9 +144,9 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// Returns true if the object contains the specified key. // Returns true if the object contains the specified key.
// https://arduinojson.org/v7/api/jsonobject/containskey/ // https://arduinojson.org/v7/api/jsonobject/containskey/
template <typename TString> template <typename TString>
FORCE_INLINE
typename detail::enable_if<detail::IsString<TString>::value, bool>::type typename detail::enable_if<detail::IsString<TString>::value, bool>::type
containsKey(const TString& key) const { containsKey(const TString& key) const {
return detail::ObjectData::getMember(data_, detail::adaptString(key), return detail::ObjectData::getMember(data_, detail::adaptString(key),
resources_) != 0; resources_) != 0;
} }
@@ -155,9 +154,9 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// Returns true if the object contains the specified key. // Returns true if the object contains the specified key.
// https://arduinojson.org/v7/api/jsonobject/containskey/ // https://arduinojson.org/v7/api/jsonobject/containskey/
template <typename TChar> template <typename TChar>
FORCE_INLINE
typename detail::enable_if<detail::IsString<TChar*>::value, bool>::type typename detail::enable_if<detail::IsString<TChar*>::value, bool>::type
containsKey(TChar* key) const { containsKey(TChar* key) const {
return detail::ObjectData::getMember(data_, detail::adaptString(key), return detail::ObjectData::getMember(data_, detail::adaptString(key),
resources_) != 0; resources_) != 0;
} }

View File

@@ -32,31 +32,31 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
// Returns true if the reference is unbound. // Returns true if the reference is unbound.
// https://arduinojson.org/v7/api/jsonobjectconst/isnull/ // https://arduinojson.org/v7/api/jsonobjectconst/isnull/
FORCE_INLINE bool isNull() const { bool isNull() const {
return data_ == 0; return data_ == 0;
} }
// Returns true if the reference is bound. // Returns true if the reference is bound.
// https://arduinojson.org/v7/api/jsonobjectconst/isnull/ // https://arduinojson.org/v7/api/jsonobjectconst/isnull/
FORCE_INLINE operator bool() const { operator bool() const {
return data_ != 0; return data_ != 0;
} }
// Returns the depth (nesting level) of the object. // Returns the depth (nesting level) of the object.
// https://arduinojson.org/v7/api/jsonobjectconst/nesting/ // https://arduinojson.org/v7/api/jsonobjectconst/nesting/
FORCE_INLINE size_t nesting() const { size_t nesting() const {
return detail::VariantData::nesting(getData(), resources_); return detail::VariantData::nesting(getData(), resources_);
} }
// Returns the number of members in the object. // Returns the number of members in the object.
// https://arduinojson.org/v7/api/jsonobjectconst/size/ // https://arduinojson.org/v7/api/jsonobjectconst/size/
FORCE_INLINE size_t size() const { size_t size() const {
return data_ ? data_->size(resources_) : 0; return data_ ? data_->size(resources_) : 0;
} }
// Returns an iterator to the first key-value pair of the object. // Returns an iterator to the first key-value pair of the object.
// https://arduinojson.org/v7/api/jsonobjectconst/begin/ // https://arduinojson.org/v7/api/jsonobjectconst/begin/
FORCE_INLINE iterator begin() const { iterator begin() const {
if (!data_) if (!data_)
return iterator(); return iterator();
return iterator(data_->createIterator(resources_), resources_); return iterator(data_->createIterator(resources_), resources_);
@@ -64,14 +64,14 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
// Returns an iterator following the last key-value pair of the object. // Returns an iterator following the last key-value pair of the object.
// https://arduinojson.org/v7/api/jsonobjectconst/end/ // https://arduinojson.org/v7/api/jsonobjectconst/end/
FORCE_INLINE iterator end() const { iterator end() const {
return iterator(); return iterator();
} }
// Returns true if the object contains the specified key. // Returns true if the object contains the specified key.
// https://arduinojson.org/v7/api/jsonobjectconst/containskey/ // https://arduinojson.org/v7/api/jsonobjectconst/containskey/
template <typename TString> template <typename TString>
FORCE_INLINE bool containsKey(const TString& key) const { bool containsKey(const TString& key) const {
return detail::ObjectData::getMember(data_, detail::adaptString(key), return detail::ObjectData::getMember(data_, detail::adaptString(key),
resources_) != 0; resources_) != 0;
} }
@@ -79,7 +79,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
// Returns true if the object contains the specified key. // Returns true if the object contains the specified key.
// https://arduinojson.org/v7/api/jsonobjectconst/containskey/ // https://arduinojson.org/v7/api/jsonobjectconst/containskey/
template <typename TChar> template <typename TChar>
FORCE_INLINE bool containsKey(TChar* key) const { bool containsKey(TChar* key) const {
return detail::ObjectData::getMember(data_, detail::adaptString(key), return detail::ObjectData::getMember(data_, detail::adaptString(key),
resources_) != 0; resources_) != 0;
} }
@@ -87,8 +87,8 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
// Gets the member with specified key. // Gets the member with specified key.
// https://arduinojson.org/v7/api/jsonobjectconst/subscript/ // https://arduinojson.org/v7/api/jsonobjectconst/subscript/
template <typename TString> template <typename TString>
FORCE_INLINE typename detail::enable_if<detail::IsString<TString>::value, typename detail::enable_if<detail::IsString<TString>::value,
JsonVariantConst>::type JsonVariantConst>::type
operator[](const TString& key) const { operator[](const TString& key) const {
return JsonVariantConst(detail::ObjectData::getMember( return JsonVariantConst(detail::ObjectData::getMember(
data_, detail::adaptString(key), resources_), data_, detail::adaptString(key), resources_),
@@ -98,8 +98,8 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
// Gets the member with specified key. // Gets the member with specified key.
// https://arduinojson.org/v7/api/jsonobjectconst/subscript/ // https://arduinojson.org/v7/api/jsonobjectconst/subscript/
template <typename TChar> template <typename TChar>
FORCE_INLINE typename detail::enable_if<detail::IsString<TChar*>::value, typename detail::enable_if<detail::IsString<TChar*>::value,
JsonVariantConst>::type JsonVariantConst>::type
operator[](TChar* key) const { operator[](TChar* key) const {
return JsonVariantConst(detail::ObjectData::getMember( return JsonVariantConst(detail::ObjectData::getMember(
data_, detail::adaptString(key), resources_), data_, detail::adaptString(key), resources_),

View File

0
lib/ArduinoJson/src/ArduinoJson/Object/JsonPair.hpp Normal file → Executable file
View File

14
lib/ArduinoJson/src/ArduinoJson/Object/MemberProxy.hpp Normal file → Executable file
View File

@@ -17,41 +17,41 @@ class MemberProxy
friend class VariantAttorney; friend class VariantAttorney;
public: public:
FORCE_INLINE MemberProxy(TUpstream upstream, TStringRef key) MemberProxy(TUpstream upstream, TStringRef key)
: upstream_(upstream), key_(key) {} : upstream_(upstream), key_(key) {}
MemberProxy(const MemberProxy& src) MemberProxy(const MemberProxy& src)
: upstream_(src.upstream_), key_(src.key_) {} : upstream_(src.upstream_), key_(src.key_) {}
FORCE_INLINE MemberProxy& operator=(const MemberProxy& src) { MemberProxy& operator=(const MemberProxy& src) {
this->set(src); this->set(src);
return *this; return *this;
} }
template <typename T> template <typename T>
FORCE_INLINE MemberProxy& operator=(const T& src) { MemberProxy& operator=(const T& src) {
this->set(src); this->set(src);
return *this; return *this;
} }
template <typename T> template <typename T>
FORCE_INLINE MemberProxy& operator=(T* src) { MemberProxy& operator=(T* src) {
this->set(src); this->set(src);
return *this; return *this;
} }
private: private:
FORCE_INLINE ResourceManager* getResourceManager() const { ResourceManager* getResourceManager() const {
return VariantAttorney::getResourceManager(upstream_); return VariantAttorney::getResourceManager(upstream_);
} }
FORCE_INLINE VariantData* getData() const { VariantData* getData() const {
return VariantData::getMember( return VariantData::getMember(
VariantAttorney::getData(upstream_), adaptString(key_), VariantAttorney::getData(upstream_), adaptString(key_),
VariantAttorney::getResourceManager(upstream_)); VariantAttorney::getResourceManager(upstream_));
} }
FORCE_INLINE VariantData* getOrCreateData() const { VariantData* getOrCreateData() const {
auto data = VariantAttorney::getOrCreateData(upstream_); auto data = VariantAttorney::getOrCreateData(upstream_);
if (!data) if (!data)
return nullptr; return nullptr;

0
lib/ArduinoJson/src/ArduinoJson/Object/ObjectData.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Object/ObjectImpl.hpp Normal file → Executable file
View File

View File

0
lib/ArduinoJson/src/ArduinoJson/Polyfills/assert.hpp Normal file → Executable file
View File

View File

@@ -7,7 +7,6 @@
#ifdef _MSC_VER // Visual Studio #ifdef _MSC_VER // Visual Studio
# define FORCE_INLINE // __forceinline causes C4714 when returning std::string # define FORCE_INLINE // __forceinline causes C4714 when returning std::string
# define NO_INLINE __declspec(noinline)
# ifndef ARDUINOJSON_DEPRECATED # ifndef ARDUINOJSON_DEPRECATED
# define ARDUINOJSON_DEPRECATED(msg) __declspec(deprecated(msg)) # define ARDUINOJSON_DEPRECATED(msg) __declspec(deprecated(msg))
@@ -16,7 +15,6 @@
#elif defined(__GNUC__) // GCC or Clang #elif defined(__GNUC__) // GCC or Clang
# define FORCE_INLINE __attribute__((always_inline)) # define FORCE_INLINE __attribute__((always_inline))
# define NO_INLINE __attribute__((noinline))
# ifndef ARDUINOJSON_DEPRECATED # ifndef ARDUINOJSON_DEPRECATED
# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) # if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
@@ -29,7 +27,6 @@
#else // Other compilers #else // Other compilers
# define FORCE_INLINE # define FORCE_INLINE
# define NO_INLINE
# ifndef ARDUINOJSON_DEPRECATED # ifndef ARDUINOJSON_DEPRECATED
# define ARDUINOJSON_DEPRECATED(msg) # define ARDUINOJSON_DEPRECATED(msg)

0
lib/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Polyfills/integer.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Polyfills/limits.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp Normal file → Executable file
View File

0
lib/ArduinoJson/src/ArduinoJson/Polyfills/mpl/max.hpp Normal file → Executable file
View File

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