Skip to content

Commit

Permalink
first-class support for Url segment params in requester for #14 && ad…
Browse files Browse the repository at this point in the history
…d 2nd runner as new icon based on votes from discussions/11
  • Loading branch information
archywillhe committed Oct 7, 2023
1 parent dd427cb commit 4aa7e50
Show file tree
Hide file tree
Showing 44 changed files with 320 additions and 68 deletions.
1 change: 1 addition & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/insomnia/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
"jshint": "^2.13.6",
"jsonlint-mod-fixed": "1.7.7",
"jsonpath-plus": "^6.0.1",
"lodash": "^4.17.21",
"marked": "^5.1.1",
"mime-types": "^2.1.35",
"mocha": "^10.2.0",
Expand Down
2 changes: 2 additions & 0 deletions packages/insomnia/src/common/database.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
/* eslint-disable prefer-rest-params -- don't want to change ...arguments usage for these sensitive functions without more testing */
import electron from 'electron';
// to-do > "@seald-io/nedb": "^2.0.0",
// import NeDB from '@seald-io/nedb';
import NeDB from 'nedb';
import fsPath from 'path';
import { v4 as uuidv4 } from 'uuid';
Expand Down
1 change: 0 additions & 1 deletion packages/insomnia/src/common/import.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ export async function scanResources({
export const importPure = async (json: { resources: BaseModel[] } & any) => {
const _resources = json.resources;
// console.log("importPure", json);

return await importResourcesToProject({ _resources });
}

Expand Down
10 changes: 9 additions & 1 deletion packages/insomnia/src/common/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,10 @@ export async function getRenderContext(
},
getEnvironmentId: () => environmentId,
// It is possible for a project to not exist because this code path can be reached via Inso/insomnia-send-request which has no concept of a project.
getProjectId: () => project?._id,
getProjectId: () => {
console.log("getProjectId ??", project, ancestors, _ancestors)
return project?._id
}
};

// Generate the context we need to render
Expand Down Expand Up @@ -514,6 +517,10 @@ export async function getRenderedRequestAndContext(

// Default the proto if it doesn't exist
renderedRequest.url = setDefaultProtocol(renderedRequest.url);

// ARCHY NOTE: Recomposing the values here ?
console.log("renderedRequest", renderedRequest);

return {
context: renderContext,
request: {
Expand All @@ -539,6 +546,7 @@ export async function getRenderedRequestAndContext(
settingStoreCookies: renderedRequest.settingStoreCookies,
settingRebuildPath: renderedRequest.settingRebuildPath,
settingFollowRedirects: renderedRequest.settingFollowRedirects,
segmentParams: renderedRequest.segmentParams,
type: renderedRequest.type,
url: renderedRequest.url,
},
Expand Down
Binary file removed packages/insomnia/src/icons/icon-small.png
Binary file not shown.
Binary file modified packages/insomnia/src/icons/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion packages/insomnia/src/main.development.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ if (envDataPath) {
} else {
// Explicitly set userData folder from config because it's sketchy to rely on electron-builder to use productName, which could be changed by accident.
const defaultPath = app.getPath('userData');
const newPath = path.join(defaultPath, '../', isDevelopment() ? 'insomnium-dev-desu' : userDataFolder);
const newPath = path.join(defaultPath, '../', isDevelopment() ? 'insomnium-dev-desu3' : userDataFolder);
app.setPath('userData', newPath);
}

Expand Down
2 changes: 2 additions & 0 deletions packages/insomnia/src/models/helpers/request-operations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ export function remove(request: Request | GrpcRequest | WebSocketRequest) {
}

export function update<T extends object>(request: T, patch: Partial<T> = {}): Promise<T> {
console.log('request-operations.ts update()', patch);

// @ts-expect-error -- TSCONVERSION
if (isGrpcRequest(request)) {
// @ts-expect-error -- TSCONVERSION
Expand Down
10 changes: 10 additions & 0 deletions packages/insomnia/src/models/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,14 @@ export interface RequestParameter {
fileName?: string;
}

export interface RequestSegment {
name: string;
value: string;
disabled?: boolean;
id?: string;
fileName?: string;
}

export interface RequestBodyParameter {
name: string;
value: string;
Expand Down Expand Up @@ -107,6 +115,7 @@ export interface BaseRequest {
settingEncodeUrl: boolean;
settingRebuildPath: boolean;
settingFollowRedirects: 'global' | 'on' | 'off';
segmentParams: RequestSegment[]
}

export type Request = BaseModel & BaseRequest;
Expand Down Expand Up @@ -142,6 +151,7 @@ export function init(): BaseRequest {
settingEncodeUrl: true,
settingRebuildPath: true,
settingFollowRedirects: 'global',
segmentParams: [],
};
}

Expand Down
4 changes: 3 additions & 1 deletion packages/insomnia/src/models/websocket-request.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { database } from '../common/database';
import type { BaseModel } from '.';
import { RequestAuthentication, RequestHeader, RequestParameter } from './request';
import { RequestAuthentication, RequestHeader, RequestParameter, RequestSegment } from './request';

export const name = 'WebSocket Request';

Expand All @@ -24,6 +24,7 @@ export interface BaseWebSocketRequest {
settingStoreCookies: boolean;
settingSendCookies: boolean;
settingFollowRedirects: 'global' | 'on' | 'off';
segmentParams: RequestSegment[]
}

export type WebSocketRequest = BaseModel & BaseWebSocketRequest & { type: typeof type };
Expand All @@ -48,6 +49,7 @@ export const init = (): BaseWebSocketRequest => ({
settingSendCookies: true,
settingFollowRedirects: 'global',
description: '',
segmentParams: []
});

export const migrate = (doc: WebSocketRequest) => doc;
Expand Down
16 changes: 12 additions & 4 deletions packages/insomnia/src/network/network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@ import type { HeaderResult, ResponsePatch, ResponseTimelineEntry } from '../main
import * as models from '../models';
import { CaCertificate } from '../models/ca-certificate';
import { ClientCertificate } from '../models/client-certificate';
import type { Request, RequestAuthentication, RequestParameter } from '../models/request';
import type { Request, RequestAuthentication, RequestParameter, RequestSegment } from '../models/request';
import type { Settings } from '../models/settings';
import { isWorkspace } from '../models/workspace';
import * as pluginContexts from '../plugins/context/index';
import * as plugins from '../plugins/index';
import { guard } from '../utils/guard';
import { setDefaultProtocol } from '../utils/url/protocol';
import {
addSegValuesToUrl,
buildQueryStringFromParams,
joinUrlAndQueryString,
smartEncodeUrl,
Expand Down Expand Up @@ -96,7 +97,7 @@ export async function sendCurlAndWriteTimeline(
const requestId = renderedRequest._id;
const timeline: ResponseTimelineEntry[] = [];

const { finalUrl, socketPath } = transformUrl(renderedRequest.url, renderedRequest.parameters, renderedRequest.authentication, renderedRequest.settingEncodeUrl);
const { finalUrl, socketPath } = transformUrl(renderedRequest.url, renderedRequest.parameters, renderedRequest.segmentParams, renderedRequest.authentication, renderedRequest.settingEncodeUrl);

timeline.push({ value: `Preparing request to ${finalUrl}`, name: 'Text', timestamp: Date.now() });
timeline.push({ value: `Current time is ${new Date().toISOString()}`, name: 'Text', timestamp: Date.now() });
Expand Down Expand Up @@ -181,9 +182,10 @@ export const responseTransform = async (patch: ResponsePatch, environmentId: str
context,
);
};
export const transformUrl = (url: string, params: RequestParameter[], authentication: RequestAuthentication, shouldEncode: boolean) => {
// ARCHY NOTE: HERE IS THE ACTUAL CALL
export const transformUrl = (url: string, params: RequestParameter[], segs: RequestSegment[], authentication: RequestAuthentication, shouldEncode: boolean) => {
const authQueryParam = getAuthQueryParams(authentication);
const customUrl = joinUrlAndQueryString(url, buildQueryStringFromParams(authQueryParam ? params.concat([authQueryParam]) : params));
const customUrl = addSegValuesToUrl(joinUrlAndQueryString(url, buildQueryStringFromParams(authQueryParam ? params.concat([authQueryParam]) : params)), segs);
const isUnixSocket = customUrl.match(/https?:\/\/unix:\//);
if (!isUnixSocket) {
return { finalUrl: smartEncodeUrl(customUrl, shouldEncode) };
Expand Down Expand Up @@ -239,7 +241,12 @@ async function _applyRequestPluginHooks(
) {
const newRenderedRequest = clone(renderedRequest);


console.log("[URL]", newRenderedRequest.url);
newRenderedRequest.url = newRenderedRequest.url.replace(":desu", "a")

for (const { plugin, hook } of await plugins.getRequestHooks()) {

const context = {
...(pluginContexts.app.init(RENDER_PURPOSE_NO_RENDER) as Record<string, any>),
...pluginContexts.data.init(renderedContext.getProjectId()),
Expand All @@ -249,6 +256,7 @@ async function _applyRequestPluginHooks(
};

try {
console.log("[plugin] applying ", plugin)
await hook(context);
} catch (err) {
err.plugin = plugin;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import * as models from '../../../models/index';
import { DEFAULT_PROJECT_ID, Project } from '../../../models/project';
import { WorkspaceScopeKeys } from '../../../models/workspace';
import * as plugin from '../data';
import * as init from '../init';
import * as init from '../dataInit';

jest.mock('../../../ui/components/modals');

Expand Down
5 changes: 5 additions & 0 deletions packages/insomnia/src/plugins/context/data.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as models from '../../models';
import type { Workspace } from '../../models/workspace';
import { init as dataInit } from './dataInit';

export interface InsomniaExport {
workspace?: Workspace;
Expand All @@ -20,3 +21,7 @@ export const getWorkspaces = (activeProjectId?: string) => {
}
};

export const init = dataInit



2 changes: 2 additions & 0 deletions packages/insomnia/src/plugins/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ export async function getRequestHooks(): Promise<RequestHook[]> {
module: {},
},
hook: context => {
console.log('[header] HOOK Setting default headers');

const headers = context.request.getEnvironmentVariable('DEFAULT_HEADERS');
if (!headers) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export interface OneLineEditorProps {
readOnly?: boolean;
type?: string;
onPaste?: (text: string) => void;
isInfered?: boolean
}

export interface OneLineEditorHandle {
Expand All @@ -38,6 +39,7 @@ export const OneLineEditor = forwardRef<OneLineEditorHandle, OneLineEditorProps>
onChange,
onKeyDown,
placeholder,
isInfered,
readOnly,
type,
onPaste,
Expand Down Expand Up @@ -199,6 +201,13 @@ export const OneLineEditor = forwardRef<OneLineEditorHandle, OneLineEditorProps>
return () => codeMirror.current?.off('changes', fn);
}, [onChange]);

useEffect(() => {

if (isInfered && codeMirror.current) {
codeMirror.current?.setValue(defaultValue)
}
}, [defaultValue, isInfered])

useEffect(() => window.main.on('context-menu-command', (_, { key, tag }) =>
id === key && codeMirror.current?.replaceSelection(tag)), [id]);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
import { RequestAuthentication } from '../../../models/request';
import { SIGNATURE_METHOD_HMAC_SHA1 } from '../../../network/o-auth-1/constants';
import { GRANT_TYPE_AUTHORIZATION_CODE } from '../../../network/o-auth-2/constants';
import { useRequestPatcher } from '../../hooks/use-request';
import { useRequestSetter } from '../../hooks/use-request';
import { RequestLoaderData } from '../../routes/request';
import { Dropdown, DropdownButton, DropdownItem, DropdownSection, ItemContent } from '../base/dropdown';
import { showModal } from '../modals';
Expand Down Expand Up @@ -131,7 +131,7 @@ interface Props {
export const AuthDropdown: FC<Props> = ({ authTypes = defaultTypes, disabled = false }) => {
const { activeRequest } = useRouteLoaderData('request/:requestId') as RequestLoaderData;
const { requestId } = useParams() as { organizationId: string; projectId: string; workspaceId: string; requestId: string };
const patchRequest = useRequestPatcher();
const patchRequest = useRequestSetter();
const onClick = useCallback(async (type: AuthType) => {
if (!activeRequest || !('authentication' in activeRequest)) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { Request, RequestBody, RequestHeader, RequestParameter } from '../../../
import { deconstructQueryStringToParams } from '../../../utils/url/querystring';


import { useRequestPatcher } from '../../hooks/use-request';
import { useRequestSetter } from '../../hooks/use-request';
import { RequestLoaderData } from '../../routes/request';
import { Dropdown, DropdownButton, DropdownItem, DropdownSection, ItemContent } from '../base/dropdown';
import { AlertModal } from '../modals/alert-modal';
Expand All @@ -29,7 +29,7 @@ const EMPTY_MIME_TYPE = null;

export const ContentTypeDropdown: FC = () => {
const { activeRequest } = useRouteLoaderData('request/:requestId') as RequestLoaderData;
const patchRequest = useRequestPatcher();
const patchRequest = useRequestSetter();
const { requestId } = useParams() as { requestId: string };
const handleChangeMimeType = async (mimeType: string | null) => {
const { body } = activeRequest;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { WebSocketRequest } from '../../../models/websocket-request';
import type { RequestAction } from '../../../plugins';
import { getRequestActions } from '../../../plugins';
import * as pluginContexts from '../../../plugins/context/index';
import { useRequestMetaPatcher, useRequestPatcher } from '../../hooks/use-request';
import { useRequestMetaPatcher, useRequestSetter } from '../../hooks/use-request';
import { RootLoaderData } from '../../routes/root';
import { type DropdownProps } from '../base/dropdown';
import { Icon } from '../icon';
Expand All @@ -45,7 +45,7 @@ export const RequestActionsDropdown = ({
settings,
} = useRouteLoaderData('root') as RootLoaderData;
const patchRequestMeta = useRequestMetaPatcher();
const patchRequest = useRequestPatcher();
const patchRequest = useRequestSetter();
const { hotKeyRegistry } = settings;
const [actionPlugins, setActionPlugins] = useState<RequestAction[]>([]);
const [loadingActions, setLoadingActions] = useState<Record<string, boolean>>({});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useRouteLoaderData } from 'react-router-dom';
import { useToggle } from 'react-use';

import { toKebabCase } from '../../../../../common/misc';
import { useRequestPatcher } from '../../../../hooks/use-request';
import { useRequestSetter } from '../../../../hooks/use-request';
import { RequestLoaderData } from '../../../../routes/request';
import { RootLoaderData } from '../../../../routes/root';
import { OneLineEditor } from '../../../codemirror/one-line-editor';
Expand All @@ -23,7 +23,7 @@ export const AuthInputRow: FC<Props> = ({ label, getAutocompleteConstants, prope
} = useRouteLoaderData('root') as RootLoaderData;
const { showPasswords } = settings;
const { activeRequest: { authentication, _id: requestId } } = useRouteLoaderData('request/:requestId') as RequestLoaderData;
const patchRequest = useRequestPatcher();
const patchRequest = useRequestSetter();
const [masked, toggleMask] = useToggle(true);
const canBeMasked = !showPasswords && mask;
const isMasked = canBeMasked && masked;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useRouteLoaderData } from 'react-router-dom';

import { toKebabCase } from '../../../../../common/misc';
import { useNunjucks } from '../../../../context/nunjucks/use-nunjucks';
import { useRequestPatcher } from '../../../../hooks/use-request';
import { useRequestSetter } from '../../../../hooks/use-request';
import { RequestLoaderData } from '../../../../routes/request';
import { showModal } from '../../../modals';
import { CodePromptModal } from '../../../modals/code-prompt-modal';
Expand All @@ -30,7 +30,7 @@ interface Props {

export const AuthPrivateKeyRow: FC<Props> = ({ label, property, help }) => {
const { activeRequest: { authentication, _id: requestId } } = useRouteLoaderData('request/:requestId') as RequestLoaderData;
const patchRequest = useRequestPatcher();
const patchRequest = useRequestSetter();
const { handleGetRenderContext, handleRender } = useNunjucks();

const privateKey = authentication[property];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, { ChangeEvent, FC, ReactNode, useCallback } from 'react';
import { useRouteLoaderData } from 'react-router-dom';

import { toKebabCase } from '../../../../../common/misc';
import { useRequestPatcher } from '../../../../hooks/use-request';
import { useRequestSetter } from '../../../../hooks/use-request';
import { RequestLoaderData } from '../../../../routes/request';
import { AuthRow } from './auth-row';

Expand All @@ -19,7 +19,7 @@ interface Props {

export const AuthSelectRow: FC<Props> = ({ label, property, help, options, disabled }) => {
const { activeRequest: { authentication, _id: requestId } } = useRouteLoaderData('request/:requestId') as RequestLoaderData;
const patchRequest = useRequestPatcher();
const patchRequest = useRequestSetter();

const selectedValue = authentication.hasOwnProperty(property) ? authentication[property] : options[0].value;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, { FC, ReactNode, useCallback } from 'react';
import { useRouteLoaderData } from 'react-router-dom';

import { toKebabCase } from '../../../../../common/misc';
import { useRequestPatcher } from '../../../../hooks/use-request';
import { useRequestSetter } from '../../../../hooks/use-request';
import { RequestLoaderData } from '../../../../routes/request';
import { AuthRow } from './auth-row';

Expand All @@ -28,7 +28,7 @@ export const AuthToggleRow: FC<Props> = ({
disabled = false,
}) => {
const { activeRequest: { authentication, _id: requestId } } = useRouteLoaderData('request/:requestId') as RequestLoaderData;
const patchRequest = useRequestPatcher();
const patchRequest = useRequestSetter();

const databaseValue = Boolean(authentication[property]);
const toggle = useCallback((value?: boolean) => patchRequest(requestId, { authentication: { ...authentication, [property]: value } }), [authentication, patchRequest, property, requestId]);
Expand Down
Loading

0 comments on commit 4aa7e50

Please sign in to comment.