mirror of
https://github.com/bitwarden/browser
synced 2026-02-09 05:00:10 +00:00
Merge branch 'main' into auth/pm-19555/defect-clicking-log-out-button
This commit is contained in:
28
.github/workflows/build-web.yml
vendored
28
.github/workflows/build-web.yml
vendored
@@ -133,12 +133,34 @@ jobs:
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
|
||||
- name: Get Latest Server Version
|
||||
id: latest-server-version
|
||||
uses: bitwarden/gh-actions/get-release-version@main
|
||||
with:
|
||||
repository: bitwarden/server
|
||||
trim: false
|
||||
|
||||
- name: Set Server Ref
|
||||
id: set-server-ref
|
||||
run: |
|
||||
SERVER_REF="${{ steps.latest-server-version.outputs.version }}"
|
||||
echo "Latest server release version: $SERVER_REF"
|
||||
if [[ "$GITHUB_REF" == "refs/heads/main" ]]; then
|
||||
SERVER_REF="$GITHUB_REF"
|
||||
elif [[ "$GITHUB_REF" == "refs/heads/rc" ]]; then
|
||||
SERVER_REF="$GITHUB_REF"
|
||||
elif [[ "$GITHUB_EVENT_NAME" == "pull_request" ]]; then
|
||||
SERVER_REF="refs/heads/main"
|
||||
fi
|
||||
echo "Server ref: $SERVER_REF"
|
||||
echo "server_ref=$SERVER_REF" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Check out Server repo
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
path: server
|
||||
repository: bitwarden/server
|
||||
ref: ${{ github.event.pull_request.head.sha && 'main' || github.ref }}
|
||||
ref: ${{ steps.set-server-ref.outputs.server_ref }}
|
||||
|
||||
- name: Check Branch to Publish
|
||||
env:
|
||||
@@ -160,7 +182,7 @@ jobs:
|
||||
VERSION=$( jq -r ".version" package.json)
|
||||
jq --arg version "$VERSION+${GITHUB_SHA:0:7}" '.version = $version' package.json > package.json.tmp
|
||||
mv package.json.tmp package.json
|
||||
|
||||
|
||||
########## Set up Docker ##########
|
||||
- name: Set up Docker
|
||||
uses: docker/setup-docker-action@b60f85385d03ac8acfca6d9996982511d8620a19 # v4.3.0
|
||||
@@ -304,7 +326,7 @@ jobs:
|
||||
- name: Log out of Docker
|
||||
run: docker logout $_AZ_REGISTRY
|
||||
|
||||
|
||||
|
||||
crowdin-push:
|
||||
name: Crowdin Push
|
||||
if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main'
|
||||
|
||||
12
apps/desktop/desktop_native/Cargo.lock
generated
12
apps/desktop/desktop_native/Cargo.lock
generated
@@ -2110,18 +2110,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pin-project"
|
||||
version = "1.1.8"
|
||||
version = "1.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916"
|
||||
checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a"
|
||||
dependencies = [
|
||||
"pin-project-internal",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-internal"
|
||||
version = "1.1.8"
|
||||
version = "1.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb"
|
||||
checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -3022,9 +3022,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.17.0"
|
||||
version = "1.18.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
|
||||
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
|
||||
|
||||
[[package]]
|
||||
name = "uds_windows"
|
||||
|
||||
@@ -35,7 +35,7 @@ napi-build = "=2.1.4"
|
||||
napi-derive = "=2.16.13"
|
||||
oo7 = "=0.3.3"
|
||||
oslog = "=0.2.0"
|
||||
pin-project = "=1.1.8"
|
||||
pin-project = "=1.1.10"
|
||||
pkcs8 = "=0.10.2"
|
||||
rand = "=0.8.5"
|
||||
rsa = "=0.9.8"
|
||||
@@ -54,7 +54,7 @@ thiserror = "=1.0.69"
|
||||
tokio = "=1.43.1"
|
||||
tokio-stream = "=0.1.15"
|
||||
tokio-util = "=0.7.13"
|
||||
typenum = "=1.17.0"
|
||||
typenum = "=1.18.0"
|
||||
uniffi = "=0.28.3"
|
||||
widestring = "=1.1.0"
|
||||
windows = "=0.61.1"
|
||||
|
||||
@@ -56,7 +56,6 @@ import { UnsecuredWebsitesReportComponent as OrgUnsecuredWebsitesReportComponent
|
||||
import { WeakPasswordsReportComponent as OrgWeakPasswordsReportComponent } from "../tools/reports/pages/organizations/weak-passwords-report.component";
|
||||
/* eslint no-restricted-imports: "error" */
|
||||
import { PremiumBadgeComponent } from "../vault/components/premium-badge.component";
|
||||
import { AddEditCustomFieldsComponent } from "../vault/individual-vault/add-edit-custom-fields.component";
|
||||
import { FolderAddEditComponent } from "../vault/individual-vault/folder-add-edit.component";
|
||||
import { OrganizationBadgeModule } from "../vault/individual-vault/organization-badge/organization-badge.module";
|
||||
import { PipesModule } from "../vault/individual-vault/pipes/pipes.module";
|
||||
@@ -96,8 +95,6 @@ import { SharedModule } from "./shared.module";
|
||||
declarations: [
|
||||
AcceptFamilySponsorshipComponent,
|
||||
AccountComponent,
|
||||
AddEditCustomFieldsComponent,
|
||||
AddEditCustomFieldsComponent,
|
||||
ApiKeyComponent,
|
||||
ChangeEmailComponent,
|
||||
DeauthorizeSessionsComponent,
|
||||
@@ -144,8 +141,6 @@ import { SharedModule } from "./shared.module";
|
||||
UserVerificationModule,
|
||||
PremiumBadgeComponent,
|
||||
AccountComponent,
|
||||
AddEditCustomFieldsComponent,
|
||||
AddEditCustomFieldsComponent,
|
||||
ApiKeyComponent,
|
||||
ChangeEmailComponent,
|
||||
DeauthorizeSessionsComponent,
|
||||
|
||||
@@ -1,177 +0,0 @@
|
||||
<ng-container>
|
||||
<h3 class="mt-4">{{ "customFields" | i18n }}</h3>
|
||||
<div cdkDropList (cdkDropListDropped)="drop($event)" *ngIf="cipher.hasFields">
|
||||
<div
|
||||
role="group"
|
||||
class="row"
|
||||
cdkDrag
|
||||
*ngFor="let f of cipher.fields; let i = index; trackBy: trackByFunction"
|
||||
attr.aria-label="{{ f.name }}"
|
||||
>
|
||||
<div class="col-5 form-group">
|
||||
<div class="d-flex">
|
||||
<label for="fieldName{{ i }}">{{ "name" | i18n }}</label>
|
||||
<a
|
||||
class="ml-auto"
|
||||
href="https://bitwarden.com/help/custom-fields/"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
appA11yTitle="{{ 'learnMore' | i18n }}"
|
||||
>
|
||||
<i class="bwi bwi-question-circle" aria-hidden="true"></i>
|
||||
</a>
|
||||
</div>
|
||||
<input
|
||||
id="fieldName{{ i }}"
|
||||
type="text"
|
||||
name="Field.Name{{ i }}"
|
||||
[(ngModel)]="f.name"
|
||||
class="form-control"
|
||||
appInputVerbatim
|
||||
[disabled]="cipher.isDeleted || viewOnly"
|
||||
[readonly]="!cipher.edit && editMode"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-7 form-group">
|
||||
<label for="fieldValue{{ i }}">{{ "value" | i18n }}</label>
|
||||
<div class="d-flex align-items-center">
|
||||
<!-- Text -->
|
||||
<div class="input-group" *ngIf="f.type === fieldType.Text">
|
||||
<input
|
||||
id="fieldValue{{ i }}"
|
||||
class="form-control"
|
||||
type="text"
|
||||
name="Field.Value{{ i }}"
|
||||
[(ngModel)]="f.value"
|
||||
appInputVerbatim
|
||||
[disabled]="cipher.isDeleted || viewOnly"
|
||||
[readonly]="!cipher.edit && editMode"
|
||||
attr.aria-describedby="fieldName{{ i }}"
|
||||
/>
|
||||
<div class="input-group-append">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-outline-secondary"
|
||||
appA11yTitle="{{ 'copyValue' | i18n }}"
|
||||
(click)="copy(f.value, 'value', 'Field')"
|
||||
>
|
||||
<i class="bwi bwi-lg bwi-clone" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Hidden -->
|
||||
<div class="input-group" *ngIf="f.type === fieldType.Hidden">
|
||||
<input
|
||||
id="fieldValue{{ i }}"
|
||||
type="{{ f.showValue ? 'text' : 'password' }}"
|
||||
name="Field.Value{{ i }}"
|
||||
[(ngModel)]="f.value"
|
||||
class="form-control text-monospace"
|
||||
appInputVerbatim
|
||||
autocomplete="new-password"
|
||||
[disabled]="cipher.isDeleted || viewOnly || (!cipher.viewPassword && !f.newField)"
|
||||
[readonly]="!cipher.edit && editMode"
|
||||
attr.aria-describedby="fieldName{{ i }}"
|
||||
/>
|
||||
<div class="input-group-append">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-outline-secondary"
|
||||
appA11yTitle="{{ 'toggleVisibility' | i18n }}"
|
||||
(click)="toggleFieldValue(f)"
|
||||
[disabled]="!cipher.viewPassword && !f.newField"
|
||||
>
|
||||
<i
|
||||
class="bwi bwi-lg"
|
||||
aria-hidden="true"
|
||||
[ngClass]="{ 'bwi-eye': !f.showValue, 'bwi-eye-slash': f.showValue }"
|
||||
>
|
||||
</i>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-outline-secondary"
|
||||
appA11yTitle="{{ 'copyValue' | i18n }}"
|
||||
(click)="copy(f.value, 'value', f.type === fieldType.Hidden ? 'H_Field' : 'Field')"
|
||||
[disabled]="!cipher.viewPassword && !f.newField"
|
||||
>
|
||||
<i class="bwi bwi-lg bwi-clone" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Linked -->
|
||||
<div class="input-group" *ngIf="f.type === fieldType.Linked">
|
||||
<select
|
||||
id="fieldValue{{ i }}"
|
||||
name="Field.Value{{ i }}"
|
||||
class="form-control"
|
||||
[(ngModel)]="f.linkedId"
|
||||
*ngIf="f.type === fieldType.Linked && cipher.linkedFieldOptions != null"
|
||||
[disabled]="cipher.isDeleted || viewOnly"
|
||||
attr.aria-describedby="fieldName{{ i }}"
|
||||
>
|
||||
<option *ngFor="let o of linkedFieldOptions" [ngValue]="o.value">{{ o.name }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="flex-fill">
|
||||
<!-- Boolean -->
|
||||
<input
|
||||
id="fieldValue{{ i }}"
|
||||
name="Field.Value{{ i }}"
|
||||
type="checkbox"
|
||||
[(ngModel)]="f.value"
|
||||
*ngIf="f.type === fieldType.Boolean"
|
||||
appTrueFalseValue
|
||||
trueValue="true"
|
||||
falseValue="false"
|
||||
[disabled]="cipher.isDeleted || viewOnly"
|
||||
attr.aria-describedby="fieldName{{ i }}"
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-link text-danger ml-2"
|
||||
(click)="removeField(f)"
|
||||
appA11yTitle="{{ 'remove' | i18n }}"
|
||||
*ngIf="!cipher.isDeleted && !viewOnly && !(!cipher.edit && editMode)"
|
||||
>
|
||||
<i class="bwi bwi-minus-circle bwi-lg" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-link text-muted cursor-move"
|
||||
appA11yTitle="{{ 'dragToSort' | i18n }}"
|
||||
*ngIf="!cipher.isDeleted && !viewOnly && !(!cipher.edit && editMode)"
|
||||
>
|
||||
<i class="bwi bwi-hamburger bwi-lg" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Add new custom field -->
|
||||
<a
|
||||
bitLink
|
||||
href="#"
|
||||
appStopClick
|
||||
(click)="addField()"
|
||||
class="d-inline-block mb-2"
|
||||
*ngIf="!cipher.isDeleted && !viewOnly && !(!cipher.edit && editMode)"
|
||||
>
|
||||
<i class="bwi bwi-plus-circle bwi-fw" aria-hidden="true"></i> {{ "newCustomField" | i18n }}
|
||||
</a>
|
||||
<div class="row" *ngIf="!cipher.isDeleted && !viewOnly && !(!cipher.edit && editMode)">
|
||||
<div class="col-5">
|
||||
<label for="addFieldType" class="tw-sr-only">{{ "type" | i18n }}</label>
|
||||
<select id="addFieldType" class="form-control" name="AddFieldType" [(ngModel)]="addFieldType">
|
||||
<option *ngFor="let o of addFieldTypeOptions" [ngValue]="o.value">{{ o.name }}</option>
|
||||
<option
|
||||
*ngIf="cipher.linkedFieldOptions != null"
|
||||
[ngValue]="addFieldLinkedTypeOption.value"
|
||||
>
|
||||
{{ addFieldLinkedTypeOption.name }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
@@ -1,20 +0,0 @@
|
||||
// FIXME: Update this file to be type safe and remove this and next line
|
||||
// @ts-strict-ignore
|
||||
import { Component, Input } from "@angular/core";
|
||||
|
||||
import { AddEditCustomFieldsComponent as BaseAddEditCustomFieldsComponent } from "@bitwarden/angular/vault/components/add-edit-custom-fields.component";
|
||||
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
|
||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||
|
||||
@Component({
|
||||
selector: "app-vault-add-edit-custom-fields",
|
||||
templateUrl: "add-edit-custom-fields.component.html",
|
||||
})
|
||||
export class AddEditCustomFieldsComponent extends BaseAddEditCustomFieldsComponent {
|
||||
@Input() viewOnly: boolean;
|
||||
@Input() copy: (value: string, typeI18nKey: string, aType: string) => void;
|
||||
|
||||
constructor(i18nService: I18nService, eventCollectionService: EventCollectionService) {
|
||||
super(i18nService, eventCollectionService);
|
||||
}
|
||||
}
|
||||
@@ -15,18 +15,16 @@
|
||||
</head>
|
||||
|
||||
<body class="layout_frontend">
|
||||
<div class="mt-5 d-flex justify-content-center">
|
||||
<div>
|
||||
<img src="../images/logo-dark@2x.png" class="mb-4 logo" alt="Bitwarden" />
|
||||
<div id="content">
|
||||
<p class="text-center">
|
||||
<i
|
||||
class="bwi bwi-spinner bwi-spin bwi-2x text-muted"
|
||||
title="Loading"
|
||||
aria-hidden="true"
|
||||
></i>
|
||||
</p>
|
||||
</div>
|
||||
<div class="tw-p-8 tw-flex tw-flex-col tw-items-center">
|
||||
<img class="new-logo-themed tw-mb-4" alt="Bitwarden" />
|
||||
<div id="content">
|
||||
<p class="tw-text-center">
|
||||
<i
|
||||
class="bwi bwi-spinner bwi-spin bwi-2x tw-text-muted"
|
||||
title="Loading"
|
||||
aria-hidden="true"
|
||||
></i>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
@import "../scss/styles.scss";
|
||||
119
apps/web/src/connectors/sso.spec.ts
Normal file
119
apps/web/src/connectors/sso.spec.ts
Normal file
@@ -0,0 +1,119 @@
|
||||
import { initiateWebAppSso, initiateBrowserSso } from "./sso";
|
||||
|
||||
describe("sso", () => {
|
||||
let originalLocation: Location;
|
||||
let originalPostMessage: any;
|
||||
let postMessageSpy: jest.SpyInstance;
|
||||
|
||||
beforeEach(() => {
|
||||
// Save original window methods
|
||||
originalLocation = window.location;
|
||||
originalPostMessage = window.postMessage;
|
||||
|
||||
// Mock location
|
||||
Object.defineProperty(window, "location", {
|
||||
value: {
|
||||
href: "",
|
||||
origin: "https://test.bitwarden.com",
|
||||
},
|
||||
writable: true,
|
||||
});
|
||||
|
||||
// Mock postMessage
|
||||
postMessageSpy = jest.spyOn(window, "postMessage");
|
||||
|
||||
// Set up document
|
||||
document.cookie = "ssoHandOffMessage=SSO login successful;SameSite=strict";
|
||||
const contentElement = document.createElement("div");
|
||||
contentElement.id = "content";
|
||||
document.body.appendChild(contentElement);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// Restore original window methods
|
||||
Object.defineProperty(window, "location", { value: originalLocation });
|
||||
window.postMessage = originalPostMessage;
|
||||
|
||||
// Clean up document
|
||||
const contentElement = document.getElementById("content");
|
||||
if (contentElement) {
|
||||
document.body.removeChild(contentElement);
|
||||
}
|
||||
document.cookie = "ssoHandOffMessage=;SameSite=strict;max-age=0";
|
||||
|
||||
// Clear mocks
|
||||
jest.clearAllMocks();
|
||||
});
|
||||
|
||||
describe("initiateWebAppSso", () => {
|
||||
it("redirects to the SSO component with code and state", () => {
|
||||
const code = "testcode";
|
||||
const state = "teststate";
|
||||
|
||||
initiateWebAppSso(code, state);
|
||||
|
||||
expect(window.location.href).toBe(
|
||||
"https://test.bitwarden.com/#/sso?code=testcode&state=teststate",
|
||||
);
|
||||
});
|
||||
|
||||
it("redirects to the return URI when included in state", () => {
|
||||
const code = "testcode";
|
||||
const state = "teststate_returnUri='/organizations'";
|
||||
|
||||
initiateWebAppSso(code, state);
|
||||
|
||||
expect(window.location.href).toBe("https://test.bitwarden.com/#/organizations");
|
||||
});
|
||||
|
||||
it("handles empty code parameter", () => {
|
||||
initiateWebAppSso("", "teststate");
|
||||
expect(window.location.href).toBe("https://test.bitwarden.com/#/sso?code=&state=teststate");
|
||||
});
|
||||
|
||||
it("handles empty state parameter", () => {
|
||||
initiateWebAppSso("testcode", "");
|
||||
expect(window.location.href).toBe("https://test.bitwarden.com/#/sso?code=testcode&state=");
|
||||
});
|
||||
});
|
||||
|
||||
describe("initiateBrowserSso", () => {
|
||||
it("posts message with code and state", () => {
|
||||
const code = "testcode";
|
||||
const state = "teststate";
|
||||
const lastpass = false;
|
||||
|
||||
initiateBrowserSso(code, state, lastpass);
|
||||
|
||||
expect(postMessageSpy).toHaveBeenCalledWith(
|
||||
{ command: "authResult", code, state, lastpass },
|
||||
window.location.origin,
|
||||
);
|
||||
});
|
||||
|
||||
it("updates content with message from cookie", () => {
|
||||
const code = "testcode";
|
||||
const state = "teststate";
|
||||
const lastpass = false;
|
||||
|
||||
initiateBrowserSso(code, state, lastpass);
|
||||
|
||||
const contentElement = document.getElementById("content");
|
||||
const paragraphElement = contentElement?.querySelector("p");
|
||||
expect(paragraphElement?.innerText).toBe("SSO login successful");
|
||||
});
|
||||
|
||||
it("handles lastpass flag correctly", () => {
|
||||
const code = "testcode";
|
||||
const state = "teststate";
|
||||
const lastpass = true;
|
||||
|
||||
initiateBrowserSso(code, state, lastpass);
|
||||
|
||||
expect(postMessageSpy).toHaveBeenCalledWith(
|
||||
{ command: "authResult", code, state, lastpass },
|
||||
window.location.origin,
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -2,10 +2,6 @@
|
||||
// @ts-strict-ignore
|
||||
import { getQsParam } from "./common";
|
||||
|
||||
// FIXME: Remove when updating file. Eslint update
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
require("./sso.scss");
|
||||
|
||||
window.addEventListener("load", () => {
|
||||
const code = getQsParam("code");
|
||||
const state = getQsParam("state");
|
||||
@@ -20,7 +16,7 @@ window.addEventListener("load", () => {
|
||||
}
|
||||
});
|
||||
|
||||
function initiateWebAppSso(code: string, state: string) {
|
||||
export function initiateWebAppSso(code: string, state: string) {
|
||||
// If we've initiated SSO from somewhere other than the SSO component on the web app, the SSO component will add
|
||||
// a _returnUri to the state variable. Here we're extracting that URI and sending the user there instead of to the SSO component.
|
||||
const returnUri = extractFromRegex(state, "(?<=_returnUri=')(.*)(?=')");
|
||||
@@ -31,7 +27,7 @@ function initiateWebAppSso(code: string, state: string) {
|
||||
}
|
||||
}
|
||||
|
||||
function initiateBrowserSso(code: string, state: string, lastpass: boolean) {
|
||||
export function initiateBrowserSso(code: string, state: string, lastpass: boolean) {
|
||||
window.postMessage({ command: "authResult", code, state, lastpass }, window.location.origin);
|
||||
const handOffMessage = ("; " + document.cookie)
|
||||
.split("; ssoHandOffMessage=")
|
||||
|
||||
@@ -422,18 +422,9 @@
|
||||
"folder": {
|
||||
"message": "Folder"
|
||||
},
|
||||
"newCustomField": {
|
||||
"message": "New custom field"
|
||||
},
|
||||
"value": {
|
||||
"message": "Value"
|
||||
},
|
||||
"dragToSort": {
|
||||
"message": "Drag to sort"
|
||||
},
|
||||
"dragToReorder": {
|
||||
"message": "Drag to reorder"
|
||||
},
|
||||
"cfTypeText": {
|
||||
"message": "Text"
|
||||
},
|
||||
|
||||
@@ -122,7 +122,7 @@ const plugins = [
|
||||
new HtmlWebpackPlugin({
|
||||
template: "./src/connectors/sso.html",
|
||||
filename: "sso-connector.html",
|
||||
chunks: ["connectors/sso"],
|
||||
chunks: ["connectors/sso", "styles"],
|
||||
}),
|
||||
new HtmlWebpackPlugin({
|
||||
template: "./src/connectors/redirect.html",
|
||||
|
||||
735
package-lock.json
generated
735
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
12
package.json
12
package.json
@@ -44,7 +44,7 @@
|
||||
"@babel/preset-env": "7.24.8",
|
||||
"@compodoc/compodoc": "1.1.26",
|
||||
"@electron/notarize": "2.5.0",
|
||||
"@electron/rebuild": "3.7.1",
|
||||
"@electron/rebuild": "3.7.2",
|
||||
"@lit-labs/signals": "0.1.2",
|
||||
"@ngtools/webpack": "18.2.12",
|
||||
"@storybook/addon-a11y": "8.5.2",
|
||||
@@ -100,12 +100,12 @@
|
||||
"electron-store": "8.2.0",
|
||||
"electron-updater": "6.3.9",
|
||||
"eslint": "8.57.1",
|
||||
"eslint-config-prettier": "10.0.1",
|
||||
"eslint-import-resolver-typescript": "3.7.0",
|
||||
"eslint-config-prettier": "10.1.2",
|
||||
"eslint-import-resolver-typescript": "3.10.1",
|
||||
"eslint-plugin-import": "2.31.0",
|
||||
"eslint-plugin-rxjs": "5.0.3",
|
||||
"eslint-plugin-rxjs-angular": "2.0.1",
|
||||
"eslint-plugin-storybook": "0.11.2",
|
||||
"eslint-plugin-storybook": "0.12.0",
|
||||
"eslint-plugin-tailwindcss": "3.18.0",
|
||||
"html-loader": "5.1.0",
|
||||
"html-webpack-injector": "1.1.4",
|
||||
@@ -116,7 +116,7 @@
|
||||
"jest-mock-extended": "3.0.7",
|
||||
"jest-preset-angular": "14.1.1",
|
||||
"json5": "2.2.3",
|
||||
"lint-staged": "15.4.1",
|
||||
"lint-staged": "15.5.1",
|
||||
"mini-css-extract-plugin": "2.9.2",
|
||||
"nx": "20.8.0",
|
||||
"postcss": "8.5.1",
|
||||
@@ -136,7 +136,7 @@
|
||||
"tsconfig-paths-webpack-plugin": "4.2.0",
|
||||
"type-fest": "2.19.0",
|
||||
"typescript": "5.4.2",
|
||||
"typescript-eslint": "8.20.0",
|
||||
"typescript-eslint": "8.30.1",
|
||||
"typescript-strict-plugin": "2.4.4",
|
||||
"url": "0.11.4",
|
||||
"util": "0.12.5",
|
||||
|
||||
Reference in New Issue
Block a user