1
0
mirror of https://github.com/tabler/tabler.git synced 2026-07-14 09:34:19 +04:00

Migrate core JavaScript to TypeScript (#2582)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Paweł Kuna
2026-01-09 21:49:22 +01:00
committed by GitHub
parent a24d5cab13
commit 857988dd44
51 changed files with 753 additions and 500 deletions
-21
View File
@@ -1,21 +0,0 @@
import fs from 'node:fs/promises'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const pkgJson = path.join(__dirname, '../package.json')
const pkg = JSON.parse(await fs.readFile(pkgJson, 'utf8'))
const year = new Date().getFullYear()
function getBanner(pluginFilename) {
return `/*!
* Tabler${pluginFilename ? ` ${pluginFilename}` : ''} v${pkg.version} (${pkg.homepage})
* Copyright 2018-${year} The Tabler Authors
* Copyright 2018-${year} codecalm.net Paweł Kuna
* Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE)
*/`
}
export default getBanner
-18
View File
@@ -1,18 +0,0 @@
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import { createViteConfig } from '../../.build/vite.config.helper.mjs'
import getBanner from '../../shared/banner/index.mjs'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const bannerText = getBanner('Demo')
export default createViteConfig({
entry: path.resolve(__dirname, '../js/demo.js'),
name: 'demo',
fileName: () => 'demo.js',
formats: ['es'],
outDir: path.resolve(__dirname, '../dist/preview/js'),
banner: bannerText
})
+26
View File
@@ -0,0 +1,26 @@
import path from 'node:path'
import process from 'node:process'
import { fileURLToPath } from 'node:url'
import { existsSync } from 'node:fs'
import { createViteConfig } from '../../.build/vite.config.helper'
import getBanner from '../../shared/banner/index.mjs'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const MINIFY = process.env.MINIFY === 'true'
const bannerText = getBanner('Demo')
// Try .ts first, fallback to .js for gradual migration
const entryPath = path.resolve(__dirname, '../js/demo')
const entry = existsSync(`${entryPath}.ts`) ? `${entryPath}.ts` : `${entryPath}.js`
export default createViteConfig({
entry: entry,
name: 'demo',
fileName: () => MINIFY ? 'demo.min.js' : 'demo.js',
formats: ['es'],
outDir: path.resolve(__dirname, '../dist/preview/js'),
banner: bannerText,
minify: MINIFY
})
+29 -12
View File
@@ -1,5 +1,14 @@
// Setting items
const items = {
interface SettingItem {
localStorage: string
default: string
}
interface SettingsItems {
[key: string]: SettingItem
}
const items: SettingsItems = {
"menu-position": { localStorage: "tablerMenuPosition", default: "top" },
"menu-behavior": { localStorage: "tablerMenuBehavior", default: "sticky" },
"container-layout": {
@@ -9,14 +18,14 @@ const items = {
}
// Theme config
const config = {}
const config: Record<string, string> = {}
for (const [key, params] of Object.entries(items)) {
const lsParams = localStorage.getItem(params.localStorage)
config[key] = lsParams ? lsParams : params.default
}
// Parse url params
const parseUrl = () => {
const parseUrl = (): void => {
const search = window.location.search.substring(1)
const params = search.split("&")
@@ -36,11 +45,11 @@ const parseUrl = () => {
}
// Toggle form controls
const toggleFormControls = (form) => {
const toggleFormControls = (form: HTMLFormElement): void => {
for (const [key, params] of Object.entries(items)) {
const elem = form.querySelector(
`[name="settings-${key}"][value="${config[key]}"]`,
)
) as HTMLInputElement | null
if (elem) {
elem.checked = true
@@ -49,27 +58,34 @@ const toggleFormControls = (form) => {
}
// Submit form
const submitForm = (form) => {
const submitForm = (form: HTMLFormElement): void => {
// Save data to localStorage
for (const [key, params] of Object.entries(items)) {
// Save to localStorage
const value = form.querySelector(`[name="settings-${key}"]:checked`).value
localStorage.setItem(params.localStorage, value)
const checkedInput = form.querySelector(`[name="settings-${key}"]:checked`) as HTMLInputElement
if (checkedInput) {
const value = checkedInput.value
localStorage.setItem(params.localStorage, value)
// Update local variables
config[key] = value
// Update local variables
config[key] = value
}
}
window.dispatchEvent(new Event("resize"))
new bootstrap.Offcanvas(form).hide()
// Bootstrap is available globally
const bootstrap = (window as any).bootstrap
if (bootstrap) {
new bootstrap.Offcanvas(form).hide()
}
}
// Parse url
parseUrl()
// Elements
const form = document.querySelector("#offcanvas-settings")
const form = document.querySelector("#offcanvas-settings") as HTMLFormElement | null
// Toggle form controls
if (form) {
@@ -81,3 +97,4 @@ if (form) {
toggleFormControls(form)
}
+6 -6
View File
@@ -10,14 +10,14 @@
"watch-html": "cross-env NODE_ENV=development eleventy --serve --port=3000 --watch --incremental",
"watch-js": "nodemon --watch js/ --ext js --exec \"pnpm run js\"",
"watch-css": "nodemon --watch scss/ --ext scss --exec \"pnpm run css\"",
"css": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-minify",
"css-compile": "sass scss/:dist/preview/css/ --no-source-map --load-path=node_modules",
"css": "pnpm run css-build && pnpm run css-prefix && pnpm run css-minify",
"css-build": "sass scss/:dist/preview/css/ --no-source-map --load-path=node_modules",
"css-prefix": "postcss --config .build/postcss.config.mjs --replace \"dist/preview/css/*.css\" \"!dist/preview/css/*.rtl*.css\" \"!dist/preview/css/*.min.css\"",
"css-minify": "cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/preview/css/ --batch --batch-suffix \".min\" \"dist/preview/css/*.css\" \"!dist/preview/css/*.min.css\" \"!dist/preview/css/*rtl*.css\"",
"js": "pnpm run js-compile && pnpm run js-minify",
"js-compile": "vite build --config .build/vite.config.mjs",
"js-minify": "pnpm run js-minify-demo",
"js-minify-demo": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/preview/js/demo.js.map,includeSources,url=demo.min.js.map\" --output dist/preview/js/demo.min.js dist/preview/js/demo.js",
"js": "pnpm run js-build && pnpm run js-build-min",
"js-build": "vite build --config .build/vite.config.ts",
"js-build-min": "pnpm run js-build-min-demo",
"js-build-min-demo": "cross-env MINIFY=true vite build --config .build/vite.config.ts",
"clean": "shx rm -rf dist demo",
"html": "pnpm run html-build && pnpm run html-prettify && pnpm run html-remove-prettier-ignore",
"html-build": "eleventy",