更新ts类型导入导出语法

pull/1066/head
lyswhut 2022-11-25 23:01:39 +08:00
parent 5e9b3a16fa
commit 77ea6d3748
19 changed files with 527 additions and 513 deletions

View File

@ -1,466 +1,469 @@
import type { I18n } from '@/lang/i18n'
declare namespace LX { declare global {
type AddMusicLocationType = 'top' | 'bottom'
declare namespace LX {
interface AppSetting { type AddMusicLocationType = 'top' | 'bottom'
version: string
interface AppSetting {
/** version: string
* id
*/ /**
'common.windowSizeId': number * id
*/
/** 'common.windowSizeId': number
* id
*/ /**
'common.fontSize': number * id
*/
/** 'common.fontSize': number
*
*/ /**
'common.startInFullscreen': boolean *
*/
/** 'common.startInFullscreen': boolean
* id
*/ /**
'common.langId': string | null * id
*/
/** 'common.langId': I18n['locale'] | null
* api id
*/ /**
'common.apiSource': string * api id
*/
/** 'common.apiSource': string
*
*/ /**
'common.sourceNameType': 'alias' | 'real' *
*/
/** 'common.sourceNameType': 'alias' | 'real'
*
*/ /**
'common.font': string *
*/
/** 'common.font': string
*
*/ /**
'common.isShowAnimation': boolean *
*/
/** 'common.isShowAnimation': boolean
*
*/ /**
'common.randomAnimate': boolean *
*/
/** 'common.randomAnimate': boolean
*
*/ /**
'common.isAgreePact': boolean *
*/
/** 'common.isAgreePact': boolean
*
*/ /**
'common.controlBtnPosition': 'left' | 'right' *
*/
/** 'common.controlBtnPosition': 'left' | 'right'
*
*/ /**
'player.startupAutoPlay': boolean *
*/
/** 'player.startupAutoPlay': boolean
*
*/ /**
'player.togglePlayMethod': 'listLoop' | 'random' | 'list' | 'singleLoop' | 'none' *
*/
/** 'player.togglePlayMethod': 'listLoop' | 'random' | 'list' | 'singleLoop' | 'none'
* 320k
*/ /**
'player.highQuality': boolean * 320k
*/
/** 'player.highQuality': boolean
*
*/ /**
'player.isShowTaskProgess': boolean *
*/
/** 'player.isShowTaskProgess': boolean
*
*/ /**
'player.volume': number *
*/
/** 'player.volume': number
*
*/ /**
'player.isMute': boolean *
*/
/** 'player.isMute': boolean
* id
*/ /**
'player.mediaDeviceId': string * id
*/
/** 'player.mediaDeviceId': string
*
*/ /**
'player.isMediaDeviceRemovedStopPlay': boolean *
*/
/** 'player.isMediaDeviceRemovedStopPlay': boolean
*
*/ /**
'player.isShowLyricTranslation': boolean *
*/
/** 'player.isShowLyricTranslation': boolean
*
*/ /**
'player.isShowLyricRoma': boolean *
*/
/** 'player.isShowLyricRoma': boolean
*
*/ /**
'player.isS2t': boolean *
*/
/** 'player.isS2t': boolean
* OK
*/ /**
'player.isPlayLxlrc': boolean * OK
*/
/** 'player.isPlayLxlrc': boolean
*
*/ /**
'player.isSavePlayTime': boolean *
*/
/** 'player.isSavePlayTime': boolean
*
*/ /**
'player.audioVisualization': boolean *
*/
/** 'player.audioVisualization': boolean
* -
*/ /**
'player.waitPlayEndStop': boolean * -
*/
/** 'player.waitPlayEndStop': boolean
* -
*/ /**
'player.waitPlayEndStopTime': string * -
*/
/** 'player.waitPlayEndStopTime': string
*
*/ /**
'player.autoSkipOnError': boolean *
*/
/** 'player.autoSkipOnError': boolean
* -
*/ /**
'playDetail.isZoomActiveLrc': boolean * -
*/
/** 'playDetail.isZoomActiveLrc': boolean
* -
*/ /**
'playDetail.isShowLyricProgressSetting': boolean * -
*/
/** 'playDetail.isShowLyricProgressSetting': boolean
* -
*/ /**
'playDetail.style.fontSize': number * -
*/
/** 'playDetail.style.fontSize': number
* -
*/ /**
'playDetail.style.align': 'center' | 'left' | 'right' * -
*/
'playDetail.style.align': 'center' | 'left' | 'right'
/**
*
*/ /**
'desktopLyric.enable': boolean *
*/
/** 'desktopLyric.enable': boolean
*
*/ /**
'desktopLyric.isLock': boolean *
*/
/** 'desktopLyric.isLock': boolean
*
*/ /**
'desktopLyric.isAlwaysOnTop': boolean *
*/
/** 'desktopLyric.isAlwaysOnTop': boolean
*
*/ /**
'desktopLyric.isAlwaysOnTopLoop': boolean *
*/
/** 'desktopLyric.isAlwaysOnTopLoop': boolean
*
*/ /**
'desktopLyric.audioVisualization': boolean *
*/
/** 'desktopLyric.audioVisualization': boolean
*
*/ /**
'desktopLyric.width': number *
*/
/** 'desktopLyric.width': number
*
*/ /**
'desktopLyric.height': number *
*/
/** 'desktopLyric.height': number
* x
*/ /**
'desktopLyric.x': number | null * x
*/
/** 'desktopLyric.x': number | null
* y
*/ /**
'desktopLyric.y': number | null * y
*/
/** 'desktopLyric.y': number | null
*
*/ /**
'desktopLyric.isLockScreen': boolean *
*/
/** 'desktopLyric.isLockScreen': boolean
*
*/ /**
'desktopLyric.isDelayScroll': boolean *
*/
/** 'desktopLyric.isDelayScroll': boolean
*
*/ /**
'desktopLyric.scrollAlign': 'top' | 'center' *
*/
/** 'desktopLyric.scrollAlign': 'top' | 'center'
*
*/ /**
'desktopLyric.isHoverHide': boolean *
*/
/** 'desktopLyric.isHoverHide': boolean
*
*/ /**
'desktopLyric.direction': 'horizontal' | 'vertical' *
*/
/** 'desktopLyric.direction': 'horizontal' | 'vertical'
*
*/ /**
'desktopLyric.style.align': 'center' | 'left' | 'right' *
*/
/** 'desktopLyric.style.align': 'center' | 'left' | 'right'
*
*/ /**
'desktopLyric.style.font': string *
*/
/** 'desktopLyric.style.font': string
*
*/ /**
'desktopLyric.style.fontSize': number *
*/
/** 'desktopLyric.style.fontSize': number
*
*/ /**
'desktopLyric.style.lineGap': number *
*/
/** 'desktopLyric.style.lineGap': number
*
*/ /**
'desktopLyric.style.lyricUnplayColor': string *
*/
/** 'desktopLyric.style.lyricUnplayColor': string
*
*/ /**
'desktopLyric.style.lyricPlayedColor': string *
*/
/** 'desktopLyric.style.lyricPlayedColor': string
*
*/ /**
'desktopLyric.style.lyricShadowColor': string *
*/
/** 'desktopLyric.style.lyricShadowColor': string
*
*/ /**
// 'desktopLyric.style.fontWeight': boolean *
*/
/** // 'desktopLyric.style.fontWeight': boolean
*
*/ /**
'desktopLyric.style.opacity': number *
*/
/** 'desktopLyric.style.opacity': number
*
*/ /**
'desktopLyric.style.ellipsis': boolean *
*/
/** 'desktopLyric.style.ellipsis': boolean
*
*/ /**
'desktopLyric.style.isZoomActiveLrc': boolean *
*/
/** 'desktopLyric.style.isZoomActiveLrc': boolean
*
*/ /**
'list.isClickPlayList': boolean *
*/
/** 'list.isClickPlayList': boolean
*
*/ /**
'list.isShowSource': boolean *
*/
/** 'list.isShowSource': boolean
*
*/ /**
'list.isSaveScrollLocation': boolean *
*/
/** 'list.isSaveScrollLocation': boolean
*
*/ /**
'list.addMusicLocationType': LX.AddMusicLocationType *
*/
/** 'list.addMusicLocationType': LX.AddMusicLocationType
*
*/ /**
'list.actionButtonsVisible': boolean *
*/
/** 'list.actionButtonsVisible': boolean
*
*/ /**
'download.enable': boolean *
*/
/** 'download.enable': boolean
*
*/ /**
'download.savePath': string *
*/
/** 'download.savePath': string
*
*/ /**
'download.fileName': '歌名 - 歌手' | '歌手 - 歌名' | '歌名' *
*/
/** 'download.fileName': '歌名 - 歌手' | '歌手 - 歌名' | '歌名'
*
*/ /**
'download.maxDownloadNum': number *
*/
/** 'download.maxDownloadNum': number
* lrc
*/ /**
'download.isDownloadLrc': boolean * lrc
*/
/** 'download.isDownloadLrc': boolean
*
*/ /**
'download.isDownloadTLrc': boolean *
*/
/** 'download.isDownloadTLrc': boolean
*
*/ /**
'download.isDownloadRLrc': boolean *
*/
/** 'download.isDownloadRLrc': boolean
* lrc
*/ /**
'download.lrcFormat': 'utf8' | 'gbk' * lrc
*/
/** 'download.lrcFormat': 'utf8' | 'gbk'
*
*/ /**
'download.isEmbedPic': boolean *
*/
/** 'download.isEmbedPic': boolean
*
*/ /**
'download.isEmbedLyric': boolean *
*/
/** 'download.isEmbedLyric': boolean
*
*/ /**
'download.isUseOtherSource': boolean *
*/
/** 'download.isUseOtherSource': boolean
* id
*/ /**
'theme.id': string * id
*/
/** 'theme.id': string
* id
*/ /**
'theme.lightId': string * id
*/
/** 'theme.lightId': string
* id
*/ /**
'theme.darkId': string * id
*/
/** 'theme.darkId': string
*
*/ /**
'search.isShowHotSearch': boolean *
*/
/** 'search.isShowHotSearch': boolean
*
*/ /**
'search.isShowHistorySearch': boolean *
*/
/** 'search.isShowHistorySearch': boolean
*
*/ /**
'search.isFocusSearchBox': boolean *
*/
/** 'search.isFocusSearchBox': boolean
*
*/ /**
'network.proxy.enable': boolean *
*/
/** 'network.proxy.enable': boolean
*
*/ /**
'network.proxy.host': string *
*/
/** 'network.proxy.host': string
*
*/ /**
'network.proxy.port': string *
*/
/** 'network.proxy.port': string
*
*/ /**
'network.proxy.username': string *
*/
/** 'network.proxy.username': string
*
*/ /**
'network.proxy.password': string *
*/
/** 'network.proxy.password': string
*
*/ /**
'tray.enable': boolean *
*/
/** 'tray.enable': boolean
*
*/ /**
// 'tray.isToTray': boolean *
*/
/** // 'tray.isToTray': boolean
* id
*/ /**
'tray.themeId': number * id
*/
/** 'tray.themeId': number
*
*/ /**
'sync.enable': boolean *
*/
/** 'sync.enable': boolean
*
*/ /**
'sync.port': '23332' | string *
*/
/** 'sync.port': '23332' | string
*
*/ /**
'odc.isAutoClearSearchInput': boolean *
*/
/** 'odc.isAutoClearSearchInput': boolean
*
*/ /**
'odc.isAutoClearSearchList': boolean *
*/
'odc.isAutoClearSearchList': boolean
}
} }
}
}

