New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@codingame/monaco-vscode-timeline-service-override

Package Overview
Dependencies
Maintainers
6
Versions
110
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@codingame/monaco-vscode-timeline-service-override - npm Package Compare versions

Comparing version 7.1.0 to 7.1.1

4

package.json
{
"name": "@codingame/monaco-vscode-timeline-service-override",
"version": "7.1.0",
"version": "7.1.1",
"keywords": [],

@@ -29,4 +29,4 @@ "author": {

"dependencies": {
"vscode": "npm:@codingame/monaco-vscode-api@7.1.0"
"vscode": "npm:@codingame/monaco-vscode-api@7.1.1"
}
}

@@ -1,2 +0,2 @@

import { localizeWithPath } from 'vscode/vscode/vs/nls';
import { localize } from 'vscode/vscode/vs/nls';
import { Codicon } from 'vscode/vscode/vs/base/common/codicons';

@@ -7,3 +7,2 @@ import { language } from 'vscode/vscode/vs/base/common/platform';

const _moduleId = "vs/workbench/contrib/localHistory/browser/localHistory";
let localHistoryDateFormatter = undefined;

@@ -28,5 +27,5 @@ function getLocalHistoryDateFormatter() {

const LOCAL_HISTORY_MENU_CONTEXT_KEY = ( (ContextKeyExpr.equals('timelineItem', LOCAL_HISTORY_MENU_CONTEXT_VALUE)));
const LOCAL_HISTORY_ICON_ENTRY = registerIcon('localHistory-icon', Codicon.circleOutline, ( localizeWithPath(_moduleId, 0, "Icon for a local history entry in the timeline view.")));
const LOCAL_HISTORY_ICON_RESTORE = registerIcon('localHistory-restore', Codicon.check, ( localizeWithPath(_moduleId, 1, "Icon for restoring contents of a local history entry.")));
const LOCAL_HISTORY_ICON_ENTRY = registerIcon('localHistory-icon', Codicon.circleOutline, ( localize(10540, "Icon for a local history entry in the timeline view.")));
const LOCAL_HISTORY_ICON_RESTORE = registerIcon('localHistory-restore', Codicon.check, ( localize(10541, "Icon for restoring contents of a local history entry.")));
export { LOCAL_HISTORY_ICON_ENTRY, LOCAL_HISTORY_ICON_RESTORE, LOCAL_HISTORY_MENU_CONTEXT_KEY, LOCAL_HISTORY_MENU_CONTEXT_VALUE, getLocalHistoryDateFormatter };

@@ -1,2 +0,2 @@

import { localize2WithPath, localizeWithPath } from 'vscode/vscode/vs/nls';
import { localize2, localize } from 'vscode/vscode/vs/nls';
import { URI } from 'vscode/vscode/vs/base/common/uri';

@@ -10,3 +10,3 @@ import { Event } from 'vscode/vscode/vs/base/common/event';

import { LocalHistoryFileSystemProvider } from './localHistoryFileSystemProvider.js';
import { RawContextKey, ContextKeyExpr } from 'vscode/vscode/vs/platform/contextkey/common/contextkey';
import { ContextKeyExpr, RawContextKey } from 'vscode/vscode/vs/platform/contextkey/common/contextkey';
import { IContextKeyService } from 'vscode/vscode/vs/platform/contextkey/common/contextkey.service';

@@ -31,5 +31,5 @@ import { registerAction2, Action2, MenuId, MenuRegistry } from 'vscode/vscode/vs/platform/actions/common/actions';

const _moduleId = "vs/workbench/contrib/localHistory/browser/localHistoryCommands";
const LOCAL_HISTORY_CATEGORY = ( localize2WithPath(_moduleId, 0, 'Local History'));
const COMPARE_WITH_FILE_LABEL = ( localize2WithPath(_moduleId, 1, 'Compare with File'));
const LOCAL_HISTORY_CATEGORY = ( localize2(6786, 'Local History'));
const CTX_LOCAL_HISTORY_ENABLED = ( (ContextKeyExpr.has('config.workbench.localHistory.enabled')));
const COMPARE_WITH_FILE_LABEL = ( localize2(6787, 'Compare with File'));
registerAction2(class extends Action2 {

@@ -61,3 +61,3 @@ constructor() {

id: 'workbench.action.localHistory.compareWithPrevious',
title: ( localize2WithPath(_moduleId, 2, 'Compare with Previous')),
title: ( localize2(6788, 'Compare with Previous')),
menu: {

@@ -90,3 +90,3 @@ id: MenuId.TimelineItemContext,

id: 'workbench.action.localHistory.selectForCompare',
title: ( localize2WithPath(_moduleId, 3, 'Select for Compare')),
title: ( localize2(6789, 'Select for Compare')),
menu: {

@@ -114,3 +114,3 @@ id: MenuId.TimelineItemContext,

id: 'workbench.action.localHistory.compareWithSelected',
title: ( localize2WithPath(_moduleId, 4, 'Compare with Selected')),
title: ( localize2(6790, 'Compare with Selected')),
menu: {

@@ -144,3 +144,3 @@ id: MenuId.TimelineItemContext,

id: 'workbench.action.localHistory.open',
title: ( localize2WithPath(_moduleId, 5, 'Show Contents')),
title: ( localize2(6791, 'Show Contents')),
menu: {

@@ -163,3 +163,3 @@ id: MenuId.TimelineItemContext,

});
const RESTORE_CONTENTS_LABEL = ( localize2WithPath(_moduleId, 6, 'Restore Contents'));
const RESTORE_CONTENTS_LABEL = ( localize2(6792, 'Restore Contents'));
registerAction2(class extends Action2 {

@@ -201,3 +201,3 @@ constructor() {

});
const restoreSaveSource = SaveSourceRegistry.registerSource('localHistoryRestore.source', ( localizeWithPath(_moduleId, 7, "File Restored")));
const restoreSaveSource = SaveSourceRegistry.registerSource('localHistoryRestore.source', ( localize(6793, "File Restored")));
async function restore(accessor, item) {

@@ -213,10 +213,9 @@ const fileService = accessor.get(IFileService);

type: 'warning',
message: ( localizeWithPath(
_moduleId,
8,
message: ( localize(
6794,
"Do you want to restore the contents of '{0}'?",
basename(entry.workingCopy.resource)
)),
detail: ( localizeWithPath(_moduleId, 9, "Restoring will discard any unsaved changes.")),
primaryButton: ( localizeWithPath(_moduleId, 10, "&&Restore"))
detail: ( localize(6795, "Restoring will discard any unsaved changes.")),
primaryButton: ( localize(6796, "&&Restore"))
});

@@ -238,8 +237,3 @@ if (!confirmed) {

catch (error) {
await dialogService.error(( localizeWithPath(
_moduleId,
11,
"Unable to restore '{0}'.",
basename(entry.workingCopy.resource)
)), toErrorMessage(error));
await dialogService.error(( localize(6797, "Unable to restore '{0}'.", basename(entry.workingCopy.resource))), toErrorMessage(error));
return;

@@ -264,5 +258,6 @@ }

id: 'workbench.action.localHistory.restoreViaPicker',
title: ( localize2WithPath(_moduleId, 12, 'Find Entry to Restore')),
title: ( localize2(6798, 'Find Entry to Restore')),
f1: true,
category: LOCAL_HISTORY_CATEGORY
category: LOCAL_HISTORY_CATEGORY,
precondition: CTX_LOCAL_HISTORY_ENABLED
});

@@ -286,3 +281,3 @@ }

resourcePicker.busy = false;
resourcePicker.placeholder = ( localizeWithPath(_moduleId, 13, "Select the file to show local history for"));
resourcePicker.placeholder = ( localize(6799, "Select the file to show local history for"));
resourcePicker.matchOnLabel = true;

@@ -309,3 +304,3 @@ resourcePicker.matchOnDescription = true;

entryPicker.busy = false;
entryPicker.placeholder = ( localizeWithPath(_moduleId, 14, "Select the local history entry to open"));
entryPicker.placeholder = ( localize(6800, "Select the local history entry to open"));
entryPicker.matchOnLabel = true;

@@ -331,3 +326,3 @@ entryPicker.matchOnDescription = true;

});
MenuRegistry.appendMenuItem(MenuId.TimelineTitle, { command: { id: 'workbench.action.localHistory.restoreViaPicker', title: ( localize2WithPath(_moduleId, 15, 'Local History: Find Entry to Restore...')) }, group: 'submenu', order: 1 });
MenuRegistry.appendMenuItem(MenuId.TimelineTitle, { command: { id: 'workbench.action.localHistory.restoreViaPicker', title: ( localize2(6801, 'Local History: Find Entry to Restore...')) }, group: 'submenu', order: 1, when: CTX_LOCAL_HISTORY_ENABLED });
registerAction2(class extends Action2 {

@@ -337,3 +332,3 @@ constructor() {

id: 'workbench.action.localHistory.rename',
title: ( localize2WithPath(_moduleId, 16, 'Rename')),
title: ( localize2(6802, 'Rename')),
menu: {

@@ -353,5 +348,5 @@ id: MenuId.TimelineItemContext,

const inputBox = quickInputService.createInputBox();
inputBox.title = ( localizeWithPath(_moduleId, 17, "Rename Local History Entry"));
inputBox.title = ( localize(6803, "Rename Local History Entry"));
inputBox.ignoreFocusOut = true;
inputBox.placeholder = ( localizeWithPath(_moduleId, 18, "Enter the new name of the local history entry"));
inputBox.placeholder = ( localize(6804, "Enter the new name of the local history entry"));
inputBox.value = SaveSourceRegistry.getSourceLabel(entry.source);

@@ -372,3 +367,3 @@ inputBox.show();

id: 'workbench.action.localHistory.delete',
title: ( localize2WithPath(_moduleId, 19, 'Delete')),
title: ( localize2(6805, 'Delete')),
menu: {

@@ -390,5 +385,4 @@ id: MenuId.TimelineItemContext,

type: 'warning',
message: ( localizeWithPath(
_moduleId,
20,
message: ( localize(
6806,
"Do you want to delete the local history entry of '{0}' from {1}?",

@@ -398,4 +392,4 @@ entry.workingCopy.name,

)),
detail: ( localizeWithPath(_moduleId, 21, "This action is irreversible!")),
primaryButton: ( localizeWithPath(_moduleId, 22, "&&Delete")),
detail: ( localize(6807, "This action is irreversible!")),
primaryButton: ( localize(6808, "&&Delete")),
});

@@ -414,5 +408,6 @@ if (!confirmed) {

id: 'workbench.action.localHistory.deleteAll',
title: ( localize2WithPath(_moduleId, 23, 'Delete All')),
title: ( localize2(6809, 'Delete All')),
f1: true,
category: LOCAL_HISTORY_CATEGORY
category: LOCAL_HISTORY_CATEGORY,
precondition: CTX_LOCAL_HISTORY_ENABLED
});

@@ -425,9 +420,5 @@ }

type: 'warning',
message: ( localizeWithPath(
_moduleId,
24,
"Do you want to delete all entries of all files in local history?"
)),
detail: ( localizeWithPath(_moduleId, 25, "This action is irreversible!")),
primaryButton: ( localizeWithPath(_moduleId, 26, "&&Delete All")),
message: ( localize(6810, "Do you want to delete all entries of all files in local history?")),
detail: ( localize(6811, "This action is irreversible!")),
primaryButton: ( localize(6812, "&&Delete All")),
});

@@ -444,6 +435,6 @@ if (!confirmed) {

id: 'workbench.action.localHistory.create',
title: ( localize2WithPath(_moduleId, 27, 'Create Entry')),
title: ( localize2(6813, 'Create Entry')),
f1: true,
category: LOCAL_HISTORY_CATEGORY,
precondition: ActiveEditorContext
precondition: ( (ContextKeyExpr.and(CTX_LOCAL_HISTORY_ENABLED, ActiveEditorContext)))
});

@@ -462,7 +453,6 @@ }

const inputBox = quickInputService.createInputBox();
inputBox.title = ( localizeWithPath(_moduleId, 28, "Create Local History Entry"));
inputBox.title = ( localize(6814, "Create Local History Entry"));
inputBox.ignoreFocusOut = true;
inputBox.placeholder = ( localizeWithPath(
_moduleId,
29,
inputBox.placeholder = ( localize(
6815,
"Enter the new name of the local history entry for '{0}'",

@@ -485,5 +475,4 @@ labelService.getUriBasenameLabel(resource)

resource,
label: ( localizeWithPath(
_moduleId,
30,
label: ( localize(
6816,
"{0} ({1} • {2})",

@@ -508,5 +497,4 @@ entry.workingCopy.name,

modifiedResource = resource;
label = ( localizeWithPath(
_moduleId,
31,
label = ( localize(
6817,
"{0} ({1} • {2}) ↔ {3}",

@@ -522,5 +510,4 @@ arg1.workingCopy.name,

modifiedResource = LocalHistoryFileSystemProvider.toLocalHistoryFileSystem({ location: modified.location, associatedResource: modified.workingCopy.resource });
label = ( localizeWithPath(
_moduleId,
32,
label = ( localize(
6818,
"{0} ({1} • {2}) ↔ {3} ({4} • {5})",

@@ -527,0 +514,0 @@ arg1.workingCopy.name,

import { __decorate, __param } from 'vscode/external/tslib/tslib.es6.js';
import { localizeWithPath } from 'vscode/vscode/vs/nls';
import { localize } from 'vscode/vscode/vs/nls';
import { Emitter } from 'vscode/vscode/vs/base/common/event';

@@ -23,3 +23,2 @@ import { Disposable, MutableDisposable } from 'vscode/vscode/vs/base/common/lifecycle';

var LocalHistoryTimeline_1;
const _moduleId = "vs/workbench/contrib/localHistory/browser/localHistoryTimeline";
let LocalHistoryTimeline = class LocalHistoryTimeline extends Disposable {

@@ -39,3 +38,3 @@ static { LocalHistoryTimeline_1 = this; }

this.id = 'timeline.localHistory';
this.label = ( localizeWithPath(_moduleId, 0, "Local History"));
this.label = ( localize(6819, "Local History"));
this.scheme = '*';

@@ -42,0 +41,0 @@ this._onDidChange = this._register(( (new Emitter())));

@@ -1,2 +0,2 @@

import { localizeWithPath } from 'vscode/vscode/vs/nls';
import { localize } from 'vscode/vscode/vs/nls';
import { SyncDescriptor } from 'vscode/vscode/vs/platform/instantiation/common/descriptors';

@@ -20,5 +20,4 @@ import 'vscode/vscode/vs/platform/instantiation/common/extensions';

const _moduleId = "vs/workbench/contrib/timeline/browser/timeline.contribution";
const timelineViewIcon = registerIcon('timeline-view-icon', Codicon.history, ( localizeWithPath(_moduleId, 0, 'View icon of the timeline view.')));
const timelineOpenIcon = registerIcon('timeline-open', Codicon.history, ( localizeWithPath(_moduleId, 1, 'Icon for the open timeline action.')));
const timelineViewIcon = registerIcon('timeline-view-icon', Codicon.history, ( localize(3014, 'View icon of the timeline view.')));
const timelineOpenIcon = registerIcon('timeline-open', Codicon.history, ( localize(3015, 'Icon for the open timeline action.')));
class TimelinePaneDescriptor {

@@ -44,3 +43,3 @@ constructor() {

order: 1001,
title: ( localizeWithPath(_moduleId, 2, "Timeline")),
title: ( localize(3016, "Timeline")),
type: 'object',

@@ -51,5 +50,4 @@ properties: {

default: null,
markdownDescription: ( localizeWithPath(
_moduleId,
3,
markdownDescription: ( localize(
3017,
"The number of items to show in the Timeline view by default and when loading more items. Setting to `null` (the default) will automatically choose a page size based on the visible area of the Timeline view."

@@ -61,5 +59,4 @@ )),

default: false,
description: ( localizeWithPath(
_moduleId,
4,
description: ( localize(
3018,
"Experimental. Controls whether the Timeline view will load the next page of items when you scroll to the end of the list."

@@ -74,3 +71,3 @@ )),

OpenTimelineAction.ID = 'files.openTimeline';
OpenTimelineAction.LABEL = ( localizeWithPath(_moduleId, 5, "Open Timeline"));
OpenTimelineAction.LABEL = ( localize(3019, "Open Timeline"));
function handler() {

@@ -99,6 +96,6 @@ return (accessor, arg) => {

}));
const timelineFilter = registerIcon('timeline-filter', Codicon.filter, ( localizeWithPath(_moduleId, 6, 'Icon for the filter timeline action.')));
const timelineFilter = registerIcon('timeline-filter', Codicon.filter, ( localize(3020, 'Icon for the filter timeline action.')));
MenuRegistry.appendMenuItem(MenuId.TimelineTitle, {
submenu: MenuId.TimelineFilterSubMenu,
title: ( localizeWithPath(_moduleId, 7, "Filter Timeline")),
title: ( localize(3021, "Filter Timeline")),
group: 'navigation',

@@ -105,0 +102,0 @@ order: 100,

import { __decorate, __param } from 'vscode/external/tslib/tslib.es6.js';
import './media/timelinePane.css.js';
import { localizeWithPath, localize2WithPath } from 'vscode/vscode/vs/nls';
import { localize, localize2 } from 'vscode/vscode/vs/nls';
import { clearNode, append, $, asCSSUrl } from 'vscode/vscode/vs/base/browser/dom';

@@ -56,3 +56,2 @@ import { ActionRunner } from 'vscode/vscode/vs/base/common/actions';

const _moduleId = "vs/workbench/contrib/timeline/browser/timelinePane";
const ItemHeight = 22;

@@ -180,3 +179,3 @@ function isLoadMoreCommand(item) {

get label() {
return this.loading ? ( localizeWithPath(_moduleId, 0, "Loading...")) : ( localizeWithPath(_moduleId, 1, "Load more"));
return this.loading ? ( localize(6769, "Loading...")) : ( localize(6770, "Load more"));
}

@@ -190,3 +189,3 @@ get themeIcon() {

let TimelinePane = class TimelinePane extends ViewPane {
static { this.TITLE = ( localize2WithPath(_moduleId, 2, "Timeline")); }
static { this.TITLE = ( localize2(6771, "Timeline")); }
constructor(options, keybindingService, contextMenuService, contextKeyService, configurationService, storageService, viewDescriptorService, instantiationService, editorService, commandService, progressService, timelineService, openerService, themeService, telemetryService, hoverService, labelService, uriIdentityService, extensionService) {

@@ -627,3 +626,3 @@ super({ ...options, titleMenuId: MenuId.TimelineTitle }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, hoverService);

this.updateFilename(undefined);
this.message = ( localizeWithPath(_moduleId, 3, "The active editor cannot provide timeline information."));
this.message = ( localize(6772, "The active editor cannot provide timeline information."));
}

@@ -638,9 +637,8 @@ else if (this._isEmpty) {

if (this.timelineService.getSources().filter(({ id }) => !( (this.excludedSources.has(id)))).length === 0) {
this.message = ( localizeWithPath(_moduleId, 4, "All timeline sources have been filtered out."));
this.message = ( localize(6773, "All timeline sources have been filtered out."));
}
else {
if (this.configurationService.getValue('workbench.localHistory.enabled') && !( (this.excludedSources.has('timeline.localHistory')))) {
this.message = ( localizeWithPath(
_moduleId,
5,
this.message = ( localize(
6774,
"Local History will track recent changes as you save them unless the file has been excluded or is too large."

@@ -650,10 +648,10 @@ ));

else if (this.excludedSources.size > 0) {
this.message = ( localizeWithPath(_moduleId, 6, "No filtered timeline information was provided."));
this.message = ( localize(6775, "No filtered timeline information was provided."));
}
else {
this.message = ( localizeWithPath(_moduleId, 7, "No timeline information was provided."));
this.message = ( localize(6776, "No timeline information was provided."));
}
}
if (!scmProviderCount || scmProviderCount === 0) {
this.message += ' ' + ( localizeWithPath(_moduleId, 8, "Source Control has not been configured."));
this.message += ' ' + ( localize(6777, "Source Control has not been configured."));
}

@@ -715,3 +713,3 @@ }

this.$message.classList.add('timeline-subtle');
this.message = ( localizeWithPath(_moduleId, 3, "The active editor cannot provide timeline information."));
this.message = ( localize(6777, "The active editor cannot provide timeline information."));
this.$tree = document.createElement('div');

@@ -733,9 +731,3 @@ this.$tree.classList.add('customview-tree', 'file-icon-themable-tree', 'hide-arrows');

}
return element.accessibilityInformation ? element.accessibilityInformation.label : ( localizeWithPath(
_moduleId,
9,
"{0}: {1}",
element.relativeTimeFullWord ?? '',
element.label
));
return element.accessibilityInformation ? element.accessibilityInformation.label : ( localize(6778, "{0}: {1}", element.relativeTimeFullWord ?? '', element.label));
},

@@ -749,3 +741,3 @@ getRole(element) {

getWidgetAriaLabel() {
return ( localizeWithPath(_moduleId, 2, "Timeline"));
return ( localize(6778, "Timeline"));
}

@@ -811,3 +803,3 @@ },

this.updateFilename(file);
this.message = file ? ( localizeWithPath(_moduleId, 10, "Loading timeline for {0}...", file)) : '';
this.message = file ? ( localize(6779, "Loading timeline for {0}...", file)) : '';
}

@@ -1000,5 +992,5 @@ onContextMenu(commands, treeEvent) {

], TimelineTreeRenderer)));
const timelineRefresh = registerIcon('timeline-refresh', Codicon.refresh, ( localizeWithPath(_moduleId, 11, 'Icon for the refresh timeline action.')));
const timelinePin = registerIcon('timeline-pin', Codicon.pin, ( localizeWithPath(_moduleId, 12, 'Icon for the pin timeline action.')));
const timelineUnpin = registerIcon('timeline-unpin', Codicon.pinned, ( localizeWithPath(_moduleId, 13, 'Icon for the unpin timeline action.')));
const timelineRefresh = registerIcon('timeline-refresh', Codicon.refresh, ( localize(6780, 'Icon for the refresh timeline action.')));
const timelinePin = registerIcon('timeline-pin', Codicon.pin, ( localize(6781, 'Icon for the pin timeline action.')));
const timelineUnpin = registerIcon('timeline-unpin', Codicon.pinned, ( localize(6782, 'Icon for the unpin timeline action.')));
let TimelinePaneCommands = class TimelinePaneCommands extends Disposable {

@@ -1017,5 +1009,5 @@ constructor(pane, timelineService, storageService, contextKeyService, menuService) {

id: 'timeline.refresh',
title: ( localize2WithPath(_moduleId, 14, "Refresh")),
title: ( localize2(6783, "Refresh")),
icon: timelineRefresh,
category: ( localize2WithPath(_moduleId, 2, "Timeline")),
category: ( localize2(6783, "Timeline")),
menu: {

@@ -1036,5 +1028,5 @@ id: MenuId.TimelineTitle,

id: 'timeline.toggleFollowActiveEditor',
title: ( localize2WithPath(_moduleId, 15, 'Pin the Current Timeline')),
title: ( localize2(6784, 'Pin the Current Timeline')),
icon: timelinePin,
category: ( localize2WithPath(_moduleId, 2, "Timeline")),
category: ( localize2(6784, "Timeline")),
},

@@ -1048,5 +1040,5 @@ group: 'navigation',

id: 'timeline.toggleFollowActiveEditor',
title: ( localize2WithPath(_moduleId, 16, 'Unpin the Current Timeline')),
title: ( localize2(6785, 'Unpin the Current Timeline')),
icon: timelineUnpin,
category: ( localize2WithPath(_moduleId, 2, "Timeline")),
category: ( localize2(6785, "Timeline")),
},

@@ -1071,8 +1063,7 @@ group: 'navigation',

]);
const menu = this.menuService.createMenu(menuId, contextKeyService);
const menu = this.menuService.getMenuActions(menuId, contextKeyService, { shouldForwardArgs: true });
const primary = [];
const secondary = [];
const result = { primary, secondary };
createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, 'inline');
menu.dispose();
createAndFillInContextMenuActions(menu, result, 'inline');
return result;

@@ -1079,0 +1070,0 @@ }

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc