feat: migrate settings to insomnia-data (#9729)

This commit is contained in:
Bingbing
2026-03-20 18:13:41 +08:00
committed by GitHub
parent a0396f6b72
commit 700fb8ff17
67 changed files with 212 additions and 178 deletions

View File

@@ -2,9 +2,10 @@ import os from 'node:os';
import { Analytics } from '@segment/analytics-node';
import { getSegmentWriteKey } from 'insomnia/src/common/constants';
import type { Settings } from 'insomnia/src/models/settings';
import { v4 as uuidv4 } from 'uuid';
import type { Settings } from '~/insomnia-data';
import packageJson from '../package.json';
import neDbAdapter from './db/adapters/ne-db-adapter';
import { getAppDataDir, getDefaultProductName } from './util';

View File

@@ -1,9 +1,8 @@
import type { ClientCertificate } from 'insomnia/src/models/client-certificate';
import type { CloudProviderCredential } from 'insomnia/src/models/cloud-credential';
import type { CookieJar } from 'insomnia/src/models/cookie-jar';
import type { Settings } from 'insomnia/src/models/settings';
import type { CaCertificate } from '~/insomnia-data';
import type { CaCertificate, Settings } from '~/insomnia-data';
import type {
ApiSpec,

View File

@@ -1,9 +1,10 @@
import { expect } from 'chai';
import type { ClientCertificate } from 'insomnia/src/models/client-certificate';
import type { RequestHeader } from 'insomnia/src/models/request';
import type { Settings } from 'insomnia/src/models/settings';
import { filterClientCertificates } from 'insomnia/src/network/certificate';
import type { Settings } from '~/insomnia-data';
import { toPreRequestAuth } from './auth';
import { getExistingConsole } from './console';
import { CookieObject } from './cookies';

View File

@@ -1,9 +1,10 @@
import type { ClientCertificate } from 'insomnia/src/models/client-certificate';
import type { CookieJar as InsomniaCookieJar } from 'insomnia/src/models/cookie-jar';
import type { Request } from 'insomnia/src/models/request';
import type { Settings } from 'insomnia/src/models/settings';
import type { sendCurlAndWriteTimelineError, sendCurlAndWriteTimelineResponse } from 'insomnia/src/network/network';
import type { Settings } from '~/insomnia-data';
import type { ExecutionOption } from './execution';
import type { RequestInfoOption } from './request-info';
import type { RequestTestResult } from './test';

View File

@@ -5,7 +5,8 @@ import type {
RequestBodyParameter,
RequestPathParameter,
} from 'insomnia/src/models/request';
import type { Settings } from 'insomnia/src/models/settings';
import type { Settings } from '~/insomnia-data';
import { type AuthOptions, type AuthOptionTypes, fromPreRequestAuth, RequestAuth } from './auth';
import type { CertificateOptions } from './certificates';

View File

@@ -1,9 +1,10 @@
import type { CurlRequestOutput } from 'insomnia/src/main/network/libcurl-promise';
import { readCurlResponse } from 'insomnia/src/models/helpers/response-operations';
import type { Settings } from 'insomnia/src/models/settings';
import { Cookie } from 'tough-cookie';
import { v4 as uuidv4 } from 'uuid';
import type { Settings } from '~/insomnia-data';
import { RequestAuth } from './auth';
import { fromPreRequestAuth } from './auth';
import type { CookieOptions } from './cookies';

View File

@@ -1,5 +1,7 @@
import { logout as logoutAPI, whoami } from 'insomnia-api';
import { services } from '~/insomnia-data';
import { AI_PLUGIN_NAME, LLM_BACKENDS } from '../common/constants';
import { database } from '../common/database';
import {
@@ -8,7 +10,6 @@ import {
gitRepository,
pluginData,
project,
settings,
userSession,
workspaceMeta,
} from '../models';
@@ -202,12 +203,12 @@ async function _removeAllCredentials() {
removals.push(_removeGitRepository(repo));
}
const proxySettings = await settings.get();
const proxySettings = await services.settings.get();
if (proxySettings.httpProxy?.includes('@')) {
removals.push(settings.update(proxySettings, { httpProxy: '' }));
removals.push(services.settings.update(proxySettings, { httpProxy: '' }));
}
if (proxySettings.httpsProxy?.includes('@')) {
removals.push(settings.update(proxySettings, { httpsProxy: '' }));
removals.push(services.settings.update(proxySettings, { httpsProxy: '' }));
}
await Promise.all(removals);

View File

@@ -2,6 +2,8 @@ import path from 'node:path';
import { beforeEach, describe, expect, it } from 'vitest';
import { services } from '~/insomnia-data';
import { database as db } from '../../common/database';
import * as models from '../../models';
import type { Cookie } from '../../models/cookie-jar';
@@ -14,7 +16,7 @@ describe('export', () => {
beforeEach(async () => {
await db.init({ inMemoryOnly: true }, true);
await models.project.all();
await models.settings.getOrCreate();
await services.settings.getOrCreate();
});
describe('exportHar()', () => {

View File

@@ -41,7 +41,7 @@ describe('Insomnia v5 Import/Export - Comprehensive Tests', () => {
scope: 'collection',
});
await models.settings.getOrCreate();
await services.settings.getOrCreate();
});
describe('insomniaSchemaTypeToScope', () => {

View File

@@ -1,6 +1,8 @@
import { createBuilder } from '@develohpanda/fluent-builder';
import { beforeEach, describe, expect, it } from 'vitest';
import { services } from '~/insomnia-data';
import * as models from '../../models';
import { environmentModelSchema, requestGroupModelSchema } from '../../models/__schemas__/model-schemas';
import type { Environment } from '../../models/environment';
@@ -13,7 +15,7 @@ const reqGroupBuilder = createBuilder(requestGroupModelSchema);
describe('render tests', () => {
beforeEach(async () => {
await models.project.all();
await models.settings.getOrCreate();
await services.settings.getOrCreate();
envBuilder.reset();
reqGroupBuilder.reset();
});

View File

@@ -1,7 +1,7 @@
import clone from 'clone';
import orderedJSON from 'json-order';
import { type McpRequest } from '~/insomnia-data';
import { type McpRequest, services } from '~/insomnia-data';
import * as models from '../models';
import {
@@ -290,7 +290,7 @@ export async function render<T>(
// explicitly configure rendering to happen on the same thread/process as the rest of the app, in
// which case it's okay to render locally.
const settings = await models.settings.get();
const settings = await services.settings.get();
const pluginsAreRestrictedToRunInWorker = settings?.pluginsAllowElevatedAccess === false;
const currentProcessIsRendererAndPluginsAreRestricted =
process.type === 'renderer' && pluginsAreRestrictedToRunInWorker;
@@ -473,7 +473,7 @@ export async function getRenderContext({
getKeySource(transientVariables.data || {}, inKey, transientVariables.name || 'scriptLocalVariables');
}
const settings = await models.settings.get();
const settings = await services.settings.get();
// Add meta data helper function
const baseContext: BaseRenderContext = {

View File

@@ -1,14 +1,12 @@
import fs from 'node:fs/promises';
import path from 'node:path';
import { database, initDatabase } from '~/insomnia-data';
import { database, initDatabase, services, type Settings } from '~/insomnia-data';
import { createNedbDatabase } from '~/insomnia-data/node';
import { getBodyBuffer } from '~/models/helpers/response-operations';
import type { BaseModel } from '../models';
import * as models from '../models';
import type { Environment, UserUploadEnvironment } from '../models/environment';
import type { Settings } from '../models/settings';
import {
defaultSendActionRuntime,
fetchRequestData,
@@ -69,7 +67,7 @@ export async function getSendRequestCallbackMemDb(
});
// Now get settings (may come from fixtures) and merge with overrides
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const mergedSettings = { ...settings, ...settingsOverrides };
await database.batchModifyDocs({
upsert: [mergedSettings],

View File

@@ -6,13 +6,12 @@ import { startTransition, StrictMode } from 'react';
import { hydrateRoot } from 'react-dom/client';
import { HydratedRouter } from 'react-router/dom';
import { initDatabase, initServices } from '~/insomnia-data';
import { initDatabase, initServices, services } from '~/insomnia-data';
import { database as clientDatabase } from '~/ui/database.client';
import { insomniaFetch } from '~/ui/insomnia-fetch';
import { migrateFromLocalStorage, type SessionData, setSessionData, setVaultSessionData } from './account/session';
import { getInsomniaSession, getInsomniaVaultKey, getInsomniaVaultSalt, getSkipOnboarding } from './common/constants';
import * as models from './models';
import { initNewOAuthSession } from './network/o-auth-2/get-token';
import { init as initPlugins } from './plugins';
import { applyColorScheme } from './plugins/misc';
@@ -128,7 +127,7 @@ if (insomniaSession) {
}
}
const appSettings = await models.settings.getOrCreate();
const appSettings = await services.settings.getOrCreate();
if (appSettings.clearOAuth2SessionOnRestart) {
initNewOAuthSession();

View File

@@ -9,7 +9,7 @@ import installExtension, { REACT_DEVELOPER_TOOLS } from 'electron-devtools-insta
import { configureFetch } from 'insomnia-api';
import { getCurrentSessionId } from '~/account/session';
import { database, initDatabase, initServices } from '~/insomnia-data';
import { database, initDatabase, initServices, services } from '~/insomnia-data';
import { servicesNodeImpl } from '~/insomnia-data/node';
import { mainDatabase } from '~/main/database.main';
import { registerPathHandlers } from '~/main/ipc/path';
@@ -292,7 +292,7 @@ const _launchApp = async () => {
*/
async function _createModelInstances() {
await models.stats.get();
await models.settings.getOrCreate();
await services.settings.getOrCreate();
try {
const scratchpadProject = await models.project.getById(models.project.SCRATCHPAD_PROJECT_ID);
const scratchPad = await models.workspace.getById(models.workspace.SCRATCHPAD_WORKSPACE_ID);
@@ -368,7 +368,7 @@ async function _trackStats() {
parentId: { $ne: null },
});
const settings = await models.settings.get();
const settings = await services.settings.get();
trackSegmentEvent(SegmentEvent.appStarted, {
localProjects,

View File

@@ -2,6 +2,7 @@ import * as caCertificateService from './ca-certificate';
import * as mcpPayloadService from './mcp-payload';
import * as mcpRequestService from './mcp-request';
import * as mcpResponseService from './mcp-response';
import * as settingsService from './settings';
// Services are consumed from renderer via preload -> IPC (`ipcRenderer.invoke`), so this contract
// must stay async across runtimes even if a main-process implementation could be synchronous.
@@ -11,4 +12,5 @@ export const servicesNodeImpl = {
mcpRequest: mcpRequestService,
mcpResponse: mcpResponseService,
mcpPayload: mcpPayloadService,
settings: settingsService,
} satisfies Record<string, Record<string, (...args: never[]) => Promise<unknown>>>;

View File

@@ -3,6 +3,7 @@ import * as requestOperations from '~/models/helpers/request-operations';
import { database as db } from '../../src/database';
import { type McpResponse } from '../../src/models/types';
import * as SettingsService from './settings';
const { type } = models.mcpResponse;
@@ -33,7 +34,7 @@ export async function create(patch: Partial<McpResponse> = {}, maxResponses = 20
parentId,
};
if ((await models.settings.get()).filterResponsesByEnv && 'environmentId' in patch) {
if ((await SettingsService.get()).filterResponsesByEnv && 'environmentId' in patch) {
query.environmentId = patch.environmentId;
}
@@ -71,7 +72,7 @@ export async function updateOrCreate(patch: Partial<McpResponse>, maxResponses =
export async function getLatestForRequestId(requestId: string, environmentId: string | null) {
// Filter responses by environment if setting is enabled
const shouldFilter = (await models.settings.get()).filterResponsesByEnv;
const shouldFilter = (await SettingsService.get()).filterResponsesByEnv;
const response = await db.findOne<McpResponse>(
type,

View File

@@ -0,0 +1,42 @@
import { database as db, models, type Settings } from '~/insomnia-data';
const { type } = models.settings;
export async function all() {
let settingsList = await db.find<Settings>(type);
if (settingsList?.length === 0) {
settingsList = [await getOrCreate()];
}
return settingsList;
}
async function create() {
const settings = await db.docCreate<Settings>(type);
return settings;
}
export async function update(settings: Settings, patch: Partial<Settings>) {
const updatedSettings = await db.docUpdate<Settings>(settings, patch);
return updatedSettings;
}
export async function patch(settingsPatch: Partial<Settings>) {
const settings = await getOrCreate();
const updatedSettings = await db.docUpdate<Settings>(settings, settingsPatch);
return updatedSettings;
}
export async function getOrCreate() {
const result = await db.findOne<Settings>(type);
if (!result) {
return await create();
}
return result;
}
export async function get() {
return getOrCreate();
}

View File

@@ -3,10 +3,12 @@ import * as caCertificate from './ca-certificate';
import * as mcpPayload from './mcp-payload';
import * as mcpRequest from './mcp-request';
import * as mcpResponse from './mcp-response';
import * as settings from './settings';
export const models = {
caCertificate,
mcpRequest,
mcpPayload,
mcpResponse,
settings,
} as const;

View File

@@ -1,8 +1,7 @@
import { getAppDefaultDarkTheme, getAppDefaultLightTheme, getAppDefaultTheme } from '../common/constants';
import { database as db } from '../common/database';
import * as hotkeys from '../common/hotkeys';
import { HttpVersions, type KeyboardShortcut, type Settings as BaseSettings, UpdateChannel } from '../common/settings';
import type { BaseModel } from './types';
import { getAppDefaultDarkTheme, getAppDefaultLightTheme, getAppDefaultTheme } from '~/common/constants';
import * as hotkeys from '~/common/hotkeys';
import { HttpVersions, type KeyboardShortcut, type Settings as BaseSettings, UpdateChannel } from '~/common/settings';
import type { BaseModel } from '~/models/types';
export type Settings = BaseModel & BaseSettings;
export const name = 'Settings';
@@ -89,45 +88,6 @@ export function migrate(doc: Settings) {
}
}
export async function all() {
let settingsList = await db.find<Settings>(type);
if (settingsList?.length === 0) {
settingsList = [await getOrCreate()];
}
return settingsList;
}
async function create() {
const settings = await db.docCreate<Settings>(type);
return settings;
}
export async function update(settings: Settings, patch: Partial<Settings>) {
const updatedSettings = await db.docUpdate<Settings>(settings, patch);
return updatedSettings;
}
export async function patch(settingsPatch: Partial<Settings>) {
const settings = await getOrCreate();
const updatedSettings = await db.docUpdate<Settings>(settings, settingsPatch);
return updatedSettings;
}
export async function getOrCreate() {
const result = await db.findOne<Settings>(type);
if (!result) {
return await create();
}
return result;
}
export async function get() {
return getOrCreate();
}
/**
* Ensure map is updated when new hotkeys are added
*/

View File

@@ -3,3 +3,4 @@ export type { CaCertificate } from './ca-certificate';
export type { McpRequest, McpTransportType, McpServerPrimitiveTypes } from './mcp-request';
export type { McpPayload } from './mcp-payload';
export type { McpResponse } from './mcp-response';
export type { Settings, ThemeSettings } from './settings';

View File

@@ -5,6 +5,8 @@ import * as Sentry from '@sentry/electron/main';
import { net } from 'electron';
import { v4 as uuidv4 } from 'uuid';
import { services } from '~/insomnia-data';
import {
getApiBaseURL,
getAppPlatform,
@@ -37,8 +39,8 @@ const analytics = new Analytics({
});
const getDeviceId = async () => {
const settings = await models.settings.get();
return settings.deviceId || (await models.settings.update(settings, { deviceId: uuidv4() })).deviceId;
const settings = await services.settings.get();
return settings.deviceId || (await services.settings.update(settings, { deviceId: uuidv4() })).deviceId;
};
export enum SegmentEvent {
@@ -85,7 +87,7 @@ export async function trackSegmentEvent(event: SegmentEvent, properties?: Record
if (PLAYWRIGHT) {
return;
}
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const userSession = await models.userSession.getOrCreate();
if (!userSession?.hashedAccountId) {
userSession.hashedAccountId = userSession?.accountId ? hashString(userSession.accountId) : '';
@@ -139,7 +141,7 @@ export async function trackPageView(name: string) {
if (PLAYWRIGHT) {
return;
}
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const userSession = await models.userSession.getOrCreate();
if (!userSession?.hashedAccountId) {
userSession.hashedAccountId = userSession?.accountId ? hashString(userSession.accountId) : '';

View File

@@ -5,8 +5,9 @@ import { parse as urlParse } from 'node:url';
import { Curl, CurlAuth, CurlFeature, CurlProxy, CurlSslOpt, type HeaderInfo } from '@getinsomnia/node-libcurl';
import { app, net, protocol, session } from 'electron';
import { services } from '~/insomnia-data';
import { getApiBaseURL } from '../common/constants';
import { get as getSettings } from '../models/settings';
import * as _userSession from '../models/user-session';
import { setDefaultProtocol } from './network/libcurl-promise';
import { resolveDbByKey } from './templating-worker-database';
@@ -52,7 +53,7 @@ export async function registerInsomniaProtocols() {
const apiURL = getApiBaseURL();
const url = new URL(`${apiURL}/${originalRequest.url.replace(`${insomniaStreamScheme}://`, '')}`);
const urlStr = url.toString();
const settings = await getSettings();
const settings = await services.settings.get();
// systemProxy follows the PAC return value format.
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file#return_value_format
let systemProxyStr = await session.defaultSession.resolveProxy(urlStr);

View File

@@ -1,6 +1,6 @@
import { BrowserWindow, dialog } from 'electron';
import * as models from '../models';
import { services } from '~/insomnia-data';
export enum ChromiumVerificationResult {
BLIND_TRUST = 0,
@@ -32,7 +32,7 @@ export function authorizeUserInWindow({
let finalUrl: string | null = null;
// Fetch user setting to determine whether to validate SSL certificates during auth
const { validateAuthSSL, proxyEnabled, httpProxy, httpsProxy, noProxy } = await models.settings.get();
const { validateAuthSSL, proxyEnabled, httpProxy, httpsProxy, noProxy } = await services.settings.get();
// Create a child window
const child = new BrowserWindow({

View File

@@ -3,15 +3,15 @@ import path from 'node:path';
import electron from 'electron';
import { services } from '~/insomnia-data';
import { getUpdateUrl } from '~/main/updates';
import { version } from '../../package.json';
import { getClientString } from '../common/constants';
import * as models from '../models';
export async function backupIfNewerVersionAvailable() {
try {
const settings = await models.settings.get();
const settings = await services.settings.get();
console.log('[main] Checking for newer version than', version);
const url = getUpdateUrl(settings.updateChannel);
if (!url) {

View File

@@ -6,10 +6,10 @@ import { promisify } from 'node:util';
import { app, net } from 'electron';
import { services } from '~/insomnia-data';
import { SegmentEvent, trackSegmentEvent } from '~/main/analytics';
import { isDevelopment } from '../common/constants';
import * as models from '../models';
import { validatePluginName } from '../utils/plugin';
// Promisified version of execFile to use async/await
@@ -414,7 +414,7 @@ export function safeTrim(value: unknown): string | undefined {
* Pulls settings from the application models.
*/
export async function getYarnEnvValues(): Promise<Record<string, string>> {
const settings = await models.settings.get();
const settings = await services.settings.get();
const yarnEnv: Record<string, string> = {
NODE_ENV: 'production',

View File

@@ -28,6 +28,8 @@ import * as protoLoader from '@grpc/proto-loader';
import electron, { type IpcMainEvent } from 'electron';
import * as grpcReflection from 'grpc-reflection-js';
import { services } from '~/insomnia-data';
import { version } from '../../../package.json';
import * as models from '../../models';
import type { GrpcRequest, GrpcRequestBody, GrpcRequestHeader } from '../../models/grpc-request';
@@ -304,7 +306,7 @@ export const getSelectedMethod = async (
invariant(methods, 'No methods found');
return methods.find(c => c.path === request.protoMethodName);
}
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const methods = await getMethodsFromReflection(
request.url,
request.metadata,

View File

@@ -100,7 +100,7 @@ export const createStdioTransport = async (
eventLogPath,
transportType: models.mcpRequest.TRANSPORT_TYPES.STDIO,
};
const settings = await models.settings.get();
const settings = await services.settings.get();
const res = await services.mcpResponse.updateOrCreate(responsePatch, settings.maxHistoryResponses);
models.requestMeta.updateOrCreateByParentId(requestId, { activeResponseId: res._id });
}

View File

@@ -135,7 +135,7 @@ const wrappedFetch = async (
eventLogPath,
transportType: models.mcpRequest.TRANSPORT_TYPES.HTTP,
};
const settings = await models.settings.get();
const settings = await services.settings.get();
const res = await services.mcpResponse.updateOrCreate(responsePatch, settings.maxHistoryResponses);
models.requestMeta.updateOrCreateByParentId(requestId, { activeResponseId: res._id });
}

View File

@@ -159,7 +159,7 @@ const openCurlConnection = async (
}
const readyStateChannel = `${protocolName}.${request._id}.${REALTIME_EVENTS_CHANNELS.READY_STATE}`;
const settings = await models.settings.get();
const settings = await services.settings.get();
const start = performance.now();
const clientCertificates = await models.clientCertificate.findByParentId(options.workspaceId);
const filteredClientCertificates = filterClientCertificates(clientCertificates, options.url, 'https:');
@@ -264,7 +264,7 @@ const openCurlConnection = async (
settingStoreCookies: request.settingStoreCookies,
bodyCompression: null,
};
const settings = await models.settings.get();
const settings = await services.settings.get();
const res = await models.response.create(responsePatch, settings.maxHistoryResponses);
models.requestMeta.updateOrCreateByParentId(request._id, { activeResponseId: res._id });
@@ -343,7 +343,7 @@ const createErrorResponse = async (
timelinePath: string,
message: string,
) => {
const settings = await models.settings.get();
const settings = await services.settings.get();
const responsePatch = {
_id: responseId,
parentId: requestId,

View File

@@ -190,7 +190,7 @@ const createErrorResponse = async (
},
) => {
const { requestId, responseId, environmentId, timelinePath, options } = context;
const settings = await models.settings.get();
const settings = await services.settings.get();
const responsePatch = {
_id: responseId,
parentId: requestId,

View File

@@ -217,7 +217,7 @@ const createErrorResponse = async (
timelinePath: string,
message: string,
) => {
const settings = await models.settings.get();
const settings = await services.settings.get();
const responsePatch = {
_id: responseId,
parentId: requestId,
@@ -292,7 +292,7 @@ const openSocketIOConnection = async (
url: options.url,
requestId: options.requestId,
});
const settings = await models.settings.get();
const settings = await services.settings.get();
const socketIOoptions: Partial<ManagerOptions & SocketOptions> = {
extraHeaders: lowerCasedEnabledHeaders,

View File

@@ -222,7 +222,7 @@ const openWebSocketConnection = async (
const lowerCasedEnabledHeaders = headers
.filter(({ name, disabled }) => Boolean(name) && !disabled)
.reduce(reduceArrayToLowerCaseKeyedDictionary, {});
const settings = await models.settings.get();
const settings = await services.settings.get();
const start = performance.now();
const clientCertificates = await models.clientCertificate.findByParentId(options.workspaceId);
@@ -320,7 +320,7 @@ const openWebSocketConnection = async (
settingStoreCookies: request.settingStoreCookies,
};
const settings = await models.settings.get();
const settings = await services.settings.get();
const res = await models.webSocketResponse.create(responsePatch, settings.maxHistoryResponses);
models.requestMeta.updateOrCreateByParentId(request._id, { activeResponseId: res._id });
@@ -376,7 +376,7 @@ const openWebSocketConnection = async (
settingSendCookies: request.settingSendCookies,
settingStoreCookies: request.settingStoreCookies,
};
const settings = await models.settings.get();
const settings = await services.settings.get();
const res = await models.webSocketResponse.create(responsePatch, settings.maxHistoryResponses);
models.requestMeta.updateOrCreateByParentId(request._id, { activeResponseId: res._id });
deleteRequestMaps(request._id, `Unexpected response ${incomingMessage.statusCode}`);
@@ -512,7 +512,7 @@ const createErrorResponse = async (
timelinePath: string,
message: string,
) => {
const settings = await models.settings.get();
const settings = await services.settings.get();
const responsePatch = {
_id: responseId,
parentId: requestId,

View File

@@ -1,13 +1,13 @@
import { session } from 'electron/main';
import { models, services } from '~/insomnia-data';
import { type ChangeBufferEvent, database as db } from '../common/database';
import { settings } from '../models';
import { isSettings } from '../models/settings';
import { setDefaultProtocol } from '../utils/url/protocol';
// Update the proxy settings before making the request.
async function updateProxy() {
const { proxyEnabled, httpProxy, httpsProxy, noProxy } = await settings.get();
const { proxyEnabled, httpProxy, httpsProxy, noProxy } = await services.settings.get();
if (proxyEnabled) {
// Supported values for proxyUrl are like: http://localhost:8888, https://localhost:8888 or localhost:8888
@@ -42,12 +42,12 @@ async function updateProxy() {
}
export async function watchProxySettings() {
let old = await settings.get();
let old = await services.settings.get();
updateProxy();
db.onChange(async (changes: ChangeBufferEvent[]) => {
for (const change of changes) {
const [event, doc] = change;
const isSettingsUpdate = isSettings(doc) && event === 'update';
const isSettingsUpdate = models.settings.isSettings(doc) && event === 'update';
if (isSettingsUpdate) {
const hasProxyChanged =
old.proxyEnabled !== doc.proxyEnabled ||

View File

@@ -4,10 +4,10 @@ import path from 'node:path';
import electron from 'electron';
import { services } from '~/insomnia-data';
import { invariant } from '~/utils/invariant';
import { SECURITY_SETTINGS_PATH_LABEL } from '../common/misc';
import * as models from '../models/index';
export const isPathAllowed = (filePath: string, userAllowList: string[]) => {
const allowList = getSecuredFolderAllowList(userAllowList);
@@ -25,7 +25,7 @@ const getSecuredFolderAllowList = (userAllowList: string[]) => {
};
// For reading files specified by plugins, environment variables, and scripts which could come from an imported collection
export const secureReadFile = async (filePath: string): Promise<string> => {
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const { isAllowed, securedPath } = isPathAllowed(filePath, settings.dataFolders);
invariant(

View File

@@ -1,10 +1,11 @@
import * as Sentry from '@sentry/electron/main';
import { services } from '~/insomnia-data';
import * as session from '../account/session';
import { type ChangeBufferEvent, database as db } from '../common/database';
import { SENTRY_OPTIONS } from '../common/sentry';
import * as models from '../models/index';
import { isSettings } from '../models/settings';
let enabled = false;
@@ -12,14 +13,14 @@ let enabled = false;
* Watch setting for changes. This must be called after the DB is initialized.
*/
export function sentryWatchAnalyticsEnabled() {
models.settings.get().then(async settings => {
services.settings.get().then(async settings => {
enabled = settings.enableAnalytics || (await session.isLoggedIn());
});
db.onChange(async (changes: ChangeBufferEvent[]) => {
for (const change of changes) {
const [event, doc] = change;
if (isSettings(doc) && event === 'update') {
if (models.settings.isSettings(doc) && event === 'update') {
enabled = doc.enableAnalytics || (await session.isLoggedIn());
}

View File

@@ -7,6 +7,7 @@ import iconv from 'iconv-lite';
import { v4 as uuidv4 } from 'uuid';
import { jarFromCookies } from '~/common/cookies';
import { services } from '~/insomnia-data';
import { getBodyBuffer, readCurlResponse } from '~/models/helpers/response-operations';
import { getAppBundlePlugins, RESPONSE_CODE_REASONS } from '../common/constants';
@@ -149,7 +150,7 @@ const pluginToMainAPI: Record<PluginToMainAPIPaths, (...args: any[]) => Promise<
return await models.cloudCredential.update(body.originCredential, body.patch);
},
'settings.get': async () => {
return await models.settings.get();
return await services.settings.get();
},
'openInBrowser': async (body: { url: string }) => {
const { url } = body;
@@ -186,7 +187,7 @@ const pluginToMainAPI: Record<PluginToMainAPIPaths, (...args: any[]) => Promise<
};
}) => {
const requestId = uuidv4();
const settings = await models.settings.get();
const settings = await services.settings.get();
const settingFollowRedirects = settings?.followRedirects ? 'on' : 'off';
const { request: originRequest, caCertficatePath = null } = body.options;
const response = await curlRequest({

View File

@@ -6,13 +6,12 @@ import { app, autoUpdater, BrowserWindow, dialog } from 'electron';
import log from 'electron-log';
import { autoUpdater as electronUpdater } from 'electron-updater';
import type { Settings } from '~/models/settings';
import { services, type Settings } from '~/insomnia-data';
import appConfig from '../../config/config.json';
import packageJSON from '../../package.json';
import { CHECK_FOR_UPDATES_INTERVAL, isDevelopment } from '../common/constants';
import { delay } from '../common/misc';
import * as models from '../models/index';
import { invariant } from '../utils/invariant';
import { ipcMainOn } from './ipc/electron';
@@ -70,7 +69,7 @@ export const init = async () => {
// nsis installer uses electron-updater package rather than electron.autoUpdater
const isNsis = await isNsisInstaller();
const checkForUpdates = isNsis ? initNsisUpdater() : initAutoUpdater();
const settings = await models.settings.get();
const settings = await services.settings.get();
const updateSupported = isUpdateSupported();
// perhaps disable this method of upgrading just in case it trigger before backup is complete
// on app start
@@ -80,7 +79,7 @@ export const init = async () => {
}
// on an interval (3h)
setInterval(async () => {
const settings = await models.settings.get();
const settings = await services.settings.get();
if (settings.updateAutomatically) {
checkForUpdates(settings);
}
@@ -95,7 +94,7 @@ export const init = async () => {
await delay(300); // Pacing
checkForUpdates(await models.settings.get());
checkForUpdates(await services.settings.get());
});
};

View File

@@ -8,6 +8,8 @@
import { v4 as uuidv4 } from 'uuid';
import { beforeEach, describe, expect, it } from 'vitest';
import { services } from '~/insomnia-data';
import * as models from '../index';
import type {
AuthTypeAPIKey,
@@ -31,7 +33,7 @@ import type {
describe('Request Model - Comprehensive Tests', () => {
beforeEach(async () => {
await models.project.all();
await models.settings.getOrCreate();
await services.settings.getOrCreate();
// Create test project for all tests
try {

View File

@@ -3,7 +3,7 @@ import type { Readable } from 'node:stream';
import zlib from 'node:zlib';
import { database as db } from '~/common/database';
import { type McpResponse } from '~/insomnia-data';
import { type McpResponse, services } from '~/insomnia-data';
import type { ResponseTimelineEntry } from '~/main/network/libcurl-promise';
import * as models from '~/models/index';
import { type Compression, isResponse, type Response, type as responseType } from '~/models/response';
@@ -18,7 +18,7 @@ import {
import { deserializeNDJSON } from '~/utils/ndjson';
export async function removeResponsesForRequest(requestId: string, environmentId?: string | null) {
const settings = await models.settings.get();
const settings = await services.settings.get();
const query: Record<string, any> = {
parentId: requestId,
};

View File

@@ -26,7 +26,6 @@ import * as _requestMeta from './request-meta';
import * as _requestVersion from './request-version';
import * as _response from './response';
import * as _runnerTestResult from './runner-test-result';
import * as _settings from './settings';
import * as _socketIOPayload from './socket-io-payload';
import * as _socketIORequest from './socket-io-request';
import * as _socketIoResponse from './socket-io-response';
@@ -61,7 +60,7 @@ export const requestMeta = _requestMeta;
export const requestVersion = _requestVersion;
export const runnerTestResult = _runnerTestResult;
export const response = _response;
export const settings = _settings;
export const settings = models.settings;
export const project = _project;
export const stats = _stats;
export const unitTest = _unitTest;

View File

@@ -1,8 +1,9 @@
import { services } from '~/insomnia-data';
import type { RequestTestResult } from '../../../insomnia-scripting-environment/src/objects';
import { database as db } from '../common/database';
import * as requestOperations from '../models/helpers/request-operations';
import * as requestVersionModel from './request-version';
import * as settingsModel from './settings';
import type { BaseModel } from './types';
export const name = 'Response';
@@ -109,7 +110,7 @@ export async function getLatestForRequestId(
environmentId: string | null,
): Promise<Response | undefined> {
// Filter responses by environment if setting is enabled
const shouldFilter = (await settingsModel.get()).filterResponsesByEnv;
const shouldFilter = (await services.settings.get()).filterResponsesByEnv;
const response = await db.findOne<Response>(
type,
@@ -134,7 +135,7 @@ export async function create(patch: Partial<Response> = {}, maxResponses = 20):
const requestVersion = request ? await requestVersionModel.create(request) : null;
patch.requestVersionId = requestVersion ? requestVersion._id : null;
// Filter responses by environment if setting is enabled
const settings = await settingsModel.get();
const settings = await services.settings.get();
const shouldQueryByEnvId = 'environmentId' in patch && settings.filterResponsesByEnv;
const query = {
parentId,

View File

@@ -1,3 +1,5 @@
import { services } from '~/insomnia-data';
import { database as db } from '../common/database';
import * as requestOperations from './helpers/request-operations';
import * as models from './index';
@@ -76,7 +78,7 @@ export async function create(patch: Partial<SocketIOResponse> = {}, maxResponses
parentId,
};
if ((await models.settings.get()).filterResponsesByEnv && 'environmentId' in patch) {
if ((await services.settings.get()).filterResponsesByEnv && 'environmentId' in patch) {
query.environmentId = patch.environmentId;
}
@@ -97,7 +99,7 @@ export async function create(patch: Partial<SocketIOResponse> = {}, maxResponses
export async function getLatestForRequestId(requestId: string, environmentId: string | null) {
// Filter responses by environment if setting is enabled
const shouldFilter = (await models.settings.get()).filterResponsesByEnv;
const shouldFilter = (await services.settings.get()).filterResponsesByEnv;
const response = await db.findOne<SocketIOResponse>(
type,

View File

@@ -1,3 +1,5 @@
import { services } from '~/insomnia-data';
import { database as db } from '../common/database';
import * as requestOperations from './helpers/request-operations';
import * as models from './index';
@@ -87,7 +89,7 @@ export async function create(patch: Partial<WebSocketResponse> = {}, maxResponse
parentId,
};
if ((await models.settings.get()).filterResponsesByEnv && 'environmentId' in patch) {
if ((await services.settings.get()).filterResponsesByEnv && 'environmentId' in patch) {
query.environmentId = patch.environmentId;
}
@@ -111,7 +113,7 @@ export async function create(patch: Partial<WebSocketResponse> = {}, maxResponse
export async function getLatestForRequestId(requestId: string, environmentId: string | null) {
// Filter responses by environment if setting is enabled
const shouldFilter = (await models.settings.get()).filterResponsesByEnv;
const shouldFilter = (await services.settings.get()).filterResponsesByEnv;
const response = await db.findOne<WebSocketResponse>(
type,

View File

@@ -4,6 +4,8 @@ import nodePath from 'node:path';
import { CurlHttpVersion, CurlNetrc } from '@getinsomnia/node-libcurl';
import { beforeEach, describe, expect, it } from 'vitest';
import { services } from '~/insomnia-data';
import { CONTENT_TYPE_FILE, CONTENT_TYPE_FORM_DATA, CONTENT_TYPE_FORM_URLENCODED } from '../../common/constants';
import { filterHeaders } from '../../common/misc';
import { getRenderedRequestAndContext } from '../../common/render';
@@ -26,7 +28,7 @@ describe('sendCurlAndWriteTimeline()', () => {
it('sends a generic request', async () => {
const workspace = await models.workspace.create();
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const cookies = [
{
creation: new Date('2016-10-05T04:40:49.505Z'),
@@ -139,7 +141,7 @@ describe('sendCurlAndWriteTimeline()', () => {
it('sends a urlencoded', async () => {
const workspace = await models.workspace.create();
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const request = Object.assign(models.request.init(), {
_id: 'req_123',
parentId: workspace._id,
@@ -212,7 +214,7 @@ describe('sendCurlAndWriteTimeline()', () => {
it('skips sending and storing cookies with setting', async () => {
const workspace = await models.workspace.create();
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const cookies = [
{
creation: new Date('2016-10-05T04:40:49.505Z'),
@@ -316,8 +318,8 @@ describe('sendCurlAndWriteTimeline()', () => {
it('sends a file', async () => {
const workspace = await models.workspace.create();
let settings = await models.settings.getOrCreate();
settings = await models.settings.update(settings, { dataFolders: [nodePath.resolve(__dirname)] });
let settings = await services.settings.getOrCreate();
settings = await services.settings.update(settings, { dataFolders: [nodePath.resolve(__dirname)] });
await models.cookieJar.create({
parentId: workspace._id,
});
@@ -384,7 +386,7 @@ describe('sendCurlAndWriteTimeline()', () => {
it('sends multipart form data', async () => {
const workspace = await models.workspace.create();
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
await models.cookieJar.create({
parentId: workspace._id,
});
@@ -480,7 +482,7 @@ describe('sendCurlAndWriteTimeline()', () => {
it('uses unix socket', async () => {
const workspace = await models.workspace.create();
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const request = Object.assign(models.request.init(), {
_id: 'req_123',
parentId: workspace._id,
@@ -524,7 +526,7 @@ describe('sendCurlAndWriteTimeline()', () => {
it('uses works with HEAD', async () => {
const workspace = await models.workspace.create();
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const request = Object.assign(models.request.init(), {
_id: 'req_123',
parentId: workspace._id,
@@ -567,7 +569,7 @@ describe('sendCurlAndWriteTimeline()', () => {
it('uses works with "unix" host', async () => {
const workspace = await models.workspace.create();
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const request = Object.assign(models.request.init(), {
_id: 'req_123',
parentId: workspace._id,
@@ -610,7 +612,7 @@ describe('sendCurlAndWriteTimeline()', () => {
it('uses netrc', async () => {
const workspace = await models.workspace.create();
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const request = Object.assign(models.request.init(), {
_id: 'req_123',
parentId: workspace._id,
@@ -659,7 +661,7 @@ describe('sendCurlAndWriteTimeline()', () => {
return;
}
const workspace = await models.workspace.create();
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const cookies = [
{
creation: new Date('2016-10-05T04:40:49.505Z'),
@@ -774,7 +776,7 @@ describe('sendCurlAndWriteTimeline()', () => {
it('sets HTTP version', async () => {
const workspace = await models.workspace.create();
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const request = Object.assign(models.request.init(), {
_id: 'req_123',
parentId: workspace._id,

View File

@@ -1,7 +1,7 @@
import type { queueAsPromised } from 'fastq';
import * as fastq from 'fastq';
import type { Settings } from '~/models/settings';
import type { Settings } from '~/insomnia-data';
import type { RequestContext, RequestTestResult } from '../../../insomnia-scripting-environment/src/objects';
import type { ClientCertificate } from '../models/client-certificate';

View File

@@ -4,7 +4,7 @@ import nodePath from 'node:path';
import clone from 'clone';
import orderedJSON from 'json-order';
import { type CaCertificate, services } from '~/insomnia-data';
import { type CaCertificate, services, type Settings } from '~/insomnia-data';
import { getKVPairFromData } from '~/utils/environment-utils';
import type {
@@ -40,7 +40,6 @@ import {
type RequestParameter,
} from '../models/request';
import { isRequestGroup, type RequestGroup } from '../models/request-group';
import type { Settings } from '../models/settings';
import type { SocketIORequest } from '../models/socket-io-request';
import type { WebSocketRequest } from '../models/websocket-request';
import { isWorkspace, type Workspace } from '../models/workspace';
@@ -150,7 +149,7 @@ export const fetchRequestGroupData = async (requestGroupId: string) => {
const environment = activeEnvironment || (await models.environment.getOrCreateForParentId(workspace._id));
invariant(environment, 'failed to find environment ' + activeEnvironmentId);
const settings = await models.settings.get();
const settings = await services.settings.get();
invariant(settings, 'failed to create settings');
const clientCertificates = await models.clientCertificate.findByParentId(workspaceId);
const caCert = await services.caCertificate.getByParentId(workspaceId);
@@ -215,7 +214,7 @@ export const fetchRequestData = async (
}
}
const settings = await models.settings.get();
const settings = await services.settings.get();
invariant(settings, 'failed to create settings');
const clientCertificates = await models.clientCertificate.findByParentId(workspaceId);
const caCert = await services.caCertificate.getByParentId(workspaceId);
@@ -261,7 +260,7 @@ export const fetchMcpRequestData = async (mcpRequestId: string) => {
const environment = activeEnvironment || baseEnvironment;
invariant(environment, 'failed to find environment ' + activeEnvironmentId);
const settings = await models.settings.get();
const settings = await services.settings.get();
invariant(settings, 'failed to create settings');
const responseId = generateId('res');

View File

@@ -1,5 +1,6 @@
import { v4 as uuidv4 } from 'uuid';
import { services } from '~/insomnia-data';
import { readCurlResponse } from '~/models/helpers/response-operations';
import { RESPONSE_CODE_REASONS } from '../../common/constants';
@@ -75,7 +76,7 @@ export function init(): {
// using node-curl to send a request directly, without context render and database write for request and response
async sendRequestWithoutSideEffects(options: NodeCurlRequestOptions): Promise<NodeCurlResponseType> {
const requestId = uuidv4();
const settings = await models.settings.get();
const settings = await services.settings.get();
const settingFollowRedirects = settings?.followRedirects ? 'on' : 'off';
const { request: originRequest, caCertficatePath = null } = options;
const curlRequest =

View File

@@ -3,6 +3,7 @@ import path from 'node:path';
import electron from 'electron';
import { services } from '~/insomnia-data';
import { getBodyBuffer } from '~/models/helpers/response-operations';
import type { ParsedApiSpec } from '../common/api-specs';
@@ -198,7 +199,7 @@ export async function getPlugins(force = false): Promise<Plugin[]> {
}
if (!plugins) {
const settings = await models.settings.get();
const settings = await services.settings.get();
const allConfigs: PluginConfigMap = settings.pluginConfig;
const extraPaths = settings.pluginPath
.split(':')
@@ -414,7 +415,7 @@ export function getPluginCommonContext({
getBodyBuffer,
},
settings: {
get: models.settings.get,
get: services.settings.get,
},
},
},

View File

@@ -1,7 +1,8 @@
import Color from 'color';
import type { ThemeSettings } from '~/insomnia-data';
import { getAppDefaultTheme } from '../common/constants';
import type { ThemeSettings } from '../models/settings';
import type { Theme } from './index';
import { type ColorScheme, getThemes } from './index';

View File

@@ -19,8 +19,8 @@ import {
} from 'react-router';
import { EXTERNAL_VAULT_PLUGIN_NAME, isDevelopment } from '~/common/constants';
import { services, type Settings } from '~/insomnia-data';
import * as models from '~/models';
import type { Settings } from '~/models/settings';
import type { UserSession } from '~/models/user-session';
import { executePluginMainAction, reloadPlugins } from '~/plugins';
import { createPlugin } from '~/plugins/create';
@@ -155,7 +155,7 @@ export const useRootLoaderData = () => {
};
export async function clientLoader(_args: Route.ClientLoaderArgs) {
const settings = await models.settings.get();
const settings = await services.settings.get();
const workspaceCount = await models.workspace.count();
const userSession = await models.userSession.getOrCreate();
const cloudCredentials = await models.cloudCredential.all();
@@ -424,8 +424,8 @@ const Root = () => {
if (isYes) {
const mainJsContent = `module.exports.themes = [${JSON.stringify(parsedTheme, null, 2)}];`;
await createPlugin(`theme-${parsedTheme.name}`, mainJsContent);
const settings = await models.settings.get();
await models.settings.update(settings, {
const settings = await services.settings.get();
await services.settings.update(settings, {
theme: parsedTheme.name,
});
await reloadPlugins();

View File

@@ -7,6 +7,7 @@ import { href, redirect } from 'react-router';
import { v4 as uuidv4 } from 'uuid';
import { getContentDispositionHeader } from '~/common/misc';
import { services } from '~/insomnia-data';
import type { ResponsePatch } from '~/main/network/libcurl-promise';
import type { TimingStep } from '~/main/network/request-timing';
import * as models from '~/models';
@@ -351,7 +352,7 @@ export async function clientAction({ request, params }: Route.ClientActionArgs)
if (requestMeta?.activeResponseId) {
const response = await models.response.getById(requestMeta.activeResponseId);
if (response) {
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const activeRequest = await models.request.getById(requestId);
if (activeRequest) {

View File

@@ -118,7 +118,7 @@ export async function clientLoader({ params }: Route.ClientLoaderArgs) {
} as GrpcRequestLoaderData;
}
const activeRequestMeta = await models.requestMeta.updateOrCreateByParentId(requestId, { lastActive: Date.now() });
const { filterResponsesByEnv } = await models.settings.get();
const { filterResponsesByEnv } = await services.settings.get();
const isGraphqlWsRequest = isGraphqlSubscriptionRequest(activeRequest);
// Handle MCP requests early (like gRPC) since MCP response methods are on services

View File

@@ -8,6 +8,7 @@ import {
METHOD_GET,
METHOD_POST,
} from '~/common/constants';
import { services } from '~/insomnia-data';
import * as models from '~/models';
import type { Request, RequestBody, RequestParameter } from '~/models/request';
import { SegmentEvent } from '~/ui/analytics';
@@ -26,7 +27,7 @@ export async function clientAction({ params, request }: Route.ClientActionArgs)
req?: Request;
};
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const defaultHeaders = settings.disableAppVersionUserAgent
? []
: [

View File

@@ -140,7 +140,7 @@ export async function clientAction({ request, params }: Route.ClientActionArgs)
}
if (workspaceData.scope === 'mcp') {
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const defaultHeaders = settings.disableAppVersionUserAgent
? []
: [{ name: 'User-Agent', value: `insomnia/${getAppVersion()}` }];
@@ -198,7 +198,7 @@ export async function clientAction({ request, params }: Route.ClientActionArgs)
});
if (workspaceData.withRequest) {
const settings = await models.settings.getOrCreate();
const settings = await services.settings.getOrCreate();
const defaultHeaders = settings.disableAppVersionUserAgent
? []
: [

View File

@@ -15,9 +15,9 @@ import { href, NavLink, Outlet, useLocation, useNavigate, useParams, useRouteLoa
import * as reactUse from 'react-use';
import { getAppWebsiteBaseURL } from '~/common/constants';
import type { Settings } from '~/insomnia-data';
import { userSession } from '~/models';
import { isOwnerOfOrganization, isPersonalOrganization } from '~/models/organization';
import type { Settings } from '~/models/settings';
import { isScratchpad } from '~/models/workspace';
import { useRootLoaderData } from '~/root';
import { useWorkspaceLoaderData } from '~/routes/organization.$organizationId.project.$projectId.workspace.$workspaceId';

View File

@@ -1,5 +1,4 @@
import * as models from '~/models';
import type { Settings } from '~/models/settings';
import { services, type Settings } from '~/insomnia-data';
import { SegmentEvent } from '~/ui/analytics';
import { createFetcherSubmitHook } from '~/utils/router';
@@ -10,7 +9,7 @@ export async function clientAction({ request }: Route.ClientActionArgs) {
if ('enableAnalytics' in patch && !patch.enableAnalytics) {
window.main.trackSegmentEvent({ event: SegmentEvent.analyticsDisabled });
}
await models.settings.patch(patch);
await services.settings.patch(patch);
return null;
}

View File

@@ -5,6 +5,7 @@ import os from 'node:os';
import iconv from 'iconv-lite';
import { jarFromCookies } from '~/common/cookies';
import { services } from '~/insomnia-data';
import { getBodyBuffer } from '~/models/helpers/response-operations';
import { database as db } from '../common/database';
@@ -166,7 +167,7 @@ export default class BaseExtension {
getBodyBuffer,
},
settings: {
get: models.settings.get,
get: services.settings.get,
},
},
},

View File

@@ -2,7 +2,7 @@ import type { BinaryToTextEncoding } from 'node:crypto';
import type { Cookie } from 'tough-cookie';
import type { McpRequest } from '~/insomnia-data';
import type { McpRequest, Services } from '~/insomnia-data';
import type { getBodyBuffer } from '~/models/helpers/response-operations';
import type { CloudProviderCredential } from '../models/cloud-credential';
@@ -14,7 +14,6 @@ import type { Project } from '../models/project';
import type { Request } from '../models/request';
import type { RequestGroup } from '../models/request-group';
import type { getLatestForRequestId, Response } from '../models/response';
import type { get as getSettings } from '../models/settings';
import type { SocketIORequest } from '../models/socket-io-request';
import type { WebSocketRequest } from '../models/websocket-request';
import type { Workspace } from '../models/workspace';
@@ -295,7 +294,7 @@ export interface PluginTemplateTagContext {
getBodyBuffer: typeof getBodyBuffer;
};
settings: {
get: typeof getSettings;
get: Services['settings']['get'];
};
};
};

View File

@@ -12,6 +12,7 @@ import {
Toolbar,
} from 'react-aria-components';
import type { Settings } from '~/insomnia-data';
import { translateHandlersInScript } from '~/main/importers/importers/translate-postman-script';
import { CodeEditor, type CodeEditorHandle } from '~/ui/components/.client/codemirror/code-editor';
@@ -28,7 +29,6 @@ import {
Vault,
} from '../../../../../insomnia-scripting-environment/src/objects';
import { ParentFolders } from '../../../../../insomnia-scripting-environment/src/objects/folders';
import type { Settings } from '../../../models/settings';
import { Icon } from '../icon';
interface Props {

View File

@@ -1,6 +1,8 @@
import { exportRequestsHAR, exportWorkspacesHAR } from 'insomnia/src/common/har';
import { beforeEach, describe, expect, it } from 'vitest';
import { services } from '~/insomnia-data';
import { database as db } from '../../../../common/database';
import * as models from '../../../../models';
@@ -8,7 +10,7 @@ import * as models from '../../../../models';
describe('exportWorkspacesHAR() and exportRequestsHAR()', () => {
beforeEach(async () => {
await models.project.all();
await models.settings.getOrCreate();
await services.settings.getOrCreate();
});
it('exports a single workspace and some requests only as an HTTP Archive', async () => {

View File

@@ -1,11 +1,11 @@
import React, { type FC, useRef, useState } from 'react';
import { Heading, Tab, TabList, TabPanel, Tabs, ToggleButton } from 'react-aria-components';
import type { Settings } from '~/insomnia-data';
import { useToggleEnvironmentType } from '~/ui/hooks/use-toggle-environment-type';
import { getDataFromKVPair } from '~/utils/environment-utils';
import { type EnvironmentKvPairData, EnvironmentType } from '../../../models/environment';
import type { Settings } from '../../../models/settings';
import { getAuthObjectOrNull } from '../../../network/authentication';
import { useWorkspaceLoaderData } from '../../../routes/organization.$organizationId.project.$projectId.workspace.$workspaceId';
import { useRequestGroupLoaderData } from '../../../routes/organization.$organizationId.project.$projectId.workspace.$workspaceId.debug.request-group.$requestGroupId';

View File

@@ -4,13 +4,13 @@ import { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels';
import { useParams } from 'react-router';
import * as reactUse from 'react-use';
import type { Settings } from '~/insomnia-data';
import { OneLineEditor } from '~/ui/components/.client/codemirror/one-line-editor';
import { getContentTypeFromHeaders } from '../../../common/constants';
import * as models from '../../../models';
import { queryAllWorkspaceUrls } from '../../../models/helpers/query-all-workspace-urls';
import { getCombinedPathParametersFromUrl, type RequestParameter } from '../../../models/request';
import type { Settings } from '../../../models/settings';
import { getAuthObjectOrNull } from '../../../network/authentication';
import { useWorkspaceLoaderData } from '../../../routes/organization.$organizationId.project.$projectId.workspace.$workspaceId';
import {

View File

@@ -1,10 +1,10 @@
import { useCallback, useEffect, useState } from 'react';
import * as reactUse from 'react-use';
import type { ThemeSettings } from '~/insomnia-data';
import { useRootLoaderData } from '~/root';
import { SegmentEvent } from '~/ui/analytics';
import type { ThemeSettings } from '../../models/settings';
import { type ColorScheme, getThemes } from '../../plugins';
import { applyColorScheme, getColorScheme, type PluginTheme } from '../../plugins/misc';
import { useSettingsPatcher } from './use-request';

View File

@@ -1,6 +1,6 @@
import { useParams } from 'react-router';
import type { McpPayload, McpRequest } from '~/insomnia-data';
import type { McpPayload, McpRequest, Settings } from '~/insomnia-data';
import { useRequestUpdateActionFetcher } from '~/routes/organization.$organizationId.project.$projectId.workspace.$workspaceId.debug.request.$requestId.update';
import { useRequestUpdateMetaActionFetcher } from '~/routes/organization.$organizationId.project.$projectId.workspace.$workspaceId.debug.request.$requestId.update-meta';
import { useRequestUpdatePayloadActionFetcher } from '~/routes/organization.$organizationId.project.$projectId.workspace.$workspaceId.debug.request.$requestId.update-payload';
@@ -15,7 +15,6 @@ import type { Request } from '../../models/request';
import type { RequestGroup } from '../../models/request-group';
import type { RequestGroupMeta } from '../../models/request-group-meta';
import type { RequestMeta } from '../../models/request-meta';
import type { Settings } from '../../models/settings';
import type { SocketIOPayload } from '../../models/socket-io-payload';
import type { SocketIORequest } from '../../models/socket-io-request';
import type { WebSocketRequest } from '../../models/websocket-request';

View File

@@ -1,6 +1,6 @@
import { services } from '~/insomnia-data';
import { type RAToastContent, showToast } from '~/ui/components/toast-notification';
import * as models from '../models';
import * as plugins from '../plugins';
import * as themes from '../plugins/misc';
import * as templating from '../templating';
@@ -12,7 +12,7 @@ window.main.on('toggle-preferences', () => {
});
window.main.on('reload-plugins', async () => {
const settings = await models.settings.get();
const settings = await services.settings.get();
await plugins.reloadPlugins();
await themes.applyColorScheme(settings);
templating.reload();

View File

@@ -1,6 +1,7 @@
import { services } from '~/insomnia-data';
import { type AESMessage, decryptAES, encryptAES } from '../account/crypt';
import { getInsomniaVaultKey, PLAYWRIGHT } from '../common/constants';
import * as settings from '../models/settings';
export const base64encode = (input: string | JsonWebKey) => {
const inputStr = typeof input === 'string' ? input : JSON.stringify(input);
@@ -45,7 +46,7 @@ export async function decryptVaultKeyFromSession(vaultKey: string, toJsonWebKey:
const getVaultSecretKey = (accountId: string) => `vault_${accountId}`;
export const saveVaultKeyIfNecessary = async (accountId: string, vaultKey: string) => {
const userSetting = await settings.getOrCreate();
const userSetting = await services.settings.getOrCreate();
const { saveVaultKeyLocally } = userSetting;
if (saveVaultKeyLocally) {
await window.main.secretStorage.setSecret(getVaultSecretKey(accountId), vaultKey);

View File

@@ -4,8 +4,9 @@ import { GraphQLInfoOptions } from 'codemirror-graphql/info';
import { ModifiedGraphQLJumpOptions } from 'codemirror-graphql/jump';
import { GraphQLSchema } from 'graphql';
import type { Settings } from '~/insomnia-data';
import { HandleRender } from '../src/common/render';
import { Settings } from '../src/models/settings';
import { NunjucksParsedTag } from '../src/templating/utils';
type LinkClickCallback = (url: string) => void;