View File

@ -75,9 +75,6 @@ export {
unref, unref,
onMounted, onMounted,
markRaw, markRaw,
ComputedRef,
Ref,
ShallowRef,
defineProps, defineProps,
defineEmits, defineEmits,
defineComponent, defineComponent,
@ -85,3 +82,9 @@ export {
defineExpose, defineExpose,
withDefaults, withDefaults,
} }
export type {
ComputedRef,
Ref,
ShallowRef,
}

View File

@ -1,22 +1,24 @@
import { App, ref } from 'vue' import { App, ref } from 'vue'
import { messages, Messages, Message } from './index' import { messages } from './index'
import type { Messages, Message } from './index'
type TranslateValues = Record<string, string | number | boolean> type TranslateValues = Record<string, string | number | boolean>
type Langs = keyof Messages
export declare interface I18n { export declare interface I18n {
locale: keyof Messages locale: Langs
fallbackLocale: keyof Messages fallbackLocale: Langs
availableLocales: Array<keyof Messages> availableLocales: Langs[]
messages: Messages messages: Messages
message: Message message: Message
setLanguage: (locale: string) => void setLanguage: (locale: Langs) => void
fillMessage: (message: string, val: TranslateValues) => string fillMessage: (message: string, val: TranslateValues) => string
getMessage: (key: keyof Message, val?: TranslateValues) => string getMessage: (key: keyof Message, val?: TranslateValues) => string
t: (key: keyof Message, val?: TranslateValues) => string t: (key: keyof Message, val?: TranslateValues) => string
} }
const locale = ref('zh-cn') const locale = ref<Langs>('zh-cn')
let i18n: I18n let i18n: I18n
@ -47,7 +49,7 @@ const useI18n = () => {
} }
} }
const setLanguage = (lang: string) => { const setLanguage = (lang: Langs) => {
i18n.setLanguage(lang) i18n.setLanguage(lang)
} }
@ -55,10 +57,10 @@ const createI18n = (): I18n => {
return i18n = { return i18n = {
locale: locale.value, locale: locale.value,
fallbackLocale: 'zh-cn', fallbackLocale: 'zh-cn',
availableLocales: Object.keys(messages), availableLocales: Object.keys(messages) as Langs[],
messages, messages,
message: messages[locale.value], message: messages[locale.value],
setLanguage(_locale: string) { setLanguage(_locale: Langs) {
this.locale = _locale this.locale = _locale
this.message = messages[_locale] this.message = messages[_locale]
locale.value = _locale locale.value = _locale
@ -74,7 +76,7 @@ const createI18n = (): I18n => {
return val ? this.fillMessage(targetMessage, val) : targetMessage return val ? this.fillMessage(targetMessage, val) : targetMessage
}, },
t(key: keyof Message, val?: TranslateValues): string { t(key: keyof Message, val?: TranslateValues): string {
trackReactivityValues() // trackReactivityValues()
return this.getMessage(key, val) return this.getMessage(key, val)
}, },
} }

View File

@ -6,20 +6,13 @@ type Message = Record<keyof typeof zh_cn, string>
| Record<keyof typeof zh_tw, string> | Record<keyof typeof zh_tw, string>
| Record<keyof typeof en_us, string> | Record<keyof typeof en_us, string>
interface Lang { type Messages = Record<(typeof langs)[number]['locale'], Message>
name: string
locale: string
alternate?: string
country: string
fallback?: boolean
message: Message
}
const langs: Lang[] = [ const langs = [
{ {
name: '简体中文', name: '简体中文',
locale: 'zh-cn', locale: 'zh-cn',
alternate: 'zh-hans', // alternate: 'zh-hans',
country: 'cn', country: 'cn',
fallback: true, fallback: true,
message: zh_cn, message: zh_cn,
@ -27,7 +20,7 @@ const langs: Lang[] = [
{ {
name: '繁体中文', name: '繁体中文',
locale: 'zh-tw', locale: 'zh-tw',
alternate: 'zh-hk', // alternate: 'zh-hk',
country: 'cn', country: 'cn',
message: zh_tw, message: zh_tw,
}, },
@ -37,20 +30,20 @@ const langs: Lang[] = [
country: 'us', country: 'us',
message: en_us, message: en_us,
}, },
] ] as const
const langList: Array<{ const langList: Array<{
name: string name: string
locale: string locale: keyof Messages
alternate?: string alternate?: string
}> = [] }> = []
type Messages = Record<string, Message> // @ts-expect-error
const messages: Messages = {} const messages: Messages = {}
langs.forEach(item => { langs.forEach(item => {
langList.push({ langList.push({
name: item.name, name: item.name,
locale: item.locale, locale: item.locale,
alternate: item.alternate, // alternate: item.alternate,
}) })
messages[item.locale] = item.message messages[item.locale] = item.message
}) })
@ -58,6 +51,9 @@ langs.forEach(item => {
export { export {
langList, langList,
messages, messages,
}
export type {
Messages, Messages,
Message, Message,
} }

View File

@ -1,7 +1,7 @@
import { Event as App, Type as AppType } from './AppEvent' import { Event as App, Type as AppType } from './AppEvent'
import { Event as List, Type as ListType } from './ListEvent' import { Event as List, Type as ListType } from './ListEvent'
export { export type {
AppType, AppType,
ListType, ListType,
} }

View File

@ -1,9 +1,11 @@
import { createI18n, i18nPlugin, useI18n, I18n } from '@/lang' import type { I18n } from '@/lang'
import { createI18n, i18nPlugin, useI18n } from '@/lang'
window.i18n = createI18n() window.i18n = createI18n()
export { export {
i18nPlugin, i18nPlugin,
useI18n, useI18n,
I18n,
} }
export type { I18n }

View File

@ -225,3 +225,4 @@
// getScrollTop, // getScrollTop,
// } // }
// } // }
export {}

View File

@ -14,7 +14,7 @@ const initPrevPlayInfo = async() => {
window.lx.restorePlayInfo = null window.lx.restorePlayInfo = null
if (!info?.listId || info.index < 0) return if (!info?.listId || info.index < 0) return
const list = await getListMusics(info.listId) const list = await getListMusics(info.listId)
if (!list?.[info.index]) return if (!list[info.index]) return
window.lx.restorePlayInfo = info window.lx.restorePlayInfo = info
playList(info.listId, info.index) playList(info.listId, info.index)

View File

@ -39,7 +39,9 @@ export const registerEvents = () => {
// // unregisterRendererEvents() // // unregisterRendererEvents()
// } // }
export { AppEventTypes } from './appEvent' export { clearDownKeys } from './keyEvent'
export { KeyEventTypes, clearDownKeys } from './keyEvent'
export type { AppEventTypes } from './appEvent'
export type { KeyEventTypes } from './keyEvent'
registerEvents() registerEvents()

View File

@ -19,6 +19,8 @@ import router from './router'
import { getSetting, updateSetting } from './utils/ipc' import { getSetting, updateSetting } from './utils/ipc'
import { langList } from '@/lang' import { langList } from '@/lang'
import type { I18n } from '@/lang/i18n'
import { initSetting } from './store/setting' import { initSetting } from './store/setting'
// import { bubbleCursor } from './utils/cursor-effects/bubbleCursor' // import { bubbleCursor } from './utils/cursor-effects/bubbleCursor'
@ -40,8 +42,8 @@ void getSetting().then(setting => {
// window.lx.appSetting = setting // window.lx.appSetting = setting
// Set language automatically // Set language automatically
if (!setting['common.langId'] || !window.i18n.availableLocales.includes(setting['common.langId'])) { if (!setting['common.langId'] || !window.i18n.availableLocales.includes(setting['common.langId'])) {
let langId = null let langId: I18n['locale'] | null = null
let locale = window.navigator.language.toLocaleLowerCase() let locale = window.navigator.language.toLocaleLowerCase() as I18n['locale']
if (window.i18n.availableLocales.includes(locale)) { if (window.i18n.availableLocales.includes(locale)) {
langId = locale langId = locale
} else { } else {

View File

@ -1,9 +1,11 @@
import { createI18n, i18nPlugin, useI18n, I18n } from '@/lang' import type { I18n } from '@/lang'
import { createI18n, i18nPlugin, useI18n } from '@/lang'
window.i18n = createI18n() window.i18n = createI18n()
export { export {
i18nPlugin, i18nPlugin,
useI18n, useI18n,
I18n,
} }
export type { I18n }

View File

@ -17,7 +17,7 @@ export const setUserLists = (lists: LX.List.UserListInfo[]) => {
export const setMusicList = (listId: string, musicList: LX.Music.MusicInfo[]) => { export const setMusicList = (listId: string, musicList: LX.Music.MusicInfo[]) => {
const list = shallowReactive(markRawList(musicList)) const list = shallowReactive(markRawList(musicList))
allMusicList.set(listId, shallowReactive(musicList)) allMusicList.set(listId, list)
return list return list
} }

View File

@ -2,7 +2,8 @@ import { markRawList } from '@common/utils/vueTools'
import music from '@renderer/utils/musicSdk' import music from '@renderer/utils/musicSdk'
import { sortInsert, similar } from '@common/utils/common' import { sortInsert, similar } from '@common/utils/common'
import { sources, maxPages, listInfos, ListInfoItem, SearchListInfo } from './state' import type { ListInfoItem, SearchListInfo } from './state'
import { sources, maxPages, listInfos } from './state'
interface SearchResult { interface SearchResult {
list: ListInfoItem[] list: ListInfoItem[]

View File

@ -5,7 +5,7 @@ import music from '@renderer/utils/musicSdk'
import { ListInfo } from '@renderer/store/songList/state' import { ListInfo } from '@renderer/store/songList/state'
export { ListInfoItem } from '@renderer/store/songList/state' export type { ListInfoItem } from '@renderer/store/songList/state'
export const sources: Array<LX.OnlineSource | 'all'> = markRaw([]) export const sources: Array<LX.OnlineSource | 'all'> = markRaw([])

View File

@ -2,14 +2,12 @@
import { deduplicationList, toNewMusicInfo } from '@renderer/utils' import { deduplicationList, toNewMusicInfo } from '@renderer/utils'
import musicSdk from '@renderer/utils/musicSdk' import musicSdk from '@renderer/utils/musicSdk'
import { markRaw, markRawList } from '@common/utils/vueTools' import { markRaw, markRawList } from '@common/utils/vueTools'
import type { ListDetailInfo, ListInfoItem, ListInfo } from './state'
import { import {
tags, tags,
TagInfo, TagInfo,
listInfo, listInfo,
listDetailInfo, listDetailInfo,
ListDetailInfo,
ListInfoItem,
ListInfo,
selectListInfo, selectListInfo,
isVisibleListDetail, isVisibleListDetail,
openSongListInputInfo, openSongListInputInfo,

View File

@ -53,7 +53,7 @@ export const getFontSizeWithScreen = (screenWidth: number = window.innerWidth):
export const deduplicationList = <T extends LX.Music.MusicInfo>(list: T[]): T[] => { export const deduplicationList = <T extends LX.Music.MusicInfo>(list: T[]): T[] => {
const ids: Set<string | number> = new Set() const ids: Set<string> = new Set()
return list.filter(s => { return list.filter(s => {
if (ids.has(s.id)) return false if (ids.has(s.id)) return false
ids.add(s.id) ids.add(s.id)

View File

@ -3,7 +3,8 @@ import { ref, nextTick } from '@common/utils/vueTools'
import { addHistoryWord } from '@renderer/store/search/action' import { addHistoryWord } from '@renderer/store/search/action'
// import { useI18n } from '@renderer/plugins/i18n' // import { useI18n } from '@renderer/plugins/i18n'
// import { } from '@renderer/store/search/state' // import { } from '@renderer/store/search/state'
import { search as searchSongList, listInfos, SearchListInfo, ListInfoItem } from '@renderer/store/search/songlist' import type { SearchListInfo, ListInfoItem } from '@renderer/store/search/songlist'
import { search as searchSongList, listInfos } from '@renderer/store/search/songlist'
export declare type SearchSource = LX.OnlineSource | 'all' export declare type SearchSource = LX.OnlineSource | 'all'

View File

@ -34,7 +34,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, defineEmits, defineExpose } from '@common/utils/vueTools' import { ref, defineEmits, defineExpose } from '@common/utils/vueTools'
import { ListInfo, ListInfoItem } from '@renderer/store/songList/state' import type { ListInfo, ListInfoItem } from '@renderer/store/songList/state'
// import LX from '@renderer/types/lx' // import LX from '@renderer/types/lx'
import { useRoute, useRouter } from '@common/utils/vueRouter' import { useRoute, useRouter } from '@common/utils/vueRouter'

View File

@ -1,4 +1,5 @@
{ {
"$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": { "compilerOptions": {
/* Visit https://aka.ms/tsconfig to read more about this file */ /* Visit https://aka.ms/tsconfig to read more about this file */
@ -82,7 +83,7 @@
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
/* Interop Constraints */ /* Interop Constraints */
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
"allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
"esModuleInterop": false, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ "esModuleInterop": false, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */