@finema/core 3.23.2 → 3.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +22 -2
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +3 -14
  4. package/dist/runtime/components/DevToolsWindow/index.vue +24 -26
  5. package/dist/runtime/components/Dialog/index.vue +11 -10
  6. package/dist/runtime/components/Empty.d.vue.ts +1 -1
  7. package/dist/runtime/components/Empty.vue +16 -12
  8. package/dist/runtime/components/Empty.vue.d.ts +1 -1
  9. package/dist/runtime/components/FlexDeck/index.vue +85 -92
  10. package/dist/runtime/components/Form/FieldWrapper.vue +13 -13
  11. package/dist/runtime/components/Form/Fields.d.vue.ts +1 -1
  12. package/dist/runtime/components/Form/Fields.vue +17 -11
  13. package/dist/runtime/components/Form/Fields.vue.d.ts +1 -1
  14. package/dist/runtime/components/Form/InputCheckbox/index.vue +19 -23
  15. package/dist/runtime/components/Form/InputCheckboxGroup/index.vue +1 -5
  16. package/dist/runtime/components/Form/InputCurrency/index.vue +56 -57
  17. package/dist/runtime/components/Form/InputDateTime/date_time_field.types.d.ts +2 -0
  18. package/dist/runtime/components/Form/InputDateTime/index.vue +70 -80
  19. package/dist/runtime/components/Form/InputDateTimeRange/index.vue +78 -75
  20. package/dist/runtime/components/Form/InputMonth/index.vue +7 -10
  21. package/dist/runtime/components/Form/InputNumber/index.vue +21 -25
  22. package/dist/runtime/components/Form/InputRadio/index.d.vue.ts +1 -1
  23. package/dist/runtime/components/Form/InputRadio/index.vue +1 -5
  24. package/dist/runtime/components/Form/InputRadio/index.vue.d.ts +1 -1
  25. package/dist/runtime/components/Form/InputRating/index.vue +1 -5
  26. package/dist/runtime/components/Form/InputSearch/index.vue +2 -8
  27. package/dist/runtime/components/Form/InputSelect/index.vue +112 -122
  28. package/dist/runtime/components/Form/InputSelectMultiple/index.vue +121 -133
  29. package/dist/runtime/components/Form/InputTags/index.vue +55 -59
  30. package/dist/runtime/components/Form/InputText/index.vue +122 -133
  31. package/dist/runtime/components/Form/InputTextarea/index.vue +19 -23
  32. package/dist/runtime/components/Form/InputTime/index.vue +63 -63
  33. package/dist/runtime/components/Form/InputToggle/index.vue +18 -21
  34. package/dist/runtime/components/Form/InputUploadDropzone/index.vue +46 -49
  35. package/dist/runtime/components/Form/InputUploadDropzoneAuto/index.vue +57 -63
  36. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/index.vue +57 -64
  37. package/dist/runtime/components/Form/InputUploadImageAuto/index.vue +57 -63
  38. package/dist/runtime/components/Form/InputWYSIWYG/EditorImagePasteExtension.js +7 -6
  39. package/dist/runtime/components/Form/InputWYSIWYG/EditorImageUploadExtension.js +13 -12
  40. package/dist/runtime/components/Form/InputWYSIWYG/EditorImageUploadNode.vue +21 -19
  41. package/dist/runtime/components/Form/InputWYSIWYG/EditorLinkPopover.vue +85 -87
  42. package/dist/runtime/components/Form/InputWYSIWYG/README.md +96 -96
  43. package/dist/runtime/components/Form/InputWYSIWYG/index.vue +178 -157
  44. package/dist/runtime/components/Form/fileState/EmptyState.vue +21 -21
  45. package/dist/runtime/components/Form/fileState/FailedState.vue +34 -36
  46. package/dist/runtime/components/Form/fileState/LoadingState.vue +24 -24
  47. package/dist/runtime/components/Form/fileState/MultipleFilesState.vue +74 -78
  48. package/dist/runtime/components/Form/fileState/PreviewModal.vue +23 -23
  49. package/dist/runtime/components/Form/fileState/SuccessState.vue +3 -12
  50. package/dist/runtime/components/Form/fileState/useFileState.js +2 -10
  51. package/dist/runtime/components/Form/fileState/useUploadImageState.js +1 -3
  52. package/dist/runtime/components/Form/fileState/useUploadState.js +8 -19
  53. package/dist/runtime/components/Form/fileState/useUploadStateMultiple.js +25 -30
  54. package/dist/runtime/components/Form/index.vue +5 -5
  55. package/dist/runtime/components/Image.vue +22 -28
  56. package/dist/runtime/components/Loader.d.vue.ts +1 -1
  57. package/dist/runtime/components/Loader.vue +10 -7
  58. package/dist/runtime/components/Loader.vue.d.ts +1 -1
  59. package/dist/runtime/components/Log/LogItem.vue +1 -3
  60. package/dist/runtime/components/Log/index.vue +1 -3
  61. package/dist/runtime/components/Table/Base.vue +117 -137
  62. package/dist/runtime/components/Table/ColumnDate.vue +1 -1
  63. package/dist/runtime/components/Table/ColumnDateTime.vue +1 -1
  64. package/dist/runtime/components/Table/ColumnImage.vue +4 -4
  65. package/dist/runtime/components/Table/ColumnText.vue +10 -10
  66. package/dist/runtime/components/Table/Pagination.vue +71 -77
  67. package/dist/runtime/components/Table/Simple.vue +19 -19
  68. package/dist/runtime/components/Table/index.vue +36 -42
  69. package/dist/runtime/composables/loaderList.js +1 -3
  70. package/dist/runtime/composables/loaderPage.js +156 -133
  71. package/dist/runtime/composables/useConfig.js +1 -1
  72. package/dist/runtime/composables/useDialog.js +1 -3
  73. package/dist/runtime/composables/useForm.d.ts +1 -1
  74. package/dist/runtime/composables/useForm.js +1 -3
  75. package/dist/runtime/composables/useTable.js +2 -14
  76. package/dist/runtime/helpers/apiBaseHelper.js +6 -24
  77. package/dist/runtime/helpers/apiListHelper.js +2 -5
  78. package/dist/runtime/helpers/apiObjectHelper.js +2 -5
  79. package/dist/runtime/helpers/apiPageHelper.js +19 -38
  80. package/dist/runtime/helpers/componentHelper.js +2 -6
  81. package/dist/runtime/helpers/uploadCore.js +1 -4
  82. package/dist/runtime/locale/index.js +1 -4
  83. package/dist/runtime/server/tsconfig.json +3 -3
  84. package/dist/runtime/styles/main.css +1 -1
  85. package/package.json +39 -26
