@falcondev-oss/nuxt-layers-base 0.1.0 → 0.2.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.
package/.eslintcache ADDED
@@ -0,0 +1 @@
1
+ [{"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/.playground/app/pages/index.vue":"1","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/.playground/app/plugins/trpc.ts":"2","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/.playground/app/plugins/vue-query.ts":"3","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/.playground/nuxt.config.ts":"4","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/.playground/tsconfig.json":"5","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/app.config.ts":"6","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/app.vue":"7","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/Define.vue":"8","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/layout/LayoutDashboard.vue":"9","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/overlay/modal/ModalActions.vue":"10","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/overlay/modal/ModalConfirm.vue":"11","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/overlay/modal/ModalRadioGroup.vue":"12","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UActions.vue":"13","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UCustomApp.vue":"14","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UField.vue":"15","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UForm.vue":"16","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UImageWithFallback.vue":"17","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UInputDatePicker.vue":"18","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UInputDurationMinutes.vue":"19","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UTableCard.vue":"20","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/useConfirm.ts":"21","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/usePreventPageLeave.ts":"22","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/useRouteParamString.ts":"23","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/useTableColumns.tsx":"24","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/useToast.ts":"25","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/useTrpc.ts":"26","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/error.vue":"27","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/pages/index.vue":"28","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/utils/debug.ts":"29","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/utils/files.ts":"30","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/utils/form-field-translators.ts":"31","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/utils/plugins.ts":"32","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/utils/reactivity.ts":"33","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/eslint.config.js":"34","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/nuxt.config.ts":"35","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/package.json":"36","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/pnpm-workspace.yaml":"37","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/prettier.config.js":"38","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/server/plugins/error.ts":"39","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/server/utils/error.ts":"40","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/shared/types/helpers.ts":"41","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/shared/utils/helpers.ts":"42","/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/tsconfig.json":"43"},{"size":5174,"mtime":1768239102553,"results":"44","hashOfConfig":"45"},{"size":74,"mtime":1768241307821,"results":"46","hashOfConfig":"47"},{"size":50,"mtime":1768241335543,"results":"48","hashOfConfig":"47"},{"size":146,"mtime":1768202972627,"results":"49","hashOfConfig":"50"},{"size":267,"mtime":1768202972627,"results":"51","hashOfConfig":"52"},{"size":93,"mtime":1767990460949,"results":"53","hashOfConfig":"54"},{"size":40,"mtime":1767990460950,"results":"55","hashOfConfig":"45"},{"size":191,"mtime":1768239555742,"results":"56","hashOfConfig":"57"},{"size":2796,"mtime":1768202972627},{"size":559,"mtime":1767990460950,"results":"58","hashOfConfig":"57"},{"size":643,"mtime":1768202972628,"results":"59","hashOfConfig":"57"},{"size":1049,"mtime":1767990460951,"results":"60","hashOfConfig":"57"},{"size":464,"mtime":1767990460951,"results":"61","hashOfConfig":"57"},{"size":399,"mtime":1767990460951,"results":"62","hashOfConfig":"57"},{"size":1845,"mtime":1768238289984,"results":"63","hashOfConfig":"57"},{"size":2277,"mtime":1768238601520,"results":"64","hashOfConfig":"57"},{"size":779,"mtime":1767990460952,"results":"65","hashOfConfig":"57"},{"size":1014,"mtime":1767990460952,"results":"66","hashOfConfig":"57"},{"size":2417,"mtime":1768203580874,"results":"67","hashOfConfig":"57"},{"size":289,"mtime":1767990460953,"results":"68","hashOfConfig":"57"},{"size":398,"mtime":1767990460953,"results":"69","hashOfConfig":"70"},{"size":880,"mtime":1767990460953,"results":"71","hashOfConfig":"70"},{"size":488,"mtime":1767990460953,"results":"72","hashOfConfig":"70"},{"size":1880,"mtime":1768203586018,"results":"73","hashOfConfig":"74"},{"size":829,"mtime":1768203611441,"results":"75","hashOfConfig":"70"},{"size":58,"mtime":1767990460954,"results":"76","hashOfConfig":"70"},{"size":219,"mtime":1768241277604,"results":"77","hashOfConfig":"45"},{"size":41,"mtime":1767990460955,"results":"78","hashOfConfig":"79"},{"size":1257,"mtime":1768240554059,"results":"80","hashOfConfig":"47"},{"size":436,"mtime":1768240476716,"results":"81","hashOfConfig":"47"},{"size":1047,"mtime":1767990460955,"results":"82","hashOfConfig":"47"},{"size":4049,"mtime":1768241330447},{"size":448,"mtime":1767990460955,"results":"83","hashOfConfig":"47"},{"size":379,"mtime":1767990460955,"results":"84","hashOfConfig":"85"},{"size":1579,"mtime":1768203336712,"results":"86","hashOfConfig":"87"},{"size":1876,"mtime":1768241509585,"results":"88","hashOfConfig":"89"},{"size":88,"mtime":1767991980387,"results":"90","hashOfConfig":"91"},{"size":58,"mtime":1767990460956,"results":"92","hashOfConfig":"85"},{"size":478,"mtime":1768240378975,"results":"93","hashOfConfig":"47"},{"size":696,"mtime":1768240300418,"results":"94","hashOfConfig":"47"},{"size":1000,"mtime":1768240136187,"results":"95","hashOfConfig":"47"},{"size":62,"mtime":1768240170545,"results":"96","hashOfConfig":"47"},{"size":267,"mtime":1767990460956,"results":"97","hashOfConfig":"52"},{"filePath":"98","messages":"99","suppressedMessages":"100","errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"dy2wr3",{"filePath":"101","messages":"102","suppressedMessages":"103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1slzpry",{"filePath":"104","messages":"105","suppressedMessages":"106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"107","messages":"108","suppressedMessages":"109","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1jy1buj",{"filePath":"110","messages":"111","suppressedMessages":"112","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"yzsl08",{"filePath":"113","messages":"114","suppressedMessages":"115","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1sxhzxj",{"filePath":"116","messages":"117","suppressedMessages":"118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"119","messages":"120","suppressedMessages":"121","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1ipwezm",{"filePath":"122","messages":"123","suppressedMessages":"124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"125","messages":"126","suppressedMessages":"127","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"128","messages":"129","suppressedMessages":"130","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"131","messages":"132","suppressedMessages":"133","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"134","messages":"135","suppressedMessages":"136","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"137","messages":"138","suppressedMessages":"139","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"140","messages":"141","suppressedMessages":"142","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"143","messages":"144","suppressedMessages":"145","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"146","messages":"147","suppressedMessages":"148","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"149","messages":"150","suppressedMessages":"151","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"152","messages":"153","suppressedMessages":"154","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"155","messages":"156","suppressedMessages":"157","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1ssgplj",{"filePath":"158","messages":"159","suppressedMessages":"160","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"161","messages":"162","suppressedMessages":"163","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"164","messages":"165","suppressedMessages":"166","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1us478f",{"filePath":"167","messages":"168","suppressedMessages":"169","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"170","messages":"171","suppressedMessages":"172","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"173","messages":"174","suppressedMessages":"175","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"176","messages":"177","suppressedMessages":"178","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"59rlbn",{"filePath":"179","messages":"180","suppressedMessages":"181","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"182","messages":"183","suppressedMessages":"184","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"185","messages":"186","suppressedMessages":"187","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"188","messages":"189","suppressedMessages":"190","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"191","messages":"192","suppressedMessages":"193","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"11oesf6",{"filePath":"194","messages":"195","suppressedMessages":"196","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"4k8tof",{"filePath":"197","messages":"198","suppressedMessages":"199","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"krcaqp",{"filePath":"200","messages":"201","suppressedMessages":"202","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"10hqm82",{"filePath":"203","messages":"204","suppressedMessages":"205","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"206","messages":"207","suppressedMessages":"208","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"209","messages":"210","suppressedMessages":"211","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"212","messages":"213","suppressedMessages":"214","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"215","messages":"216","suppressedMessages":"217","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"218","messages":"219","suppressedMessages":"220","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/.playground/app/pages/index.vue",["221","222"],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/.playground/app/plugins/trpc.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/.playground/app/plugins/vue-query.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/.playground/nuxt.config.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/.playground/tsconfig.json",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/app.config.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/app.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/Define.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/overlay/modal/ModalActions.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/overlay/modal/ModalConfirm.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/overlay/modal/ModalRadioGroup.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UActions.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UCustomApp.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UField.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UForm.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UImageWithFallback.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UInputDatePicker.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UInputDurationMinutes.vue",[],["223"],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/components/u/UTableCard.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/useConfirm.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/usePreventPageLeave.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/useRouteParamString.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/useTableColumns.tsx",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/useToast.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/composables/useTrpc.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/error.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/pages/index.vue",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/utils/debug.ts",[],["224","225","226"],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/utils/files.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/utils/form-field-translators.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/app/utils/reactivity.ts",[],["227","228"],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/eslint.config.js",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/nuxt.config.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/package.json",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/pnpm-workspace.yaml",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/prettier.config.js",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/server/plugins/error.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/server/utils/error.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/shared/types/helpers.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/shared/utils/helpers.ts",[],[],"/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/tsconfig.json",[],[],{"ruleId":"229","severity":1,"message":"230","line":19,"column":5,"nodeType":"231","messageId":"232","endLine":19,"endColumn":16,"suggestions":"233"},{"ruleId":"229","severity":1,"message":"230","line":61,"column":11,"nodeType":"231","messageId":"232","endLine":61,"endColumn":22,"suggestions":"234"},{"ruleId":"235","severity":2,"message":"236","line":18,"column":22,"nodeType":"237","messageId":"238","endLine":18,"endColumn":68,"fix":"239","suppressions":"240"},{"ruleId":"241","severity":2,"message":"242","line":14,"column":11,"nodeType":"243","messageId":"244","endLine":14,"endColumn":22,"suppressions":"245"},{"ruleId":"229","severity":1,"message":"230","line":31,"column":7,"nodeType":"231","messageId":"232","endLine":31,"endColumn":29,"suggestions":"246","suppressions":"247"},{"ruleId":"229","severity":1,"message":"230","line":40,"column":7,"nodeType":"231","messageId":"232","endLine":40,"endColumn":23,"suggestions":"248","suppressions":"249"},{"ruleId":"250","severity":2,"message":"251","line":8,"column":5,"nodeType":"252","messageId":"253","endLine":8,"endColumn":33,"suppressions":"254"},{"ruleId":"250","severity":2,"message":"251","line":13,"column":5,"nodeType":"252","messageId":"253","endLine":13,"endColumn":33,"suppressions":"255"},"no-console","Unexpected console statement. Only these console methods are allowed: warn, error, debug, trace.","MemberExpression","limited",["256"],["257"],"unicorn/prefer-string-raw","`String.raw` should be used to avoid escaping `\\`.","Literal","prefer-string-raw",{"range":"258","text":"259"},["260"],"unicorn/error-message","Pass a message to the `Error` constructor.","NewExpression","missing-message",["261"],["262"],["263"],["264"],["265"],"ts/no-unsafe-assignment","Unsafe assignment of an `any` value.","AssignmentExpression","anyAssignment",["266"],["267"],{"fix":"268","messageId":"269","data":"270","desc":"271"},{"fix":"272","messageId":"269","data":"273","desc":"271"},[615,661],"String.raw`^-?(?<hours>\\d{1,}):?(?<minutes>\\d{1,2})?$`",{"kind":"274","justification":"275"},{"kind":"274","justification":"275"},{"fix":"276","messageId":"269","data":"277","desc":"278"},{"kind":"274","justification":"275"},{"fix":"279","messageId":"269","data":"280","desc":"281"},{"kind":"274","justification":"275"},{"kind":"274","justification":"275"},{"kind":"274","justification":"275"},{"range":"282","text":"275"},"removeConsole",{"propertyName":"283"},"Remove the console.log().",{"range":"284","text":"275"},{"propertyName":"283"},"directive","",{"range":"285","text":"275"},{"propertyName":"286"},"Remove the console.groupCollapsed().",{"range":"287","text":"275"},{"propertyName":"288"},"Remove the console.groupEnd().",[425,444],"log",[1161,1184],[865,1071],"groupCollapsed",[1150,1168],"groupEnd"]
@@ -14,13 +14,15 @@ type HydrationStrategies = {
14
14
  type LazyComponent<T> = DefineComponent<HydrationStrategies, {}, {}, {}, {}, {}, {}, { hydrated: () => void }> & T
15
15
 
16
16
 
17
- export const Var: typeof import("../app/components/Var.vue").default
17
+ export const Define: typeof import("../app/components/Define.vue").default
18
+ export const LayoutDashboard: typeof import("../app/components/layout/LayoutDashboard.vue").default
18
19
  export const OverlayModalActions: typeof import("../app/components/overlay/modal/ModalActions.vue").default
19
20
  export const OverlayModalConfirm: typeof import("../app/components/overlay/modal/ModalConfirm.vue").default
20
21
  export const OverlayModalRadioGroup: typeof import("../app/components/overlay/modal/ModalRadioGroup.vue").default
21
22
  export const UActions: typeof import("../app/components/u/UActions.vue").default
22
23
  export const UCustomApp: typeof import("../app/components/u/UCustomApp.vue").default
23
24
  export const UField: typeof import("../app/components/u/UField.vue").default
25
+ export const UForm: typeof import("../app/components/u/UForm.vue").default
24
26
  export const UImageWithFallback: typeof import("../app/components/u/UImageWithFallback.vue").default
25
27
  export const UInputDatePicker: typeof import("../app/components/u/UInputDatePicker.vue").default
26
28
  export const UInputDurationMinutes: typeof import("../app/components/u/UInputDurationMinutes.vue").default
@@ -86,7 +88,6 @@ export const UFieldGroup: typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_ac
86
88
  export const UFileUpload: typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FileUpload.vue").default
87
89
  export const UFooter: typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Footer.vue").default
88
90
  export const UFooterColumns: typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FooterColumns.vue").default
89
- export const UForm: typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Form.vue").default
90
91
  export const UFormField: typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FormField.vue").default
91
92
  export const UHeader: typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Header.vue").default
92
93
  export const UIcon: typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Icon.vue").default
@@ -171,13 +172,15 @@ export const Head: typeof import("../node_modules/.pnpm/nuxt@4.2.2_@parcel+watch
171
172
  export const Html: typeof import("../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/head/runtime/components").Html
172
173
  export const Body: typeof import("../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/head/runtime/components").Body
173
174
  export const NuxtIsland: typeof import("../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/app/components/nuxt-island").default
174
- export const LazyVar: LazyComponent<typeof import("../app/components/Var.vue").default>
175
+ export const LazyDefine: LazyComponent<typeof import("../app/components/Define.vue").default>
176
+ export const LazyLayoutDashboard: LazyComponent<typeof import("../app/components/layout/LayoutDashboard.vue").default>
175
177
  export const LazyOverlayModalActions: LazyComponent<typeof import("../app/components/overlay/modal/ModalActions.vue").default>
176
178
  export const LazyOverlayModalConfirm: LazyComponent<typeof import("../app/components/overlay/modal/ModalConfirm.vue").default>
177
179
  export const LazyOverlayModalRadioGroup: LazyComponent<typeof import("../app/components/overlay/modal/ModalRadioGroup.vue").default>
178
180
  export const LazyUActions: LazyComponent<typeof import("../app/components/u/UActions.vue").default>
179
181
  export const LazyUCustomApp: LazyComponent<typeof import("../app/components/u/UCustomApp.vue").default>
180
182
  export const LazyUField: LazyComponent<typeof import("../app/components/u/UField.vue").default>
183
+ export const LazyUForm: LazyComponent<typeof import("../app/components/u/UForm.vue").default>
181
184
  export const LazyUImageWithFallback: LazyComponent<typeof import("../app/components/u/UImageWithFallback.vue").default>
182
185
  export const LazyUInputDatePicker: LazyComponent<typeof import("../app/components/u/UInputDatePicker.vue").default>
183
186
  export const LazyUInputDurationMinutes: LazyComponent<typeof import("../app/components/u/UInputDurationMinutes.vue").default>
@@ -243,7 +246,6 @@ export const LazyUFieldGroup: LazyComponent<typeof import("../node_modules/.pnpm
243
246
  export const LazyUFileUpload: LazyComponent<typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FileUpload.vue").default>
244
247
  export const LazyUFooter: LazyComponent<typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Footer.vue").default>
245
248
  export const LazyUFooterColumns: LazyComponent<typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FooterColumns.vue").default>
246
- export const LazyUForm: LazyComponent<typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Form.vue").default>
247
249
  export const LazyUFormField: LazyComponent<typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FormField.vue").default>
248
250
  export const LazyUHeader: LazyComponent<typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Header.vue").default>
249
251
  export const LazyUIcon: LazyComponent<typeof import("../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Icon.vue").default>
@@ -39,9 +39,12 @@ export { usePreventPageLeave } from '../app/composables/usePreventPageLeave';
39
39
  export { useRouteParamString } from '../app/composables/useRouteParamString';
40
40
  export { useTableColumns } from '../app/composables/useTableColumns';
41
41
  export { useTrpc } from '../app/composables/useTrpc';
42
+ export { downloadStringAsFile } from '../app/utils/files';
42
43
  export { nullUndefinedTranslator, nullIndeterminateTranslator, indeterminateFalseTranslator, dateValueIsoTranslator } from '../app/utils/form-field-translators';
43
44
  export { vueQueryPlugin, trpcPlugin } from '../app/utils/plugins';
44
45
  export { refEffect } from '../app/utils/reactivity';
46
+ export { as } from '../shared/utils/helpers';
47
+ export { Falsy, TypedBroadcastChannel } from '../shared/types/helpers';
45
48
  export { defineLocale, extendLocale } from '../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/composables/defineLocale';
46
49
  export { extractShortcuts, defineShortcuts } from '../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/composables/defineShortcuts';
47
50
  export { useFileUpload } from '../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/composables/useFileUpload';
@@ -10,5 +10,5 @@ function createRemoteCollection(fetchEndpoint) {
10
10
  }
11
11
 
12
12
  export const collections = {
13
- 'ph': () => import('@iconify-json/ph/icons.json', { with: { type: 'json' } }).then(m => m.default),
13
+ 'lucide': () => import('@iconify-json/lucide/icons.json', { with: { type: 'json' } }).then(m => m.default),
14
14
  }
package/.nuxt/nuxt.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /// <reference types="@nuxt/ui" />
2
2
  /// <reference types="@vueuse/nuxt" />
3
- /// <reference types="@nuxt/devtools" />
4
3
  /// <reference types="@nuxt/telemetry" />
4
+ /// <reference types="@nuxt/devtools" />
5
5
  /// <reference path="types/builder-env.d.ts" />
6
6
  /// <reference path="types/plugins.d.ts" />
7
7
  /// <reference path="types/build.d.ts" />
@@ -1,7 +1,7 @@
1
1
  /// <reference types="@nuxt/ui" />
2
2
  /// <reference types="@vueuse/nuxt" />
3
- /// <reference types="@nuxt/devtools" />
4
3
  /// <reference types="@nuxt/telemetry" />
4
+ /// <reference types="@nuxt/devtools" />
5
5
  /// <reference path="types/modules.d.ts" />
6
6
  /// <reference path="types/runtime-config.d.ts" />
7
7
  /// <reference path="types/app.config.d.ts" />
@@ -13,9 +13,6 @@
13
13
  "h3": [
14
14
  "../node_modules/.pnpm/h3@1.15.4/node_modules/h3"
15
15
  ],
16
- "consola": [
17
- "../node_modules/.pnpm/consola@3.4.2/node_modules/consola"
18
- ],
19
16
  "ofetch": [
20
17
  "../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch"
21
18
  ],
@@ -98,7 +95,7 @@
98
95
  "./imports"
99
96
  ],
100
97
  "#app-manifest": [
101
- "./manifest/meta/24fb5e89-93fb-44cb-bbff-2a13f165c1e8"
98
+ "./manifest/meta/feb19a4d-b5c8-4680-84fd-e0098912b09e"
102
99
  ],
103
100
  "#components": [
104
101
  "./components"
@@ -13,9 +13,6 @@
13
13
  "h3": [
14
14
  "../node_modules/.pnpm/h3@1.15.4/node_modules/h3"
15
15
  ],
16
- "consola": [
17
- "../node_modules/.pnpm/consola@3.4.2/node_modules/consola"
18
- ],
19
16
  "ofetch": [
20
17
  "../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch"
21
18
  ],
@@ -98,7 +95,7 @@
98
95
  "./imports"
99
96
  ],
100
97
  "#app-manifest": [
101
- "./manifest/meta/24fb5e89-93fb-44cb-bbff-2a13f165c1e8"
98
+ "./manifest/meta/feb19a4d-b5c8-4680-84fd-e0098912b09e"
102
99
  ],
103
100
  "#components": [
104
101
  "./components"
@@ -13,9 +13,6 @@
13
13
  "h3": [
14
14
  "../node_modules/.pnpm/h3@1.15.4/node_modules/h3"
15
15
  ],
16
- "consola": [
17
- "../node_modules/.pnpm/consola@3.4.2/node_modules/consola"
18
- ],
19
16
  "ofetch": [
20
17
  "../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch"
21
18
  ],
@@ -41,9 +41,6 @@
41
41
  "h3": [
42
42
  "../node_modules/.pnpm/h3@1.15.4/node_modules/h3"
43
43
  ],
44
- "consola": [
45
- "../node_modules/.pnpm/consola@3.4.2/node_modules/consola"
46
- ],
47
44
  "ofetch": [
48
45
  "../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch"
49
46
  ],
@@ -13,9 +13,6 @@
13
13
  "h3": [
14
14
  "../node_modules/.pnpm/h3@1.15.4/node_modules/h3"
15
15
  ],
16
- "consola": [
17
- "../node_modules/.pnpm/consola@3.4.2/node_modules/consola"
18
- ],
19
16
  "ofetch": [
20
17
  "../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch"
21
18
  ],
@@ -98,7 +95,7 @@
98
95
  "./imports"
99
96
  ],
100
97
  "#app-manifest": [
101
- "./manifest/meta/24fb5e89-93fb-44cb-bbff-2a13f165c1e8"
98
+ "./manifest/meta/feb19a4d-b5c8-4680-84fd-e0098912b09e"
102
99
  ],
103
100
  "#build": [
104
101
  "."
@@ -14,13 +14,15 @@ type HydrationStrategies = {
14
14
  type LazyComponent<T> = DefineComponent<HydrationStrategies, {}, {}, {}, {}, {}, {}, { hydrated: () => void }> & T
15
15
 
16
16
  interface _GlobalComponents {
17
- 'Var': typeof import("../../app/components/Var.vue").default
17
+ 'Define': typeof import("../../app/components/Define.vue").default
18
+ 'LayoutDashboard': typeof import("../../app/components/layout/LayoutDashboard.vue").default
18
19
  'OverlayModalActions': typeof import("../../app/components/overlay/modal/ModalActions.vue").default
19
20
  'OverlayModalConfirm': typeof import("../../app/components/overlay/modal/ModalConfirm.vue").default
20
21
  'OverlayModalRadioGroup': typeof import("../../app/components/overlay/modal/ModalRadioGroup.vue").default
21
22
  'UActions': typeof import("../../app/components/u/UActions.vue").default
22
23
  'UCustomApp': typeof import("../../app/components/u/UCustomApp.vue").default
23
24
  'UField': typeof import("../../app/components/u/UField.vue").default
25
+ 'UForm': typeof import("../../app/components/u/UForm.vue").default
24
26
  'UImageWithFallback': typeof import("../../app/components/u/UImageWithFallback.vue").default
25
27
  'UInputDatePicker': typeof import("../../app/components/u/UInputDatePicker.vue").default
26
28
  'UInputDurationMinutes': typeof import("../../app/components/u/UInputDurationMinutes.vue").default
@@ -86,7 +88,6 @@ interface _GlobalComponents {
86
88
  'UFileUpload': typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FileUpload.vue").default
87
89
  'UFooter': typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Footer.vue").default
88
90
  'UFooterColumns': typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FooterColumns.vue").default
89
- 'UForm': typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Form.vue").default
90
91
  'UFormField': typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FormField.vue").default
91
92
  'UHeader': typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Header.vue").default
92
93
  'UIcon': typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Icon.vue").default
@@ -171,13 +172,15 @@ interface _GlobalComponents {
171
172
  'Html': typeof import("../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/head/runtime/components").Html
172
173
  'Body': typeof import("../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/head/runtime/components").Body
173
174
  'NuxtIsland': typeof import("../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/app/components/nuxt-island").default
174
- 'LazyVar': LazyComponent<typeof import("../../app/components/Var.vue").default>
175
+ 'LazyDefine': LazyComponent<typeof import("../../app/components/Define.vue").default>
176
+ 'LazyLayoutDashboard': LazyComponent<typeof import("../../app/components/layout/LayoutDashboard.vue").default>
175
177
  'LazyOverlayModalActions': LazyComponent<typeof import("../../app/components/overlay/modal/ModalActions.vue").default>
176
178
  'LazyOverlayModalConfirm': LazyComponent<typeof import("../../app/components/overlay/modal/ModalConfirm.vue").default>
177
179
  'LazyOverlayModalRadioGroup': LazyComponent<typeof import("../../app/components/overlay/modal/ModalRadioGroup.vue").default>
178
180
  'LazyUActions': LazyComponent<typeof import("../../app/components/u/UActions.vue").default>
179
181
  'LazyUCustomApp': LazyComponent<typeof import("../../app/components/u/UCustomApp.vue").default>
180
182
  'LazyUField': LazyComponent<typeof import("../../app/components/u/UField.vue").default>
183
+ 'LazyUForm': LazyComponent<typeof import("../../app/components/u/UForm.vue").default>
181
184
  'LazyUImageWithFallback': LazyComponent<typeof import("../../app/components/u/UImageWithFallback.vue").default>
182
185
  'LazyUInputDatePicker': LazyComponent<typeof import("../../app/components/u/UInputDatePicker.vue").default>
183
186
  'LazyUInputDurationMinutes': LazyComponent<typeof import("../../app/components/u/UInputDurationMinutes.vue").default>
@@ -243,7 +246,6 @@ interface _GlobalComponents {
243
246
  'LazyUFileUpload': LazyComponent<typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FileUpload.vue").default>
244
247
  'LazyUFooter': LazyComponent<typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Footer.vue").default>
245
248
  'LazyUFooterColumns': LazyComponent<typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FooterColumns.vue").default>
246
- 'LazyUForm': LazyComponent<typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Form.vue").default>
247
249
  'LazyUFormField': LazyComponent<typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/FormField.vue").default>
248
250
  'LazyUHeader': LazyComponent<typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Header.vue").default>
249
251
  'LazyUIcon': LazyComponent<typeof import("../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/components/Icon.vue").default>
@@ -3,6 +3,7 @@ export {}
3
3
  declare global {
4
4
  const abortNavigation: typeof import('../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/app/composables/router').abortNavigation
5
5
  const addRouteMiddleware: typeof import('../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/app/composables/router').addRouteMiddleware
6
+ const as: typeof import('../../shared/utils/helpers').as
6
7
  const asyncComputed: typeof import('@vueuse/core').asyncComputed
7
8
  const autoResetRef: typeof import('@vueuse/core').autoResetRef
8
9
  const avatarGroupInjectionKey: typeof import('../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/composables/useAvatarGroup').avatarGroupInjectionKey
@@ -46,6 +47,7 @@ declare global {
46
47
  const definePayloadReducer: typeof import('../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/app/composables/payload').definePayloadReducer
47
48
  const definePayloadReviver: typeof import('../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/app/composables/payload').definePayloadReviver
48
49
  const defineShortcuts: typeof import('../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/composables/defineShortcuts').defineShortcuts
50
+ const downloadStringAsFile: typeof import('../../app/utils/files').downloadStringAsFile
49
51
  const eagerComputed: typeof import('@vueuse/core').eagerComputed
50
52
  const effect: typeof import('vue').effect
51
53
  const effectScope: typeof import('vue').effectScope
@@ -452,6 +454,9 @@ declare global {
452
454
  // @ts-ignore
453
455
  export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
454
456
  import('vue')
457
+ // @ts-ignore
458
+ export type { Falsy, TypedBroadcastChannel } from '../../shared/types/helpers'
459
+ import('../../shared/types/helpers')
455
460
  }
456
461
  // for vue template auto import
457
462
  import { UnwrapRef } from 'vue'
@@ -459,6 +464,7 @@ declare module 'vue' {
459
464
  interface ComponentCustomProperties {
460
465
  readonly abortNavigation: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/app/composables/router')['abortNavigation']>
461
466
  readonly addRouteMiddleware: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/app/composables/router')['addRouteMiddleware']>
467
+ readonly as: UnwrapRef<typeof import('../../shared/utils/helpers')['as']>
462
468
  readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
463
469
  readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
464
470
  readonly avatarGroupInjectionKey: UnwrapRef<typeof import('../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/composables/useAvatarGroup')['avatarGroupInjectionKey']>
@@ -502,6 +508,7 @@ declare module 'vue' {
502
508
  readonly definePayloadReducer: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/app/composables/payload')['definePayloadReducer']>
503
509
  readonly definePayloadReviver: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.2.2_@parcel+watcher@2.5.1_@types+node@25.0.3_@vue+compiler-sfc@3.5.26_cac@6.7.14_796f8e1fb75d1abd575506ed75b3e79b/node_modules/nuxt/dist/app/composables/payload')['definePayloadReviver']>
504
510
  readonly defineShortcuts: UnwrapRef<typeof import('../../node_modules/.pnpm/@nuxt+ui@4.3.0_acd7e9902344ed04281e7d85198cbb74/node_modules/@nuxt/ui/dist/runtime/composables/defineShortcuts')['defineShortcuts']>
511
+ readonly downloadStringAsFile: UnwrapRef<typeof import('../../app/utils/files')['downloadStringAsFile']>
505
512
  readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']>
506
513
  readonly effect: UnwrapRef<typeof import('vue')['effect']>
507
514
  readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']>
@@ -1,5 +1,5 @@
1
1
  import type { ComputedRef, MaybeRef } from 'vue'
2
- export type LayoutKey = "dashboard"
2
+ export type LayoutKey = string
3
3
  declare module 'nuxt/app' {
4
4
  interface PageMeta {
5
5
  layout?: MaybeRef<LayoutKey | false> | ComputedRef<LayoutKey | false>
@@ -7,6 +7,7 @@ declare global {
7
7
  const appendHeaders: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').appendHeaders
8
8
  const appendResponseHeader: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').appendResponseHeader
9
9
  const appendResponseHeaders: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').appendResponseHeaders
10
+ const as: typeof import('../../shared/utils/helpers').as
10
11
  const assertMethod: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').assertMethod
11
12
  const cachedEventHandler: typeof import('../../node_modules/.pnpm/nitropack@2.13.0/node_modules/nitropack/dist/runtime/internal/cache').cachedEventHandler
12
13
  const cachedFunction: typeof import('../../node_modules/.pnpm/nitropack@2.13.0/node_modules/nitropack/dist/runtime/internal/cache').cachedFunction
@@ -40,6 +41,7 @@ declare global {
40
41
  const dynamicEventHandler: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').dynamicEventHandler
41
42
  const eventHandler: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').eventHandler
42
43
  const fetchWithEvent: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').fetchWithEvent
44
+ const filterStackLines: typeof import('../../server/utils/error').filterStackLines
43
45
  const fromNodeMiddleware: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').fromNodeMiddleware
44
46
  const fromPlainHandler: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').fromPlainHandler
45
47
  const fromWebHandler: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').fromWebHandler
@@ -125,6 +127,12 @@ declare global {
125
127
  const useStorage: typeof import('../../node_modules/.pnpm/nitropack@2.13.0/node_modules/nitropack/dist/runtime/internal/storage').useStorage
126
128
  const writeEarlyHints: typeof import('../../node_modules/.pnpm/h3@1.15.4/node_modules/h3').writeEarlyHints
127
129
  }
130
+ // for type re-export
131
+ declare global {
132
+ // @ts-ignore
133
+ export type { Falsy, TypedBroadcastChannel } from '../../shared/types/helpers'
134
+ import('../../shared/types/helpers')
135
+ }
128
136
  export { useNitroApp } from 'nitropack/runtime/internal/app';
129
137
  export { useRuntimeConfig, useAppConfig } from 'nitropack/runtime/internal/config';
130
138
  export { defineNitroPlugin, nitroPlugin } from 'nitropack/runtime/internal/plugin';
@@ -138,4 +146,6 @@ export { defineTask, runTask } from 'nitropack/runtime/internal/task';
138
146
  export { defineNitroErrorHandler } from 'nitropack/runtime/internal/error/utils';
139
147
  export { appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearResponseHeaders, clearSession, createApp, createAppEventHandler, createError, createEvent, createEventStream, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, defineRequestMiddleware, defineResponseMiddleware, defineWebSocket, defineWebSocketHandler, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, fromPlainHandler, fromWebHandler, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestFingerprint, getRequestHeader, getRequestHeaders, getRequestHost, getRequestIP, getRequestPath, getRequestProtocol, getRequestURL, getRequestWebStream, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, getValidatedQuery, getValidatedRouterParams, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, isWebResponse, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readFormData, readMultipartFormData, readRawBody, readValidatedBody, removeResponseHeader, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendIterable, sendNoContent, sendProxy, sendRedirect, sendStream, sendWebResponse, serveStatic, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, toPlainHandler, toWebHandler, toWebRequest, unsealSession, updateSession, useBase, useSession, writeEarlyHints } from 'h3';
140
148
  export { buildAssetsURL as __buildAssetsURL, publicAssetsURL as __publicAssetsURL } from '/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/node_modules/.pnpm/@nuxt+nitro-server@4.2.2_db0@0.3.4_ioredis@5.9.1_magicast@0.5.1_nuxt@4.2.2_@parcel+watc_ee8d7c56ce54cfbfd60e67a79701f0ee/node_modules/@nuxt/nitro-server/dist/runtime/utils/paths';
141
- export { defineAppConfig } from '/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/node_modules/.pnpm/@nuxt+nitro-server@4.2.2_db0@0.3.4_ioredis@5.9.1_magicast@0.5.1_nuxt@4.2.2_@parcel+watc_ee8d7c56ce54cfbfd60e67a79701f0ee/node_modules/@nuxt/nitro-server/dist/runtime/utils/config';
149
+ export { defineAppConfig } from '/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/node_modules/.pnpm/@nuxt+nitro-server@4.2.2_db0@0.3.4_ioredis@5.9.1_magicast@0.5.1_nuxt@4.2.2_@parcel+watc_ee8d7c56ce54cfbfd60e67a79701f0ee/node_modules/@nuxt/nitro-server/dist/runtime/utils/config';
150
+ export { as } from '/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/shared/utils/helpers';
151
+ export { filterStackLines } from '/Users/louis/CodingProjects/falcondev-oss/nuxt-layers/base/server/utils/error';
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 falconDev OSS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,3 @@
1
+ @utility z-full {
2
+ z-index: 2147483647;
3
+ }
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts" generic="T extends object">
2
+ defineProps<{
3
+ value: T
4
+ }>()
5
+
6
+ defineSlots<{
7
+ default: (props: T) => any
8
+ }>()
9
+ </script>
10
+
11
+ <template>
12
+ <slot v-bind="value" />
13
+ </template>
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import type { ButtonProps, NavigationMenuItem } from '@nuxt/ui'
2
+ import type { NavigationMenuItem } from '@nuxt/ui'
3
3
 
4
4
  defineProps<{
5
5
  sidebar?: {
@@ -1,8 +1,9 @@
1
1
  <script setup lang="ts" generic="T">
2
2
  import type { FormField } from '@falcondev-oss/form-core'
3
- import type { FormFieldProps } from '@nuxt/ui'
3
+ import type { FormFieldProps, FormFieldSlots } from '@nuxt/ui'
4
4
  import type { ModelModifiers } from '@nuxt/ui/runtime/types/input.js'
5
5
  import { useForwardProps } from 'reka-ui'
6
+ import { omit } from 'remeda'
6
7
 
7
8
  type FieldSlotProps<T> = {
8
9
  'modelValue': T
@@ -18,15 +19,16 @@ const props = defineProps<
18
19
  field: FormField<T>
19
20
  }
20
21
  >()
21
- defineSlots<{
22
- default: (props: Omit<FieldSlotProps<T>, 'modelModifiers'>) => any
23
- }>()
22
+ const slots = defineSlots<
23
+ {
24
+ default: (props: Omit<FieldSlotProps<T>, 'modelModifiers'>) => any
25
+ } & Omit<FormFieldSlots, 'default'>
26
+ >()
24
27
 
25
28
  const forwardedProps = useForwardProps(props)
26
29
 
27
30
  const formFieldProps = computed(() => {
28
31
  const { field, ...rest } = forwardedProps.value
29
-
30
32
  return rest
31
33
  })
32
34
 
@@ -50,6 +52,15 @@ const slotProps = computed(
50
52
  v-bind="formFieldProps"
51
53
  :error="forwardedProps.field.errors && forwardedProps.field.errors.join('\n')"
52
54
  >
53
- <slot v-bind="slotProps" />
55
+ <slot v-bind="slotProps">
56
+ <DevOnly>
57
+ <p class="font-black text-red-500">UField missing slot</p>
58
+ </DevOnly>
59
+ </slot>
60
+
61
+ <template v-for="(_, name) in omit(slots, ['default'])" #[name]="slotData">
62
+ <!-- @vue-ignore -->
63
+ <slot :name="name" v-bind="slotData || {}" />
64
+ </template>
54
65
  </UFormField>
55
66
  </template>
@@ -0,0 +1,90 @@
1
+ <script setup lang="ts">
2
+ import type { Toast } from '#ui/composables'
3
+ import type { FormHandle } from '@falcondev-oss/form-core'
4
+ import type { ButtonProps } from '@nuxt/ui'
5
+
6
+ const props = withDefaults(
7
+ defineProps<{
8
+ submitLabel?: string
9
+ submitButtonProps?: ButtonProps
10
+ actions?: ButtonProps[]
11
+ form: FormHandle
12
+ disableSubmitIfUnchanged?: boolean
13
+ successToast?: Partial<Toast>
14
+ preventPageLeave?: boolean
15
+ }>(),
16
+ {
17
+ disableSubmitIfUnchanged: true,
18
+ preventPageLeave: true,
19
+ },
20
+ )
21
+
22
+ defineSlots<{
23
+ default: any
24
+ }>()
25
+
26
+ usePreventPageLeave(() => props.preventPageLeave && props.form.isChanged && !props.form.isLoading)
27
+
28
+ const toast = useToast()
29
+ let unhook: (() => void) | null = null
30
+ watch(
31
+ () => props.form,
32
+ (form) => {
33
+ unhook?.()
34
+ unhook = form.hooks.addHooks({
35
+ afterSubmit(result) {
36
+ if (!result.success || !props.successToast) return
37
+
38
+ toast.add({
39
+ preset: 'success',
40
+ ...props.successToast,
41
+ })
42
+ },
43
+ })
44
+ },
45
+ {
46
+ immediate: true,
47
+ },
48
+ )
49
+
50
+ const actionsWithSubmit = computed(() => {
51
+ const submit = {
52
+ ...props.submitButtonProps,
53
+ variant: 'solid',
54
+ label: props.submitButtonProps?.label ?? props.submitLabel ?? 'Submit',
55
+ disabled: props.disableSubmitIfUnchanged
56
+ ? !props.form.isChanged || props.form.isLoading
57
+ : props.form.isLoading,
58
+ loading: props.form.isLoading,
59
+ onClick: async () => {
60
+ await props.form.submit()
61
+ },
62
+ } satisfies ButtonProps
63
+ if (!props.actions) return [submit]
64
+
65
+ return [...props.actions, submit]
66
+ })
67
+
68
+ const rootErrors = computed(() => props.form.errors?.filter((error) => error.path?.length === 0))
69
+ </script>
70
+
71
+ <template>
72
+ <form class="w-full" @submit.prevent="() => form.submit()">
73
+ <slot />
74
+ <div class="col-span-full flex w-full flex-col gap-4">
75
+ <ul v-if="rootErrors?.length" class="text-error text-sm">
76
+ <li v-for="error of rootErrors" :key="`${error.path}:${error.message}`">
77
+ {{ error.path }}:{{ error.message }}
78
+ </li>
79
+ </ul>
80
+ <div class="flex items-center justify-end gap-4">
81
+ <UActions
82
+ :defaults="{
83
+ variant: 'subtle',
84
+ }"
85
+ :actions="actionsWithSubmit"
86
+ />
87
+ </div>
88
+ </div>
89
+ </form>
90
+ </template>
@@ -83,6 +83,6 @@ const maskOptions: MaskOptions = {
83
83
  lazy: true,
84
84
  }"
85
85
  placeholder="HH:mm"
86
- trailing-icon="ph:timer"
86
+ trailing-icon="lucide:timer"
87
87
  />
88
88
  </template>
@@ -46,7 +46,7 @@ export function useTableColumns<T extends MaybeRef<Record<string, any>[] | undef
46
46
  ]
47
47
  if (actions.onDelete)
48
48
  rowActions.push({
49
- icon: 'ph:trash',
49
+ icon: 'lucide:trash',
50
50
  color: 'error',
51
51
  loadingAuto: true,
52
52
  onClick: async () => {
@@ -4,15 +4,15 @@ import { useToast as useNuxtUiToast } from '#ui/composables'
4
4
  const presets = {
5
5
  success: {
6
6
  color: 'success',
7
- icon: 'ph:check-circle',
7
+ icon: 'lucide:circle-check',
8
8
  },
9
9
  error: {
10
10
  color: 'error',
11
- icon: 'ph:x-circle',
11
+ icon: 'lucide:circle-x',
12
12
  },
13
13
  warning: {
14
14
  color: 'warning',
15
- icon: 'ph:warning-circle',
15
+ icon: 'lucide:circle-alert',
16
16
  },
17
17
  } as const satisfies Record<string, Partial<Toast>>
18
18
 
@@ -0,0 +1,48 @@
1
+ function mulberry32(seed: number) {
2
+ return function () {
3
+ let t = (seed += 0x6d_2b_79_f5)
4
+ t = Math.imul(t ^ (t >>> 15), t | 1)
5
+ t ^= t + Math.imul(t ^ (t >>> 7), t | 61)
6
+ return ((t ^ (t >>> 14)) >>> 0) / 4_294_967_296
7
+ }
8
+ }
9
+
10
+ export function debug(label: string, ...ref: MaybeRefOrGetter<unknown>[]) {
11
+ let error: Error | undefined
12
+ try {
13
+ // eslint-disable-next-line unicorn/error-message
14
+ throw new Error()
15
+ } catch (err: unknown) {
16
+ if (!(err instanceof Error)) return
17
+ err.name = 'LookAtThisCallstackError'
18
+ err.stack = err.stack
19
+ ?.split('\n')
20
+ .filter((_, i) => [0, 2].includes(i))
21
+ .join('\n')
22
+ error = err
23
+ }
24
+
25
+ const random = mulberry32([...label].reduce((acc, c) => acc + c.codePointAt(0)!, 0))()
26
+
27
+ watch(
28
+ () => ref.map(toValue),
29
+ (value) => {
30
+ // eslint-disable-next-line no-console
31
+ console.groupCollapsed(
32
+ `%c ${label} `,
33
+ `font-weight: normal !important; background: hsl(${Math.floor(
34
+ random * 360,
35
+ )}, 70%, 70%); color: #111;`,
36
+ ...value,
37
+ )
38
+ console.debug(error)
39
+ // eslint-disable-next-line no-console
40
+ console.groupEnd()
41
+ },
42
+ {
43
+ immediate: true,
44
+ flush: 'sync',
45
+ deep: true,
46
+ },
47
+ )
48
+ }
@@ -0,0 +1,22 @@
1
+ export function downloadStringAsFile({
2
+ content,
3
+ fileName,
4
+ contentType,
5
+ }: {
6
+ content: string | BlobPart
7
+ fileName: string
8
+ contentType: string
9
+ }) {
10
+ const blob = new Blob([content], { type: `${contentType};charset=utf-8` })
11
+ const url = URL.createObjectURL(blob)
12
+
13
+ const a = document.createElement('a')
14
+ a.href = url
15
+ a.download = fileName
16
+ document.body.append(a)
17
+
18
+ a.click()
19
+ a.remove()
20
+
21
+ URL.revokeObjectURL(url)
22
+ }
@@ -5,27 +5,69 @@ import { createTRPCVueQueryClient } from '@falcondev-oss/trpc-vue-query'
5
5
  import {
6
6
  dehydrate,
7
7
  hydrate,
8
+ MutationCache,
8
9
  QueryClient,
9
10
  useQueryClient,
10
11
  VueQueryPlugin,
11
12
  } from '@tanstack/vue-query'
12
- import { httpSubscriptionLink, splitLink } from '@trpc/client'
13
+ import { httpSubscriptionLink, isTRPCClientError, splitLink, TRPCClientError } from '@trpc/client'
13
14
  import defu from 'defu'
14
15
  import { useState } from 'nuxt/app'
15
16
  import superjson from 'superjson'
16
17
  import { httpBatchLink, httpLink } from 'trpc-nuxt/client'
17
18
 
18
19
  interface VueQueryNuxtPluginOptions {
19
- queryClientOptions: QueryClientConfig
20
+ queryClientOptions?: QueryClientConfig
20
21
  vuePluginOptions?: VueQueryPluginOptions
21
22
  }
22
23
  export function vueQueryPlugin(opts?: VueQueryNuxtPluginOptions) {
23
24
  return {
24
25
  name: 'vue-query',
25
26
  setup(nuxt) {
27
+ const toast = useToast()
26
28
  const vueQueryState = useState<DehydratedState | null>('vue-query')
27
29
 
28
- const queryClient = new QueryClient(defu(opts?.queryClientOptions, {}))
30
+ const queryClient = new QueryClient(
31
+ defu<QueryClientConfig, QueryClientConfig[]>(opts?.queryClientOptions, {
32
+ defaultOptions: {
33
+ queries: {
34
+ experimental_prefetchInRender: true,
35
+ retry(failureCount, error) {
36
+ if (
37
+ isTRPCClientError<AnyTRPCRouter>(error) &&
38
+ error.data &&
39
+ // eslint-disable-next-line ts/no-unsafe-member-access
40
+ error.data.httpStatus >= 400 &&
41
+ // eslint-disable-next-line ts/no-unsafe-member-access
42
+ error.data.httpStatus < 500
43
+ )
44
+ return false
45
+ return failureCount < 3
46
+ },
47
+ },
48
+ },
49
+ mutationCache: new MutationCache({
50
+ onError(err) {
51
+ console.error(err)
52
+
53
+ if (err instanceof TRPCClientError) {
54
+ toast.add({
55
+ preset: 'error',
56
+ title: 'Request Error',
57
+ description: err.message,
58
+ duration: 5000,
59
+ })
60
+ }
61
+
62
+ toast.add({
63
+ preset: 'error',
64
+ title: 'An unknown error occurred',
65
+ duration: 5000,
66
+ })
67
+ },
68
+ }),
69
+ }),
70
+ )
29
71
  const options: VueQueryPluginOptions = { queryClient, ...opts?.vuePluginOptions }
30
72
 
31
73
  nuxt.vueApp.use(VueQueryPlugin, options)
@@ -55,7 +97,6 @@ export function trpcPlugin<Router extends AnyTRPCRouter>(opts: TrpcNuxtPluginOpt
55
97
  dependsOn: ['vue-query'] as any,
56
98
  setup() {
57
99
  const queryClient = useQueryClient()
58
- const headers = useRequestHeaders()
59
100
 
60
101
  const trpc = createTRPCVueQueryClient<Router>({
61
102
  queryClient,
@@ -72,13 +113,11 @@ export function trpcPlugin<Router extends AnyTRPCRouter>(opts: TrpcNuxtPluginOpt
72
113
  true: httpLink({
73
114
  transformer: superjson,
74
115
  url: opts.url,
75
- headers,
76
116
  }),
77
117
  false: httpBatchLink({
78
118
  transformer: superjson,
79
119
  url: opts.url,
80
120
  maxURLLength: 2000,
81
- headers,
82
121
  }),
83
122
  }),
84
123
  }),
package/package.json CHANGED
@@ -1,13 +1,23 @@
1
1
  {
2
2
  "name": "@falcondev-oss/nuxt-layers-base",
3
3
  "type": "module",
4
- "version": "0.1.0",
4
+ "version": "0.2.0",
5
+ "description": "Nuxt layer with lots of useful helpers and @nuxt/ui components",
6
+ "license": "MIT",
7
+ "repository": "github:falcondev-oss/nuxt-layers",
8
+ "bugs": {
9
+ "url": "https://github.com/falcondev-oss/nuxt-layers/issues"
10
+ },
5
11
  "main": "./nuxt.config.ts",
12
+ "engines": {
13
+ "node": "24",
14
+ "pnpm": "10"
15
+ },
6
16
  "dependencies": {
7
17
  "@falcondev-oss/form-core": "^0.18.5",
8
18
  "@falcondev-oss/form-vue": "^0.18.5",
9
19
  "@falcondev-oss/trpc-vue-query": "^0.5.2",
10
- "@iconify-json/ph": "^1.2.2",
20
+ "@iconify-json/lucide": "^1.2.2",
11
21
  "@internationalized/date": "^3.10.1",
12
22
  "@nuxt/icon": "^2.2.0",
13
23
  "@nuxt/ui": "4.3.0",
@@ -20,6 +30,7 @@
20
30
  "@vueuse/nuxt": "^14.1.0",
21
31
  "@vueuse/router": "^14.1.0",
22
32
  "arkregex": "^0.0.5",
33
+ "consola": "^3.4.2",
23
34
  "defu": "^6.1.4",
24
35
  "maska": "^3.2.0",
25
36
  "reka-ui": "^2.7.0",
@@ -37,10 +48,15 @@
37
48
  "typescript": "^5.9.3",
38
49
  "vue": "^3.5.26",
39
50
  "vue-router": "^4.6.4",
51
+ "vue-tsc": "^3.2.2",
40
52
  "zod": "^4.3.5"
41
53
  },
42
54
  "scripts": {
43
55
  "dev": "nuxi dev .playground",
44
- "dev:prepare": "nuxt prepare .playground"
56
+ "dev:prepare": "nuxt prepare .playground",
57
+ "type-check": "vue-tsc --noEmit",
58
+ "lint": "eslint --cache . && prettier --check --cache .",
59
+ "lint:ci": "eslint --cache --cache-strategy content . && prettier --check --cache --cache-strategy content .",
60
+ "lint:fix": "eslint --fix --cache . && prettier --write --cache ."
45
61
  }
46
62
  }
@@ -0,0 +1,20 @@
1
+ import type { H3Error } from 'h3'
2
+ import { consola } from 'consola'
3
+
4
+ const nitroLogger = consola.withTag('nitro')
5
+
6
+ export default defineNitroPlugin((nitroApp) => {
7
+ nitroApp.hooks.hook('error', (error, { event }) => {
8
+ filterStackLines(error)
9
+
10
+ if (!event) {
11
+ nitroLogger.error(error)
12
+ return
13
+ }
14
+
15
+ const logger = nitroLogger.withTag(event.method).withTag(event.path)
16
+ const _error = error as H3Error
17
+
18
+ logger.error(_error.statusCode, error)
19
+ })
20
+ })
@@ -0,0 +1,24 @@
1
+ const ignoreStackLinesRegEx = /\(<anonymous>\)|node_modules|node:internal/
2
+ const indexRegEx = /index \d+/
3
+
4
+ export function filterStackLines(error: Error) {
5
+ if (error.cause instanceof Error && error.cause.message === error.message) {
6
+ delete error.cause
7
+ }
8
+
9
+ error.stack = error.stack
10
+ ?.split(/\n\s*at /)
11
+ .filter((line, index, stack) => {
12
+ if (ignoreStackLinesRegEx.test(line)) return false
13
+
14
+ if (indexRegEx.test(line)) {
15
+ const previousItem = stack[index + 1]
16
+ if (!previousItem) return false
17
+ if (ignoreStackLinesRegEx.test(previousItem) || index === stack.length - 1) return false
18
+ }
19
+
20
+ return true
21
+ })
22
+ .join('\nat ')
23
+ .trim()
24
+ }
@@ -0,0 +1,27 @@
1
+ import type { OverrideProperties } from 'type-fest'
2
+
3
+ export type Falsy = false | null | undefined | 0 | ''
4
+
5
+ type TypedBroadcastChannelEventMap<T> = OverrideProperties<
6
+ BroadcastChannelEventMap,
7
+ {
8
+ message: MessageEvent<T>
9
+ messageerror: MessageEvent<T>
10
+ }
11
+ >
12
+
13
+ export interface TypedBroadcastChannel<T> extends BroadcastChannel {
14
+ onmessage: ((this: BroadcastChannel, ev: MessageEvent<T>) => any) | null
15
+ onmessageerror: ((this: BroadcastChannel, ev: MessageEvent<T>) => any) | null
16
+ postMessage: (message: T) => void
17
+ addEventListener: <K extends keyof TypedBroadcastChannelEventMap<T>>(
18
+ type: K,
19
+ listener: (this: BroadcastChannel, ev: TypedBroadcastChannelEventMap<T>[K]) => any,
20
+ options?: boolean | AddEventListenerOptions,
21
+ ) => void
22
+ removeEventListener: <K extends keyof TypedBroadcastChannelEventMap<T>>(
23
+ type: K,
24
+ listener: (this: BroadcastChannel, ev: TypedBroadcastChannelEventMap<T>[K]) => any,
25
+ options?: boolean | EventListenerOptions,
26
+ ) => void
27
+ }
@@ -0,0 +1,3 @@
1
+ export function as<T>(input: unknown) {
2
+ return input as T
3
+ }
@@ -1,13 +0,0 @@
1
- <script setup lang="ts" generic="T">
2
- defineProps<{
3
- value: T
4
- }>()
5
-
6
- defineSlots<{
7
- default: (props: { value: T }) => any
8
- }>()
9
- </script>
10
-
11
- <template>
12
- <slot v-bind="{ value }" />
13
- </template>
@@ -1,5 +0,0 @@
1
- onlyBuiltDependencies:
2
- - '@parcel/watcher'
3
- - esbuild
4
- - unrs-resolver
5
- - vue-demi