refactor: make global environment a versioned entity (#4216)

Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com>
This commit is contained in:
Palak Chopra
2024-09-23 17:01:14 +05:30
committed by GitHub
parent 1701961335
commit bfe3b3a9c3
17 changed files with 337 additions and 138 deletions

View File

@@ -205,7 +205,7 @@
</span> </span>
</div> </div>
<div <div
v-for="(variable, index) in globalEnvs" v-for="(variable, index) in globalEnvs.variables"
:key="index" :key="index"
class="flex flex-1 space-x-4" class="flex flex-1 space-x-4"
> >
@@ -219,7 +219,10 @@
</template> </template>
</span> </span>
</div> </div>
<div v-if="globalEnvs.length === 0" class="text-secondaryLight"> <div
v-if="globalEnvs.variables.length === 0"
class="text-secondaryLight"
>
{{ t("environment.empty_variables") }} {{ t("environment.empty_variables") }}
</div> </div>
</div> </div>
@@ -292,37 +295,36 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, ref, watch } from "vue" import { useColorMode } from "@composables/theming"
import IconCheck from "~icons/lucide/check" import { Environment, GlobalEnvironment } from "@hoppscotch/data"
import IconLayers from "~icons/lucide/layers" import { breakpointsTailwind, useBreakpoints } from "@vueuse/core"
import IconEye from "~icons/lucide/eye" import { useService } from "dioc/vue"
import IconEdit from "~icons/lucide/edit" import { computed, onMounted, ref, watch } from "vue"
import IconGlobe from "~icons/lucide/globe"
import { TippyComponent } from "vue-tippy" import { TippyComponent } from "vue-tippy"
import { useI18n } from "~/composables/i18n" import { useI18n } from "~/composables/i18n"
import { GQLError } from "~/helpers/backend/GQLClient"
import { useReadonlyStream, useStream } from "~/composables/stream" import { useReadonlyStream, useStream } from "~/composables/stream"
import { invokeAction } from "~/helpers/actions"
import { GQLError } from "~/helpers/backend/GQLClient"
import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
import { TeamEnvironment } from "~/helpers/teams/TeamEnvironment"
import TeamEnvironmentAdapter from "~/helpers/teams/TeamEnvironmentAdapter"
import { import {
environments$, environments$,
globalEnv$, globalEnv$,
selectedEnvironmentIndex$, selectedEnvironmentIndex$,
setSelectedEnvironmentIndex, setSelectedEnvironmentIndex,
} from "~/newstore/environments" } from "~/newstore/environments"
import TeamEnvironmentAdapter from "~/helpers/teams/TeamEnvironmentAdapter"
import { useColorMode } from "@composables/theming"
import { breakpointsTailwind, useBreakpoints } from "@vueuse/core"
import { invokeAction } from "~/helpers/actions"
import { TeamEnvironment } from "~/helpers/teams/TeamEnvironment"
import { Environment } from "@hoppscotch/data"
import { onMounted } from "vue"
import { useLocalState } from "~/newstore/localstate" import { useLocalState } from "~/newstore/localstate"
import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
import { useService } from "dioc/vue"
import { WorkspaceService } from "~/services/workspace.service" import { WorkspaceService } from "~/services/workspace.service"
import { import {
sortPersonalEnvironmentsAlphabetically, sortPersonalEnvironmentsAlphabetically,
sortTeamEnvironmentsAlphabetically, sortTeamEnvironmentsAlphabetically,
} from "~/helpers/utils/sortEnvironmentsAlphabetically" } from "~/helpers/utils/sortEnvironmentsAlphabetically"
import IconCheck from "~icons/lucide/check"
import IconEdit from "~icons/lucide/edit"
import IconEye from "~icons/lucide/eye"
import IconGlobe from "~icons/lucide/globe"
import IconLayers from "~icons/lucide/layers"
type Scope = type Scope =
| { | {
@@ -600,7 +602,7 @@ const getErrorMessage = (err: GQLError<string>) => {
} }
} }
const globalEnvs = useReadonlyStream(globalEnv$, []) const globalEnvs = useReadonlyStream(globalEnv$, {} as GlobalEnvironment)
const environmentVariables = computed(() => { const environmentVariables = computed(() => {
if (selectedEnv.value.variables) { if (selectedEnv.value.variables) {

View File

@@ -48,7 +48,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { useReadonlyStream, useStream } from "@composables/stream" import { useReadonlyStream, useStream } from "@composables/stream"
import { Environment } from "@hoppscotch/data" import { Environment, GlobalEnvironment } from "@hoppscotch/data"
import { useService } from "dioc/vue" import { useService } from "dioc/vue"
import * as TE from "fp-ts/TaskEither" import * as TE from "fp-ts/TaskEither"
import { pipe } from "fp-ts/function" import { pipe } from "fp-ts/function"
@@ -86,13 +86,13 @@ const environmentType = ref<EnvironmentsChooseType>({
selectedTeam: undefined, selectedTeam: undefined,
}) })
const globalEnv = useReadonlyStream(globalEnv$, []) const globalEnv = useReadonlyStream(globalEnv$, {} as GlobalEnvironment)
const globalEnvironment = computed(() => ({ const globalEnvironment = computed<GlobalEnvironment>(() => ({
v: 1 as const, v: 1 as const,
id: "Global", id: "Global",
name: "Global", name: "Global",
variables: globalEnv.value, variables: globalEnv.value.variables,
})) }))
const isPersonalEnvironmentType = computed( const isPersonalEnvironmentType = computed(
@@ -252,7 +252,7 @@ defineActionHandler("modals.environment.delete-selected", () => {
const additionalVars = ref<Environment["variables"]>([]) const additionalVars = ref<Environment["variables"]>([])
const envVars = () => [...globalEnv.value, ...additionalVars.value] const envVars = () => [...globalEnv.value.variables, ...additionalVars.value]
defineActionHandler( defineActionHandler(
"modals.global.environment.update", "modals.global.environment.update",

View File

@@ -133,21 +133,27 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import IconTrash2 from "~icons/lucide/trash-2" import { useI18n } from "@composables/i18n"
import IconDone from "~icons/lucide/check" import { useReadonlyStream } from "@composables/stream"
import IconPlus from "~icons/lucide/plus" import { useColorMode } from "@composables/theming"
import IconTrash from "~icons/lucide/trash" import { useToast } from "@composables/toast"
import IconHelpCircle from "~icons/lucide/help-circle" import {
import { ComputedRef, computed, ref, watch } from "vue" Environment,
import * as E from "fp-ts/Either" GlobalEnvironment,
import * as A from "fp-ts/Array" parseTemplateStringE,
import * as O from "fp-ts/Option" } from "@hoppscotch/data"
import { pipe, flow } from "fp-ts/function"
import { Environment, parseTemplateStringE } from "@hoppscotch/data"
import { refAutoReset } from "@vueuse/core" import { refAutoReset } from "@vueuse/core"
import { useService } from "dioc/vue"
import * as A from "fp-ts/Array"
import * as E from "fp-ts/Either"
import * as O from "fp-ts/Option"
import { flow, pipe } from "fp-ts/function"
import { ComputedRef, computed, ref, watch } from "vue"
import { uniqueID } from "~/helpers/utils/uniqueID"
import { import {
createEnvironment, createEnvironment,
environments$, environments$,
environmentsStore,
getEnvironment, getEnvironment,
getGlobalVariables, getGlobalVariables,
globalEnv$, globalEnv$,
@@ -155,15 +161,13 @@ import {
setSelectedEnvironmentIndex, setSelectedEnvironmentIndex,
updateEnvironment, updateEnvironment,
} from "~/newstore/environments" } from "~/newstore/environments"
import { useI18n } from "@composables/i18n"
import { useToast } from "@composables/toast"
import { useReadonlyStream } from "@composables/stream"
import { useColorMode } from "@composables/theming"
import { environmentsStore } from "~/newstore/environments"
import { platform } from "~/platform" import { platform } from "~/platform"
import { useService } from "dioc/vue"
import { SecretEnvironmentService } from "~/services/secret-environment.service" import { SecretEnvironmentService } from "~/services/secret-environment.service"
import { uniqueID } from "~/helpers/utils/uniqueID" import IconDone from "~icons/lucide/check"
import IconHelpCircle from "~icons/lucide/help-circle"
import IconPlus from "~icons/lucide/plus"
import IconTrash from "~icons/lucide/trash"
import IconTrash2 from "~icons/lucide/trash-2"
type EnvironmentVariable = { type EnvironmentVariable = {
id: number id: number
@@ -257,7 +261,7 @@ const clearIcon = refAutoReset<typeof IconTrash2 | typeof IconDone>(
1000 1000
) )
const globalVars = useReadonlyStream(globalEnv$, []) const globalVars = useReadonlyStream(globalEnv$, {} as GlobalEnvironment)
type SelectedEnv = "variables" | "secret" type SelectedEnv = "variables" | "secret"
@@ -315,10 +319,20 @@ const liveEnvs = computed(() => {
} }
return [ return [
...vars.value.map((x) => ({ ...x.env, source: editingName.value! })), ...vars.value.map((x) => ({ ...x.env, source: editingName.value! })),
...globalVars.value.map((x) => ({ ...x, source: "Global" })), ...globalVars.value.variables.map((x) => ({ ...x, source: "Global" })),
] ]
}) })
const workingEnvID = computed(() => {
const activeEnv = workingEnv.value
if (activeEnv && "id" in activeEnv) {
return activeEnv.id
}
return uniqueID()
})
watch( watch(
() => props.show, () => props.show,
(show) => { (show) => {
@@ -329,7 +343,7 @@ watch(
: "variables" : "variables"
if (props.editingEnvironmentIndex !== "Global") { if (props.editingEnvironmentIndex !== "Global") {
editingID.value = workingEnv.value?.id || uniqueID() editingID.value = workingEnvID.value
} }
vars.value = pipe( vars.value = pipe(
workingEnv.value?.variables ?? [], workingEnv.value?.variables ?? [],
@@ -341,7 +355,7 @@ watch(
? secretEnvironmentService.getSecretEnvironmentVariable( ? secretEnvironmentService.getSecretEnvironmentVariable(
props.editingEnvironmentIndex === "Global" props.editingEnvironmentIndex === "Global"
? "Global" ? "Global"
: workingEnv.value?.id, : workingEnvID.value,
index index
)?.value ?? "" )?.value ?? ""
: e.value, : e.value,
@@ -448,7 +462,7 @@ const saveEnvironment = () => {
}) })
} else if (props.editingEnvironmentIndex === "Global") { } else if (props.editingEnvironmentIndex === "Global") {
// Editing the Global environment // Editing the Global environment
setGlobalEnvVariables(environmentUpdated.variables) setGlobalEnvVariables(environmentUpdated)
toast.success(`${t("environment.updated")}`) toast.success(`${t("environment.updated")}`)
} else if (props.editingEnvironmentIndex !== null) { } else if (props.editingEnvironmentIndex !== null) {
const envID = const envID =

View File

@@ -204,27 +204,28 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, Ref, ref } from "vue"
import { isEqual } from "lodash-es"
import { useReadonlyStream, useStream } from "@composables/stream"
import { useI18n } from "@composables/i18n" import { useI18n } from "@composables/i18n"
import { useReadonlyStream, useStream } from "@composables/stream"
import { isEqual } from "lodash-es"
import { computed, ref } from "vue"
import { HoppTestResult } from "~/helpers/types/HoppTestResult"
import { import {
globalEnv$, globalEnv$,
selectedEnvironmentIndex$, selectedEnvironmentIndex$,
setSelectedEnvironmentIndex, setSelectedEnvironmentIndex,
} from "~/newstore/environments" } from "~/newstore/environments"
import { HoppTestResult } from "~/helpers/types/HoppTestResult"
import IconTrash2 from "~icons/lucide/trash-2"
import IconExternalLink from "~icons/lucide/external-link"
import IconCheck from "~icons/lucide/check" import IconCheck from "~icons/lucide/check"
import IconExternalLink from "~icons/lucide/external-link"
import IconTrash2 from "~icons/lucide/trash-2"
import IconClose from "~icons/lucide/x" import IconClose from "~icons/lucide/x"
import { useColorMode } from "~/composables/theming" import { GlobalEnvironment } from "@hoppscotch/data"
import { useVModel } from "@vueuse/core" import { useVModel } from "@vueuse/core"
import { useService } from "dioc/vue" import { useService } from "dioc/vue"
import { WorkspaceService } from "~/services/workspace.service" import { useColorMode } from "~/composables/theming"
import { invokeAction } from "~/helpers/actions" import { invokeAction } from "~/helpers/actions"
import { WorkspaceService } from "~/services/workspace.service"
const props = defineProps<{ const props = defineProps<{
modelValue: HoppTestResult | null | undefined modelValue: HoppTestResult | null | undefined
@@ -282,12 +283,7 @@ const selectedEnvironmentIndex = useStream(
setSelectedEnvironmentIndex setSelectedEnvironmentIndex
) )
const globalEnvVars = useReadonlyStream(globalEnv$, []) as Ref< const globalEnvVars = useReadonlyStream(globalEnv$, {} as GlobalEnvironment)
Array<{
key: string
value: string
}>
>
const noEnvSelected = computed( const noEnvSelected = computed(
() => selectedEnvironmentIndex.value.type === "NO_ENV_SELECTED" () => selectedEnvironmentIndex.value.type === "NO_ENV_SELECTED"
@@ -297,7 +293,8 @@ const globalHasAdditions = computed(() => {
if (!testResults.value?.envDiff.selected.additions) return false if (!testResults.value?.envDiff.selected.additions) return false
return ( return (
testResults.value.envDiff.selected.additions.every( testResults.value.envDiff.selected.additions.every(
(x) => globalEnvVars.value.findIndex((y) => isEqual(x, y)) !== -1 (x) =>
globalEnvVars.value.variables.findIndex((y) => isEqual(x, y)) !== -1
) ?? false ) ?? false
) )
}) })

View File

@@ -303,12 +303,15 @@ export function runRESTRequest$(
tab.value.document.testResults = tab.value.document.testResults =
translateToSandboxTestResults(updatedRunResult) translateToSandboxTestResults(updatedRunResult)
setGlobalEnvVariables( const globalEnvVariables = updateEnvironmentsWithSecret(
updateEnvironmentsWithSecret( runResult.right.envs.global,
runResult.right.envs.global, "global"
"global"
)
) )
setGlobalEnvVariables({
v: 1,
variables: globalEnvVariables,
})
if ( if (
environmentsStore.value.selectedEnvironmentIndex.type === "MY_ENV" environmentsStore.value.selectedEnvironmentIndex.type === "MY_ENV"
) { ) {

View File

@@ -1,4 +1,8 @@
import { Environment } from "@hoppscotch/data" import {
Environment,
GlobalEnvironment,
GlobalEnvironmentVariable,
} from "@hoppscotch/data"
import { cloneDeep, isEqual } from "lodash-es" import { cloneDeep, isEqual } from "lodash-es"
import { combineLatest, Observable } from "rxjs" import { combineLatest, Observable } from "rxjs"
import { distinctUntilChanged, map, pluck } from "rxjs/operators" import { distinctUntilChanged, map, pluck } from "rxjs/operators"
@@ -19,6 +23,11 @@ export type SelectedEnvironmentIndex =
environment: Environment environment: Environment
} }
const defaultGlobalEnvironmentState: GlobalEnvironment = {
v: 1,
variables: [],
}
const defaultEnvironmentsState = { const defaultEnvironmentsState = {
environments: [ environments: [
{ {
@@ -31,7 +40,7 @@ const defaultEnvironmentsState = {
// as a temp fix for identifying global env when syncing // as a temp fix for identifying global env when syncing
globalEnvID: undefined as string | undefined, globalEnvID: undefined as string | undefined,
globals: [] as Environment["variables"], globals: defaultGlobalEnvironmentState,
selectedEnvironmentIndex: { selectedEnvironmentIndex: {
type: "NO_ENV_SELECTED", type: "NO_ENV_SELECTED",
@@ -277,7 +286,7 @@ const dispatchers = defineDispatchers({
), ),
} }
}, },
setGlobalVariables(_, { entries }: { entries: Environment["variables"] }) { setGlobalVariables(_, { entries }: { entries: GlobalEnvironment }) {
return { return {
globals: entries, globals: entries,
} }
@@ -285,20 +294,26 @@ const dispatchers = defineDispatchers({
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
clearGlobalVariables(_store, {}) { clearGlobalVariables(_store, {}) {
return { return {
globals: [], globals: defaultGlobalEnvironmentState,
} }
}, },
addGlobalVariable( addGlobalVariable(
{ globals }, { globals },
{ entry }: { entry: Environment["variables"][number] } { entry }: { entry: GlobalEnvironmentVariable }
) { ) {
return { return {
globals: [...globals, entry], globals: {
...globals,
variables: [...globals.variables, entry],
},
} }
}, },
removeGlobalVariable({ globals }, { envIndex }: { envIndex: number }) { removeGlobalVariable({ globals }, { envIndex }: { envIndex: number }) {
return { return {
globals: globals.filter((_, i) => i !== envIndex), globals: {
...globals,
variables: globals.variables.filter((_, i) => i !== envIndex),
},
} }
}, },
updateGlobalVariable( updateGlobalVariable(
@@ -306,10 +321,15 @@ const dispatchers = defineDispatchers({
{ {
envIndex, envIndex,
updatedEntry, updatedEntry,
}: { envIndex: number; updatedEntry: Environment["variables"][number] } }: { envIndex: number; updatedEntry: GlobalEnvironmentVariable }
) { ) {
return { return {
globals: globals.map((x, i) => (i !== envIndex ? x : updatedEntry)), globals: {
...globals,
variables: globals.variables.map((x, i) =>
i !== envIndex ? x : updatedEntry
),
},
} }
}, },
setGlobalEnvID(_, { id }: { id: string }) { setGlobalEnvID(_, { id }: { id: string }) {
@@ -390,12 +410,19 @@ export const aggregateEnvs$: Observable<AggregateEnvironment[]> = combineLatest(
map(([selectedEnv, globalVars]) => { map(([selectedEnv, globalVars]) => {
const results: AggregateEnvironment[] = [] const results: AggregateEnvironment[] = []
selectedEnv?.variables.forEach(({ key, value, secret }) => selectedEnv?.variables.forEach((variable) => {
const { key, secret } = variable
const value = "value" in variable ? variable.value : ""
results.push({ key, value, secret, sourceEnv: selectedEnv.name }) results.push({ key, value, secret, sourceEnv: selectedEnv.name })
) })
globalVars.forEach(({ key, value, secret }) =>
globalVars.variables.forEach((variable) => {
const { key, secret } = variable
const value = "value" in variable ? variable.value : ""
results.push({ key, value, secret, sourceEnv: "Global" }) results.push({ key, value, secret, sourceEnv: "Global" })
) })
return results return results
}), }),
@@ -496,7 +523,7 @@ export const aggregateEnvsWithSecrets$: Observable<AggregateEnvironment[]> =
}) })
}) })
globalVars.map((x, index) => { globalVars.variables.map((x, index) => {
let value let value
if (x.secret) { if (x.secret) {
value = secretEnvironmentService.getSecretEnvironmentVariableValue( value = secretEnvironmentService.getSecretEnvironmentVariableValue(
@@ -568,19 +595,19 @@ export function getLegacyGlobalEnvironment(): Environment | null {
return el ?? null return el ?? null
} }
export function getGlobalVariables(): Environment["variables"] { export function getGlobalVariables(): GlobalEnvironmentVariable[] {
return environmentsStore.value.globals.map( return environmentsStore.value.globals.variables.map(
(env: Environment["variables"][number]) => { (env: GlobalEnvironmentVariable) => {
if (env.key && "value" in env && !("secret" in env)) { if (env.key && "value" in env && !("secret" in env)) {
return { return {
...(env as Environment["variables"][number]), ...(env as GlobalEnvironmentVariable),
secret: false, secret: false,
} }
} }
return env return env
} }
) as Environment["variables"] ) as GlobalEnvironmentVariable[]
} }
export function getGlobalVariableID() { export function getGlobalVariableID() {
@@ -595,7 +622,7 @@ export function getLocalIndexByEnvironmentID(id: string) {
return envIndex !== -1 ? envIndex : null return envIndex !== -1 ? envIndex : null
} }
export function addGlobalEnvVariable(entry: Environment["variables"][number]) { export function addGlobalEnvVariable(entry: GlobalEnvironmentVariable) {
environmentsStore.dispatch({ environmentsStore.dispatch({
dispatcher: "addGlobalVariable", dispatcher: "addGlobalVariable",
payload: { payload: {
@@ -604,7 +631,7 @@ export function addGlobalEnvVariable(entry: Environment["variables"][number]) {
}) })
} }
export function setGlobalEnvVariables(entries: Environment["variables"]) { export function setGlobalEnvVariables(entries: GlobalEnvironment) {
environmentsStore.dispatch({ environmentsStore.dispatch({
dispatcher: "setGlobalVariables", dispatcher: "setGlobalVariables",
payload: { payload: {
@@ -631,7 +658,7 @@ export function removeGlobalEnvVariable(envIndex: number) {
export function updateGlobalEnvVariable( export function updateGlobalEnvVariable(
envIndex: number, envIndex: number,
updatedEntry: Environment["variables"][number] updatedEntry: GlobalEnvironmentVariable
) { ) {
environmentsStore.dispatch({ environmentsStore.dispatch({
dispatcher: "updateGlobalVariable", dispatcher: "updateGlobalVariable",

View File

@@ -1,5 +1,6 @@
import { import {
Environment, Environment,
GlobalEnvironment,
HoppCollection, HoppCollection,
RESTReqSchemaVersion, RESTReqSchemaVersion,
} from "@hoppscotch/data" } from "@hoppscotch/data"
@@ -115,9 +116,10 @@ export const MQTT_REQUEST_MOCK = {
clientID: "hoppscotch", clientID: "hoppscotch",
} }
export const GLOBAL_ENV_MOCK: Environment["variables"] = [ export const GLOBAL_ENV_MOCK: GlobalEnvironment = {
{ key: "test-key", value: "test-value", secret: false }, v: 1,
] variables: [{ key: "test-key", value: "test-value", secret: false }],
}
export const VUEX_DATA_MOCK: VUEX_DATA = { export const VUEX_DATA_MOCK: VUEX_DATA = {
postwoman: { postwoman: {

View File

@@ -1469,9 +1469,9 @@ describe("PersistenceService", () => {
// Invalid shape for `globalEnv` // Invalid shape for `globalEnv`
const globalEnv = [ const globalEnv = [
{ {
...GLOBAL_ENV_MOCK[0],
// `key` -> `string` // `key` -> `string`
key: 1, key: 1,
value: "test-value",
}, },
] ]

View File

@@ -2,6 +2,8 @@
import { import {
Environment, Environment,
GlobalEnvironment,
GlobalEnvironmentVariable,
translateToNewGQLCollection, translateToNewGQLCollection,
translateToNewRESTCollection, translateToNewRESTCollection,
} from "@hoppscotch/data" } from "@hoppscotch/data"
@@ -51,9 +53,9 @@ import {
performSettingsDataMigrations, performSettingsDataMigrations,
settingsStore, settingsStore,
} from "../../newstore/settings" } from "../../newstore/settings"
import { SecretEnvironmentService } from "../secret-environment.service"
import { import {
ENVIRONMENTS_SCHEMA, ENVIRONMENTS_SCHEMA,
GLOBAL_ENV_SCHEMA,
GQL_COLLECTION_SCHEMA, GQL_COLLECTION_SCHEMA,
GQL_HISTORY_ENTRY_SCHEMA, GQL_HISTORY_ENTRY_SCHEMA,
GQL_TAB_STATE_SCHEMA, GQL_TAB_STATE_SCHEMA,
@@ -63,16 +65,15 @@ import {
REST_COLLECTION_SCHEMA, REST_COLLECTION_SCHEMA,
REST_HISTORY_ENTRY_SCHEMA, REST_HISTORY_ENTRY_SCHEMA,
REST_TAB_STATE_SCHEMA, REST_TAB_STATE_SCHEMA,
SECRET_ENVIRONMENT_VARIABLE_SCHEMA,
SELECTED_ENV_INDEX_SCHEMA, SELECTED_ENV_INDEX_SCHEMA,
SETTINGS_SCHEMA, SETTINGS_SCHEMA,
SOCKET_IO_REQUEST_SCHEMA, SOCKET_IO_REQUEST_SCHEMA,
SSE_REQUEST_SCHEMA, SSE_REQUEST_SCHEMA,
SECRET_ENVIRONMENT_VARIABLE_SCHEMA,
THEME_COLOR_SCHEMA, THEME_COLOR_SCHEMA,
VUEX_SCHEMA, VUEX_SCHEMA,
WEBSOCKET_REQUEST_SCHEMA, WEBSOCKET_REQUEST_SCHEMA,
} from "./validation-schemas" } from "./validation-schemas"
import { SecretEnvironmentService } from "../secret-environment.service"
/** /**
* This service compiles persistence logic across the codebase * This service compiles persistence logic across the codebase
@@ -421,9 +422,8 @@ export class PersistenceService extends Service {
if (globalIndex !== -1) { if (globalIndex !== -1) {
const globalEnv = environmentsData[globalIndex] const globalEnv = environmentsData[globalIndex]
globalEnv.variables.forEach( globalEnv.variables.forEach((variable: GlobalEnvironmentVariable) =>
(variable: Environment["variables"][number]) => addGlobalEnvVariable(variable)
addGlobalEnvVariable(variable)
) )
// Remove global from environments // Remove global from environments
@@ -627,14 +627,14 @@ export class PersistenceService extends Service {
private setupGlobalEnvsPersistence() { private setupGlobalEnvsPersistence() {
const globalEnvKey = "globalEnv" const globalEnvKey = "globalEnv"
let globalEnvData: z.infer<typeof GLOBAL_ENV_SCHEMA> = JSON.parse( let globalEnvData: GlobalEnvironment = JSON.parse(
window.localStorage.getItem(globalEnvKey) || "[]" window.localStorage.getItem(globalEnvKey) || "[]"
) )
// Validate data read from localStorage // Validate data read from localStorage
const result = GLOBAL_ENV_SCHEMA.safeParse(globalEnvData) const result = GlobalEnvironment.safeParse(globalEnvData)
if (result.success) { if (result.type === "ok") {
globalEnvData = result.data globalEnvData = result.value
} else { } else {
this.showErrorToast(globalEnvKey) this.showErrorToast(globalEnvKey)
window.localStorage.setItem( window.localStorage.setItem(
@@ -643,7 +643,7 @@ export class PersistenceService extends Service {
) )
} }
setGlobalEnvVariables(globalEnvData as Environment["variables"]) setGlobalEnvVariables(globalEnvData)
globalEnv$.subscribe((vars) => { globalEnv$.subscribe((vars) => {
window.localStorage.setItem(globalEnvKey, JSON.stringify(vars)) window.localStorage.setItem(globalEnvKey, JSON.stringify(vars))

View File

@@ -249,8 +249,6 @@ const EnvironmentVariablesSchema = z.union([
}), }),
]) ])
export const GLOBAL_ENV_SCHEMA = z.array(EnvironmentVariablesSchema)
const OperationTypeSchema = z.enum([ const OperationTypeSchema = z.enum([
"subscription", "subscription",
"query", "query",

View File

@@ -0,0 +1,33 @@
import { InferredEntity, createVersionedEntity } from "verzod"
import { z } from "zod"
import V0_VERSION from "./v/0"
import V1_VERSION from "./v/1"
const versionedObject = z.object({
v: z.number(),
})
export const GlobalEnvironment = createVersionedEntity({
latestVersion: 1,
versionMap: {
0: V0_VERSION,
1: V1_VERSION,
},
getVersion(data) {
const versionCheck = versionedObject.safeParse(data)
if (versionCheck.success) return versionCheck.data.v
// For V0 we have to check the schema
const result = V0_VERSION.schema.safeParse(data)
return result.success ? 0 : null
},
})
export type GlobalEnvironment = InferredEntity<typeof GlobalEnvironment>
export type GlobalEnvironmentVariable = InferredEntity<
typeof GlobalEnvironment
>["variables"][number]

View File

@@ -0,0 +1,25 @@
import { z } from "zod"
import { defineVersion } from "verzod"
export const V0_SCHEMA = z.array(
z.union([
z.object({
key: z.string(),
value: z.string(),
secret: z.literal(false),
}),
z.object({
key: z.string(),
secret: z.literal(true),
}),
z.object({
key: z.string(),
value: z.string(),
}),
])
)
export default defineVersion({
initial: true,
schema: V0_SCHEMA,
})

View File

@@ -0,0 +1,46 @@
import { z } from "zod"
import { defineVersion } from "verzod"
import { V0_SCHEMA } from "./0"
export const V1_SCHEMA = z.object({
v: z.literal(1),
variables: z.array(
z.union([
z.object({
key: z.string(),
secret: z.literal(true),
}),
z.object({
key: z.string(),
value: z.string(),
secret: z.literal(false),
}),
])
),
})
export default defineVersion({
initial: false,
schema: V1_SCHEMA,
up(old: z.infer<typeof V0_SCHEMA>) {
const variables = old.map((variable) => {
if ("value" in variable) {
return {
key: variable.key,
value: variable.value,
secret: false,
}
}
return {
key: variable.key,
secret: true,
}
})
return <z.infer<typeof V1_SCHEMA>>{
v: 1,
variables,
}
},
})

View File

@@ -3,3 +3,4 @@ export * from "./graphql"
export * from "./collection" export * from "./collection"
export * from "./rawKeyValue" export * from "./rawKeyValue"
export * from "./environment" export * from "./environment"
export * from "./global-environment"

View File

@@ -37,6 +37,7 @@
"rxjs": "7.8.1", "rxjs": "7.8.1",
"stream-browserify": "3.0.0", "stream-browserify": "3.0.0",
"util": "0.12.5", "util": "0.12.5",
"verzod": "0.2.2",
"vue": "3.3.9", "vue": "3.3.9",
"workbox-window": "7.0.0", "workbox-window": "7.0.0",
"zod": "3.22.4" "zod": "3.22.4"

View File

@@ -1,4 +1,6 @@
import { authEvents$, def as platformAuth } from "@platform/auth/auth.platform" import * as E from "fp-ts/Either"
import { entityReference } from "verzod"
import { import {
createEnvironment, createEnvironment,
deleteEnvironment, deleteEnvironment,
@@ -9,13 +11,14 @@ import {
setGlobalEnvVariables, setGlobalEnvVariables,
updateEnvironment, updateEnvironment,
} from "@hoppscotch/common/newstore/environments" } from "@hoppscotch/common/newstore/environments"
import { authEvents$, def as platformAuth } from "@platform/auth/auth.platform"
import { EnvironmentsPlatformDef } from "@hoppscotch/common/src/platform/environments"
import { runGQLSubscription } from "@hoppscotch/common/helpers/backend/GQLClient" import { runGQLSubscription } from "@hoppscotch/common/helpers/backend/GQLClient"
import { EnvironmentsPlatformDef } from "@hoppscotch/common/src/platform/environments"
import { environnmentsSyncer } from "@platform/environments/environments.sync" import { environnmentsSyncer } from "@platform/environments/environments.sync"
import * as E from "fp-ts/Either" import { GlobalEnvironment } from "@hoppscotch/data"
import { runDispatchWithOutSyncing } from "@lib/sync" import { runDispatchWithOutSyncing } from "@lib/sync"
import { import {
createUserGlobalEnvironment, createUserGlobalEnvironment,
@@ -99,8 +102,16 @@ async function loadGlobalEnvironments() {
const globalEnv = res.right.me.globalEnvironments const globalEnv = res.right.me.globalEnvironments
if (globalEnv) { if (globalEnv) {
const globalEnvVariableEntries = JSON.parse(globalEnv.variables)
const result = entityReference(GlobalEnvironment).safeParse(
globalEnvVariableEntries
)
runDispatchWithOutSyncing(() => { runDispatchWithOutSyncing(() => {
setGlobalEnvVariables(JSON.parse(globalEnv.variables)) setGlobalEnvVariables(
result.success ? result.data : globalEnvVariableEntries
)
setGlobalEnvID(globalEnv.id) setGlobalEnvID(globalEnv.id)
}) })
} }

95
pnpm-lock.yaml generated
View File

@@ -380,7 +380,7 @@ importers:
version: 3.2.5 version: 3.2.5
tsup: tsup:
specifier: 8.0.2 specifier: 8.0.2
version: 8.0.2(@swc/core@1.4.2)(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3) version: 8.0.2(@swc/core@1.4.2)(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3)
typescript: typescript:
specifier: 5.3.3 specifier: 5.3.3
version: 5.3.3 version: 5.3.3
@@ -789,7 +789,7 @@ importers:
version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)
vite-plugin-checker: vite-plugin-checker:
specifier: 0.6.2 specifier: 0.6.2
version: 0.6.2(eslint@8.57.0)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)) version: 0.6.2(eslint@8.57.0)(meow@8.1.2)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2))
vite-plugin-fonts: vite-plugin-fonts:
specifier: 0.7.0 specifier: 0.7.0
version: 0.7.0(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) version: 0.7.0(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))
@@ -908,7 +908,7 @@ importers:
version: 2.8.4 version: 2.8.4
ts-jest: ts-jest:
specifier: 27.1.5 specifier: 27.1.5
version: 27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5) version: 27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5)
typescript: typescript:
specifier: 4.9.5 specifier: 4.9.5
version: 4.9.5 version: 4.9.5
@@ -1092,7 +1092,7 @@ importers:
version: 0.14.9(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16) version: 0.14.9(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16)
unplugin-vue-components: unplugin-vue-components:
specifier: 0.21.0 specifier: 0.21.0
version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2))
vite: vite:
specifier: 4.5.0 specifier: 4.5.0
version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)
@@ -1101,7 +1101,7 @@ importers:
version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))
vite-plugin-inspect: vite-plugin-inspect:
specifier: 0.7.38 specifier: 0.7.38
version: 0.7.38(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) version: 0.7.38(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))
vite-plugin-pages: vite-plugin-pages:
specifier: 0.26.0 specifier: 0.26.0
version: 0.26.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) version: 0.26.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))
@@ -1165,6 +1165,9 @@ importers:
util: util:
specifier: 0.12.5 specifier: 0.12.5
version: 0.12.5 version: 0.12.5
verzod:
specifier: 0.2.2
version: 0.2.2(zod@3.22.4)
vue: vue:
specifier: 3.3.9 specifier: 3.3.9
version: 3.3.9(typescript@5.3.2) version: 3.3.9(typescript@5.3.2)
@@ -1261,7 +1264,7 @@ importers:
version: 0.17.4(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16) version: 0.17.4(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16)
unplugin-vue-components: unplugin-vue-components:
specifier: 0.25.2 specifier: 0.25.2
version: 0.25.2(@babel/parser@7.24.5)(rollup@4.17.2)(vue@3.3.9(typescript@5.3.2)) version: 0.25.2(@babel/parser@7.24.5)(rollup@3.29.4)(vue@3.3.9(typescript@5.3.2))
vite: vite:
specifier: 4.5.0 specifier: 4.5.0
version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)
@@ -1273,7 +1276,7 @@ importers:
version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))
vite-plugin-inspect: vite-plugin-inspect:
specifier: 0.7.42 specifier: 0.7.42
version: 0.7.42(rollup@4.17.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) version: 0.7.42(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))
vite-plugin-pages: vite-plugin-pages:
specifier: 0.31.0 specifier: 0.31.0
version: 0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) version: 0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))
@@ -1315,7 +1318,7 @@ importers:
version: 0.1.0(vue@3.3.9(typescript@4.9.3)) version: 0.1.0(vue@3.3.9(typescript@4.9.3))
'@intlify/unplugin-vue-i18n': '@intlify/unplugin-vue-i18n':
specifier: 1.2.0 specifier: 1.2.0
version: 1.2.0(rollup@2.79.1)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) version: 1.2.0(rollup@3.29.4)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))
'@types/cors': '@types/cors':
specifier: 2.8.13 specifier: 2.8.13
version: 2.8.13 version: 2.8.13
@@ -1381,7 +1384,7 @@ importers:
version: 0.14.9(@vue/compiler-sfc@3.2.45)(vue-template-compiler@2.7.16) version: 0.14.9(@vue/compiler-sfc@3.2.45)(vue-template-compiler@2.7.16)
unplugin-vue-components: unplugin-vue-components:
specifier: 0.21.0 specifier: 0.21.0
version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2))
vue: vue:
specifier: 3.3.9 specifier: 3.3.9
version: 3.3.9(typescript@4.9.3) version: 3.3.9(typescript@4.9.3)
@@ -15971,11 +15974,11 @@ snapshots:
'@intlify/shared@9.8.0': {} '@intlify/shared@9.8.0': {}
'@intlify/unplugin-vue-i18n@1.2.0(rollup@2.79.1)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))': '@intlify/unplugin-vue-i18n@1.2.0(rollup@3.29.4)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))':
dependencies: dependencies:
'@intlify/bundle-utils': 7.5.1(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) '@intlify/bundle-utils': 7.5.1(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))
'@intlify/shared': 9.13.1 '@intlify/shared': 9.13.1
'@rollup/pluginutils': 5.1.0(rollup@2.79.1) '@rollup/pluginutils': 5.1.0(rollup@3.29.4)
'@vue/compiler-sfc': 3.3.10 '@vue/compiler-sfc': 3.3.10
debug: 4.3.4(supports-color@9.4.0) debug: 4.3.4(supports-color@9.4.0)
fast-glob: 3.3.2 fast-glob: 3.3.2
@@ -24512,12 +24515,12 @@ snapshots:
postcss: 8.4.32 postcss: 8.4.32
ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2) ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2)
postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)): postcss-load-config@4.0.2(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)):
dependencies: dependencies:
lilconfig: 3.1.1 lilconfig: 3.1.1
yaml: 2.4.2 yaml: 2.4.2
optionalDependencies: optionalDependencies:
postcss: 8.4.40 postcss: 8.4.32
ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3) ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)
postcss-merge-longhand@7.0.2(postcss@8.4.40): postcss-merge-longhand@7.0.2(postcss@8.4.40):
@@ -26142,7 +26145,7 @@ snapshots:
ts-interface-checker@0.1.13: {} ts-interface-checker@0.1.13: {}
ts-jest@27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5): ts-jest@27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5):
dependencies: dependencies:
bs-logger: 0.2.6 bs-logger: 0.2.6
fast-json-stable-stringify: 2.1.0 fast-json-stable-stringify: 2.1.0
@@ -26157,6 +26160,7 @@ snapshots:
optionalDependencies: optionalDependencies:
'@babel/core': 7.24.5 '@babel/core': 7.24.5
'@types/jest': 27.5.2 '@types/jest': 27.5.2
babel-jest: 29.7.0(@babel/core@7.24.5)
ts-jest@29.0.5(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.4.1(@types/node@18.11.10)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.11.10)(typescript@4.9.3)))(typescript@4.9.3): ts-jest@29.0.5(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.4.1(@types/node@18.11.10)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.11.10)(typescript@4.9.3)))(typescript@4.9.3):
dependencies: dependencies:
@@ -26362,7 +26366,7 @@ snapshots:
tslib@2.6.2: {} tslib@2.6.2: {}
tsup@8.0.2(@swc/core@1.4.2)(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3): tsup@8.0.2(@swc/core@1.4.2)(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3):
dependencies: dependencies:
bundle-require: 4.1.0(esbuild@0.19.12) bundle-require: 4.1.0(esbuild@0.19.12)
cac: 6.7.14 cac: 6.7.14
@@ -26372,7 +26376,7 @@ snapshots:
execa: 5.1.1 execa: 5.1.1
globby: 11.1.0 globby: 11.1.0
joycon: 3.1.1 joycon: 3.1.1
postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)) postcss-load-config: 4.0.2(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))
resolve-from: 5.0.0 resolve-from: 5.0.0
rollup: 4.17.2 rollup: 4.17.2
source-map: 0.8.0-beta.0 source-map: 0.8.0-beta.0
@@ -26380,7 +26384,7 @@ snapshots:
tree-kill: 1.2.2 tree-kill: 1.2.2
optionalDependencies: optionalDependencies:
'@swc/core': 1.4.2 '@swc/core': 1.4.2
postcss: 8.4.40 postcss: 8.4.32
typescript: 5.3.3 typescript: 5.3.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -26601,7 +26605,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)):
dependencies: dependencies:
'@antfu/utils': 0.5.2 '@antfu/utils': 0.5.2
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
@@ -26612,7 +26616,7 @@ snapshots:
magic-string: 0.26.7 magic-string: 0.26.7
minimatch: 5.1.6 minimatch: 5.1.6
resolve: 1.22.8 resolve: 1.22.8
unplugin: 0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) unplugin: 0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2))
vue: 3.3.9(typescript@4.9.3) vue: 3.3.9(typescript@4.9.3)
optionalDependencies: optionalDependencies:
'@babel/parser': 7.24.5 '@babel/parser': 7.24.5
@@ -26623,7 +26627,7 @@ snapshots:
- vite - vite
- webpack - webpack
unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)):
dependencies: dependencies:
'@antfu/utils': 0.5.2 '@antfu/utils': 0.5.2
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
@@ -26634,7 +26638,7 @@ snapshots:
magic-string: 0.26.7 magic-string: 0.26.7
minimatch: 5.1.6 minimatch: 5.1.6
resolve: 1.22.8 resolve: 1.22.8
unplugin: 0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) unplugin: 0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2))
vue: 3.3.9(typescript@4.9.5) vue: 3.3.9(typescript@4.9.5)
optionalDependencies: optionalDependencies:
'@babel/parser': 7.24.5 '@babel/parser': 7.24.5
@@ -26645,6 +26649,25 @@ snapshots:
- vite - vite
- webpack - webpack
unplugin-vue-components@0.25.2(@babel/parser@7.24.5)(rollup@3.29.4)(vue@3.3.9(typescript@5.3.2)):
dependencies:
'@antfu/utils': 0.7.7
'@rollup/pluginutils': 5.1.0(rollup@3.29.4)
chokidar: 3.6.0
debug: 4.3.4(supports-color@9.4.0)
fast-glob: 3.3.2
local-pkg: 0.4.3
magic-string: 0.30.10
minimatch: 9.0.4
resolve: 1.22.8
unplugin: 1.10.1
vue: 3.3.9(typescript@5.3.2)
optionalDependencies:
'@babel/parser': 7.24.5
transitivePeerDependencies:
- rollup
- supports-color
unplugin-vue-components@0.25.2(@babel/parser@7.24.5)(rollup@4.17.2)(vue@3.3.9(typescript@5.3.2)): unplugin-vue-components@0.25.2(@babel/parser@7.24.5)(rollup@4.17.2)(vue@3.3.9(typescript@5.3.2)):
dependencies: dependencies:
'@antfu/utils': 0.7.7 '@antfu/utils': 0.7.7
@@ -26664,7 +26687,7 @@ snapshots:
- rollup - rollup
- supports-color - supports-color
unplugin@0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): unplugin@0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)):
dependencies: dependencies:
acorn: 8.11.3 acorn: 8.11.3
chokidar: 3.6.0 chokidar: 3.6.0
@@ -26672,11 +26695,11 @@ snapshots:
webpack-virtual-modules: 0.4.6 webpack-virtual-modules: 0.4.6
optionalDependencies: optionalDependencies:
esbuild: 0.20.2 esbuild: 0.20.2
rollup: 2.79.1 rollup: 3.29.4
vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0) vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0)
webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2) webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)
unplugin@0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): unplugin@0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)):
dependencies: dependencies:
acorn: 8.11.3 acorn: 8.11.3
chokidar: 3.6.0 chokidar: 3.6.0
@@ -26684,7 +26707,7 @@ snapshots:
webpack-virtual-modules: 0.4.6 webpack-virtual-modules: 0.4.6
optionalDependencies: optionalDependencies:
esbuild: 0.20.2 esbuild: 0.20.2
rollup: 2.79.1 rollup: 3.29.4
vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)
webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2) webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)
@@ -26829,7 +26852,7 @@ snapshots:
- supports-color - supports-color
- terser - terser
vite-plugin-checker@0.6.2(eslint@8.57.0)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)): vite-plugin-checker@0.6.2(eslint@8.57.0)(meow@8.1.2)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)):
dependencies: dependencies:
'@babel/code-frame': 7.24.2 '@babel/code-frame': 7.24.2
ansi-escapes: 4.3.2 ansi-escapes: 4.3.2
@@ -26851,6 +26874,7 @@ snapshots:
vscode-uri: 3.0.8 vscode-uri: 3.0.8
optionalDependencies: optionalDependencies:
eslint: 8.57.0 eslint: 8.57.0
meow: 8.1.2
optionator: 0.9.4 optionator: 0.9.4
typescript: 5.3.2 typescript: 5.3.2
vue-tsc: 1.8.24(typescript@5.3.2) vue-tsc: 1.8.24(typescript@5.3.2)
@@ -26896,10 +26920,25 @@ snapshots:
dependencies: dependencies:
vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)
vite-plugin-inspect@0.7.38(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): vite-plugin-inspect@0.7.38(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)):
dependencies: dependencies:
'@antfu/utils': 0.7.7 '@antfu/utils': 0.7.7
'@rollup/pluginutils': 5.1.0(rollup@2.79.1) '@rollup/pluginutils': 5.1.0(rollup@3.29.4)
debug: 4.3.4(supports-color@9.4.0)
error-stack-parser-es: 0.1.1
fs-extra: 11.2.0
open: 9.1.0
picocolors: 1.0.0
sirv: 2.0.4
vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)
transitivePeerDependencies:
- rollup
- supports-color
vite-plugin-inspect@0.7.42(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)):
dependencies:
'@antfu/utils': 0.7.7
'@rollup/pluginutils': 5.1.0(rollup@3.29.4)
debug: 4.3.4(supports-color@9.4.0) debug: 4.3.4(supports-color@9.4.0)
error-stack-parser-es: 0.1.1 error-stack-parser-es: 0.1.1
fs-extra: 11.2.0 fs-extra: 11.2.0