@@ -1,7 +1,7 @@
1
1
  import { useCoreConfig } from "../composables/useConfig.js";
2
2
  import { _get } from "../utils/lodash.js";
3
- import { bindParamsToUrl } from "./apiBaseHelper.js";
4
3
  import {
4
+ bindParamsToUrl,
5
5
  checkExpiration,
6
6
  createErrorOptions,
7
7
  createSuccessOptions,
@@ -14,10 +14,7 @@ import { _findIndex, _shuffle } from "#imports";
14
14
  export const apiAddHelper = async (state, onUpdateStatus, onUpdateOptions, onUpdateData, onUpdateItems, data, opts) => {
15
15
  onUpdateStatus(updateLoaderState.setLoading(state().status));
16
16
  onUpdateOptions({});
17
- const {
18
- requestOptions,
19
- stateRequestOptions
20
- } = prepareLoaderRequestOptions(
17
+ const { requestOptions, stateRequestOptions } = prepareLoaderRequestOptions(
21
18
  opts.getBaseRequestOptions?.() || {},
22
19
  opts.add?.getRequestOptions?.(data, opts),
23
20
  opts.params,
@@ -53,16 +50,16 @@ export const apiDeleteHelper = async (state, onUpdateStatus, onUpdateOptions, _o
53
50
  const getPrimaryKey = (item) => _get(item, primaryKey, "");
54
51
  onUpdateStatus(updateLoaderState.setLoading(state().status));
55
52
  onUpdateOptions({});
56
- const {
57
- requestOptions,
58
- stateRequestOptions
59
- } = prepareLoaderRequestOptions(
53
+ const { requestOptions, stateRequestOptions } = prepareLoaderRequestOptions(
60
54
  opts.getBaseRequestOptions?.() || {},
61
55
  opts.delete?.getRequestOptions?.(id, opts),
62
56
  opts.params,
63
57
  opts.signal
64
58
  );
65
- const url = bindParamsToUrl(opts.delete?.getURL ? opts.delete.getURL(id, opts) : `${opts.baseURL}/${id}`, opts.pathBind);
59
+ const url = bindParamsToUrl(
60
+ opts.delete?.getURL ? opts.delete.getURL(id, opts) : `${opts.baseURL}/${id}`,
61
+ opts.pathBind
62
+ );
66
63
  await handleApiRequest(
67
64
  {
68
65
  url,
@@ -74,9 +71,7 @@ export const apiDeleteHelper = async (state, onUpdateStatus, onUpdateOptions, _o
74
71
  {
75
72
  onSuccess: (_, status) => {
76
73
  if (state().items) {
77
- onUpdateItems(
78
- state().items.filter((item) => getPrimaryKey(item) !== id)
79
- );
74
+ onUpdateItems(state().items.filter((item) => getPrimaryKey(item) !== id));
80
75
  }
81
76
  onUpdateStatus(updateLoaderState.setSuccess(state().status));
82
77
  onUpdateOptions(createSuccessOptions(status, stateRequestOptions));
@@ -109,12 +104,7 @@ export const apiFetchHelper = async (state, onUpdateStatus, onUpdateOptions, onU
109
104
  _status: void 0
110
105
  });
111
106
  const getOptions = (data) => {
112
- const {
113
- page: page2,
114
- total,
115
- limit: limit2,
116
- ...more
117
- } = data;
107
+ const { page: page2, total, limit: limit2, ...more } = data;
118
108
  return {
119
109
  ...toSerializableLoaderOptions(state().options),
120
110
  ...more,
@@ -127,14 +117,11 @@ export const apiFetchHelper = async (state, onUpdateStatus, onUpdateOptions, onU
127
117
  };
128
118
  };
129
119
  const baseRequestOptions = {
130
- ...opts.getBaseRequestOptions?.() || {},
131
- ...opts.fetch?.getRequestOptions?.(page, query, opts) || {}
120
+ ...opts.getBaseRequestOptions?.(),
121
+ ...opts.fetch?.getRequestOptions?.(page, query, opts)
132
122
  };
133
123
  const limit = Number(state().options.limit || baseRequestOptions.params?.limit || config.limit_per_page);
134
- const {
135
- requestOptions,
136
- stateRequestOptions
137
- } = prepareLoaderRequestOptions(
124
+ const { requestOptions, stateRequestOptions } = prepareLoaderRequestOptions(
138
125
  baseRequestOptions,
139
126
  {
140
127
  params: {
@@ -160,10 +147,7 @@ export const apiFetchHelper = async (state, onUpdateStatus, onUpdateOptions, onU
160
147
  } : null,
161
148
  {
162
149
  onSuccess: (response, status) => {
163
- const {
164
- items,
165
- ...moreOptions
166
- } = response;
150
+ const { items, ...moreOptions } = response;
167
151
  onUpdateItems(items);
168
152
  onUpdateOptions({
169
153
  ...getOptions(moreOptions),
@@ -191,10 +175,7 @@ export const apiFindHelper = async (state, onUpdateStatus, onUpdateOptions, onUp
191
175
  }
192
176
  onUpdateStatus(updateLoaderState.setLoading(state().status));
193
177
  onUpdateOptions({});
194
- const {
195
- requestOptions,
196
- stateRequestOptions
197
- } = prepareLoaderRequestOptions(
178
+ const { requestOptions, stateRequestOptions } = prepareLoaderRequestOptions(
198
179
  opts.getBaseRequestOptions?.() || {},
199
180
  opts.find?.getRequestOptions?.(id, opts),
200
181
  opts.params,
@@ -231,16 +212,16 @@ export const updateHelper = async (state, onUpdateStatus, onUpdateOptions, onUpd
231
212
  }
232
213
  onUpdateStatus(updateLoaderState.setLoading(state().status));
233
214
  onUpdateOptions({});
234
- const {
235
- requestOptions,
236
- stateRequestOptions
237
- } = prepareLoaderRequestOptions(
215
+ const { requestOptions, stateRequestOptions } = prepareLoaderRequestOptions(
238
216
  opts.getBaseRequestOptions?.() || {},
239
217
  opts.update?.getRequestOptions?.(id, data, opts),
240
218
  opts.params,
241
219
  opts.signal
242
220
  );
243
- const url = bindParamsToUrl(opts.update?.getURL ? opts.update.getURL(id, data, opts) : `${opts.baseURL}/${id}`, opts.pathBind);
221
+ const url = bindParamsToUrl(
222
+ opts.update?.getURL ? opts.update.getURL(id, data, opts) : `${opts.baseURL}/${id}`,
223
+ opts.pathBind
224
+ );
244
225
  await handleApiRequest(
245
226
  {
246
227
  url,
@@ -53,16 +53,12 @@ export const isPDFFromPath = (path = "") => {
53
53
  };
54
54
  export const useFileAllocate = (selectedFile, props) => {
55
55
  const selectedFileSizeKb = computed(() => ((selectedFile.value?.size || 0) / 1e3).toFixed(2));
56
- const selectedFileSizeMb = computed(
57
- () => ((selectedFile.value?.size || 0) / 1e3 / 1e3).toFixed(2)
58
- );
56
+ const selectedFileSizeMb = computed(() => ((selectedFile.value?.size || 0) / 1e3 / 1e3).toFixed(2));
59
57
  const isSelectedFileUseMb = computed(() => (selectedFile.value?.size || 0) / 1e3 > 1024);
60
58
  const acceptFileSizeKb = computed(() => props.maxSize || 0);
61
59
  const acceptFileSizeMb = computed(() => ((acceptFileSizeKb.value || 0) / 1024).toFixed(2));
62
60
  const isAcceptFileUseMb = computed(() => acceptFileSizeKb.value && acceptFileSizeKb.value > 1024);
63
- const acceptFile = computed(
64
- () => typeof props.accept === "string" ? props.accept : props.accept?.join(",")
65
- );
61
+ const acceptFile = computed(() => typeof props.accept === "string" ? props.accept : props.accept?.join(","));
66
62
  return {
67
63
  selectedFileSizeKb,
68
64
  selectedFileSizeMb,
@@ -40,10 +40,7 @@ export const validateFile = (file, rules, messages) => {
40
40
  };
41
41
  export const validateDimensions = (image, rules, messages) => {
42
42
  if (!rules) return;
43
- const {
44
- width,
45
- height
46
- } = image;
43
+ const { width, height } = image;
47
44
  const checks = [
48
45
  [rules.width !== void 0 && width !== rules.width, messages.imageWidth, rules.width, width],
49
46
  [rules.height !== void 0 && height !== rules.height, messages.imageHeight, rules.height, height],
@@ -1,8 +1,5 @@
1
1
  import defu from "defu";
2
2
  import { th } from "./th.js";
3
3
  import { en } from "./en.js";
4
- export const formatMessage = (template, params = {}) => template.replace(
5
- /\{(\w+)\}/g,
6
- (placeholder, key) => key in params ? String(params[key]) : placeholder
7
- );
4
+ export const formatMessage = (template, params = {}) => template.replace(/\{(\w+)\}/g, (placeholder, key) => key in params ? String(params[key]) : placeholder);
8
5
  export const resolveMessages = (locale, overrides = {}) => defu(overrides, locale === "th" ? th : en);
@@ -1,3 +1,3 @@
1
- {
2
- "extends": "../../../.nuxt/tsconfig.server.json",
3
- }
1
+ {
2
+ "extends": "../../../.nuxt/tsconfig.server.json"
3
+ }
@@ -1 +1 @@
1
- @import "tailwindcss";@import "@nuxt/ui";@plugin "@tailwindcss/typography";@source inline("prose");@theme{--font-sans:"Noto Sans Thai","Noto Sans Thai Looped","Public Sans",sans-serif;--font-display:"Noto Sans Thai","Noto Sans Thai Looped","Public Sans",sans-serif}:root{--ui-text:var(--ui-color-neutral-800);--color-main:#1570ef;--color-main-50:#eff8ff;--color-main-100:#d1e9ff;--color-main-200:#b2ddff;--color-main-300:#84caff;--color-main-400:#53b1fd;--color-main-500:#1570ef;--color-main-600:#1570ef;--color-main-700:#175cd3;--color-main-800:#1849a9;--color-main-900:#194185;--color-main-950:#102a56;--color-warning:#f79009;--color-warning-50:#fffaeb;--color-warning-100:#fef0c7;--color-warning-200:#fedf89;--color-warning-300:#fec84b;--color-warning-400:#fdb022;--color-warning-500:#f79009;--color-warning-600:#dc6803;--color-warning-700:#b54708;--color-warning-800:#93370d;--color-warning-900:#7a2e0e;--color-warning-950:#4e1d09;--color-success:#17b26a;--color-success-50:#ecfdf3;--color-success-100:#dcfae6;--color-success-200:#abefc6;--color-success-300:#75e0a7;--color-success-400:#47cd89;--color-success-500:#17b26a;--color-success-600:#079455;--color-success-700:#067647;--color-success-800:#085d3a;--color-success-900:#074d31;--color-success-950:#053321;--color-error:#e11d48;--color-error-50:#fef2f2;--color-error-100:#fee2e2;--color-error-200:#f0899f;--color-error-300:#eb6582;--color-error-400:#e64065;--color-error-500:#e11d48;--color-error-600:#af1738;--color-error-700:#7e1028;--color-error-800:#4c0a18;--color-error-900:#1a0308;--color-error-950:#010000;--color-info:#2563eb;--color-info-50:#dde9ff;--color-info-100:#c8dfff;--color-info-200:#a1c4ff;--color-info-300:#7aa9ff;--color-info-400:#538eff;--color-info-500:#2563eb;--color-info-600:#1a4aaf;--color-info-700:#0f318a;--color-info-800:#081f65;--color-info-900:#020b3a;--color-info-950:#000;--color-white:#fff;--color-white-50:#fff;--color-white-100:#fff;--color-white-200:#fff;--color-white-300:#fff;--color-white-400:#fff;--color-white-500:#fff;--color-white-600:#e3e3e3;--color-white-700:#c7c7c7;--color-white-800:#ababab;--color-white-900:#8f8f8f;--color-white-950:#818181}html{@apply text-sm lg:text-base;font-family:Noto Sans Thai,Noto Sans Thai Looped,Public Sans,sans-serif}::-webkit-scrollbar{-webkit-appearance:none;height:10px;width:10px}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.3);border-radius:4px;box-shadow:0 0 1px hsla(0,0%,100%,.5)}:root{--dp-font-family:inherit!important}.dp__theme_light{--dp-primary-color:var(--color-main)!important;--dp-primary-disabled-color:var(--color-main-200)!important}.dp__outer_menu_wrap{@apply ring-1 ring-gray-200}[role=dialog]{pointer-events:auto!important}#__nuxt,body,html{@apply w-full h-full}.dp__main{display:block!important}.dp__menu{border:none!important}.dp__pointer{height:44px!important}.dp__outer_menu_wrap{box-shadow:none!important}.dp--menu-wrapper{@apply ring-1 ring-slate-300}
1
+ @import "tailwindcss";@import "@nuxt/ui";@plugin "@tailwindcss/typography";@source inline("prose");@theme{--font-sans:"Noto Sans Thai","Noto Sans Thai Looped","Public Sans",sans-serif;--font-display:"Noto Sans Thai","Noto Sans Thai Looped","Public Sans",sans-serif}:root{--ui-text:var(--ui-color-neutral-800);--color-main:#1570ef;--color-main-50:#eff8ff;--color-main-100:#d1e9ff;--color-main-200:#b2ddff;--color-main-300:#84caff;--color-main-400:#53b1fd;--color-main-500:#1570ef;--color-main-600:#1570ef;--color-main-700:#175cd3;--color-main-800:#1849a9;--color-main-900:#194185;--color-main-950:#102a56;--color-warning:#f79009;--color-warning-50:#fffaeb;--color-warning-100:#fef0c7;--color-warning-200:#fedf89;--color-warning-300:#fec84b;--color-warning-400:#fdb022;--color-warning-500:#f79009;--color-warning-600:#dc6803;--color-warning-700:#b54708;--color-warning-800:#93370d;--color-warning-900:#7a2e0e;--color-warning-950:#4e1d09;--color-success:#17b26a;--color-success-50:#ecfdf3;--color-success-100:#dcfae6;--color-success-200:#abefc6;--color-success-300:#75e0a7;--color-success-400:#47cd89;--color-success-500:#17b26a;--color-success-600:#079455;--color-success-700:#067647;--color-success-800:#085d3a;--color-success-900:#074d31;--color-success-950:#053321;--color-error:#e11d48;--color-error-50:#fef2f2;--color-error-100:#fee2e2;--color-error-200:#f0899f;--color-error-300:#eb6582;--color-error-400:#e64065;--color-error-500:#e11d48;--color-error-600:#af1738;--color-error-700:#7e1028;--color-error-800:#4c0a18;--color-error-900:#1a0308;--color-error-950:#010000;--color-info:#2563eb;--color-info-50:#dde9ff;--color-info-100:#c8dfff;--color-info-200:#a1c4ff;--color-info-300:#7aa9ff;--color-info-400:#538eff;--color-info-500:#2563eb;--color-info-600:#1a4aaf;--color-info-700:#0f318a;--color-info-800:#081f65;--color-info-900:#020b3a;--color-info-950:#000;--color-white:#fff;--color-white-50:#fff;--color-white-100:#fff;--color-white-200:#fff;--color-white-300:#fff;--color-white-400:#fff;--color-white-500:#fff;--color-white-600:#e3e3e3;--color-white-700:#c7c7c7;--color-white-800:#ababab;--color-white-900:#8f8f8f;--color-white-950:#818181}html{@apply text-sm lg:text-base;font-family:Noto Sans Thai,Noto Sans Thai Looped,Public Sans,sans-serif}::-webkit-scrollbar{-webkit-appearance:none;height:10px;width:10px}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.3);border-radius:4px;box-shadow:0 0 1px hsla(0,0%,100%,.5)}:root{--dp-font-family:inherit!important}.dp__theme_light{--dp-primary-color:var(--color-main)!important;--dp-primary-disabled-color:var(--color-main-200)!important}.dp__outer_menu_wrap{@apply ring-1 ring-gray-200}[role=dialog]{pointer-events:auto!important}#__nuxt,body,html{@apply h-full w-full}.dp__main{display:block!important}.dp__menu{border:none!important}.dp__pointer{height:44px!important}.dp__outer_menu_wrap{box-shadow:none!important}.dp--menu-wrapper{@apply ring-1 ring-slate-300}
package/package.json CHANGED
@@ -1,20 +1,13 @@
1
1
  {
2
2
  "name": "@finema/core",
3
- "version": "3.23.2",
4
- "repository": "https://gitlab.finema.co/finema/ui-kit",
3
+ "version": "3.24.0",
5
4
  "license": "MIT",
6
5
  "author": "Finema Dev Core Team",
7
- "engines": {
8
- "node": ">=22"
9
- },
6
+ "repository": "https://gitlab.finema.co/finema/ui-kit",
7
+ "files": [
8
+ "dist"
9
+ ],
10
10
  "type": "module",
11
- "exports": {
12
- ".": {
13
- "types": "./dist/types.d.mts",
14
- "style": "./dist/runtime/styles/main.css",
15
- "default": "./dist/module.mjs"
16
- }
17
- },
18
11
  "main": "./dist/module.mjs",
19
12
  "typesVersions": {
20
13
  "*": {
@@ -23,17 +16,21 @@
23
16
  ]
24
17
  }
25
18
  },
26
- "files": [
27
- "dist"
28
- ],
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/types.d.mts",
22
+ "style": "./dist/runtime/styles/main.css",
23
+ "default": "./dist/module.mjs"
24
+ }
25
+ },
29
26
  "scripts": {
30
27
  "prepack": "nuxt-module-build build",
31
28
  "dev": "bun run dev:prepare && nuxi dev playground -o",
32
29
  "dev:build": "nuxi build playground",
33
30
  "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground",
34
- "release": "npm run lint && npm run test && npm run prepack && changelogen --release && npm publish && git push --follow-tags",
35
- "lint": "eslint .",
36
- "lint:fix": "eslint --fix .",
31
+ "release": "npm run check && npm run test && npm run prepack && changelogen --release && npm publish && git push --follow-tags",
32
+ "lint": "oxlint",
33
+ "lint:fix": "oxlint --fix",
37
34
  "test": "vitest run",
38
35
  "test:unit": "vitest run --project unit",
39
36
  "test:nuxt": "vitest run --project nuxt",
@@ -41,7 +38,12 @@
41
38
  "test:coverage": "vitest run --coverage",
42
39
  "test:types": "vue-tsc --noEmit && cd playground && vue-tsc --noEmit -p .nuxt/tsconfig.app.json",
43
40
  "bundle:report": "node scripts/bundle-report.mjs",
44
- "prepare": "husky"
41
+ "prepare": "husky",
42
+ "format": "oxfmt",
43
+ "format:check": "oxfmt --check",
44
+ "check": "oxfmt --check && oxlint && nuxt-oxclint check-vue src playground",
45
+ "check:vue": "nuxt-oxclint check-vue src playground",
46
+ "check:vue:fix": "nuxt-oxclint check-vue --fix src playground"
45
47
  },
46
48
  "dependencies": {
47
49
  "@iconify-json/heroicons": "^1.2.2",
@@ -50,7 +52,7 @@
50
52
  "@nuxt/kit": "^4.5.2",
51
53
  "@nuxt/ui": "^4.11.1",
52
54
  "@pinia/nuxt": "^1.0.2",
53
- "@tailwindcss/typography": "^0.5.0-alpha.3",
55
+ "@tailwindcss/typography": "^0.5.20",
54
56
  "@tiptap/extension-text-align": "^3.18.0",
55
57
  "@vee-validate/nuxt": "^4.15.1",
56
58
  "@vee-validate/valibot": "^4.15.1",
@@ -67,15 +69,13 @@
67
69
  "url-join": "^5.0.0"
68
70
  },
69
71
  "devDependencies": {
70
- "@eslint/js": "^10.0.1",
71
- "@finema/eslint-config": "^2.0.4",
72
+ "@finema/nuxt-oxclint": "^1.0.1",
72
73
  "@nuxt/devtools": "^3.4.2",
73
- "@nuxt/eslint-config": "^1.17.0",
74
74
  "@nuxt/module-builder": "^1.0.3",
75
75
  "@nuxt/schema": "^4.5.2",
76
76
  "@nuxt/test-utils": "^4.3.2",
77
77
  "@types/lodash-es": "^4.17.12",
78
- "@types/node": "latest",
78
+ "@types/node": "^22",
79
79
  "@vitest/coverage-v8": "^5.0.1",
80
80
  "@vue/test-utils": "^2.5.1",
81
81
  "changelogen": "^0.6.1",
@@ -83,12 +83,25 @@
83
83
  "husky": "^9.1.7",
84
84
  "lint-staged": "^17.0.7",
85
85
  "nuxt": "^4.5.2",
86
+ "oxfmt": "^0.70.0",
87
+ "oxlint": "^1.85.0",
86
88
  "typescript": "~5.9.3",
87
- "typescript-eslint": "^8.18.0",
88
89
  "vitest": "^5.0.1",
89
90
  "vue-tsc": "^3.0.4"
90
91
  },
91
92
  "lint-staged": {
92
- "*": "eslint"
93
+ "*.{js,mjs,cjs,ts,mts,cts}": [
94
+ "oxfmt",
95
+ "oxlint"
96
+ ],
97
+ "*.vue": [
98
+ "oxfmt",
99
+ "oxlint",
100
+ "nuxt-oxclint check-vue"
101
+ ],
102
+ "*.{json,jsonc,css}": "oxfmt"
103
+ },
104
+ "engines": {
105
+ "node": ">=22"
93
106
  }
94
107
  }