Skip to content

Commit

Permalink
feat: nuxt support
Browse files Browse the repository at this point in the history
  • Loading branch information
dnldsht committed Sep 14, 2024
1 parent 997be1d commit 8e3d1d7
Show file tree
Hide file tree
Showing 6 changed files with 3,943 additions and 80 deletions.
7 changes: 6 additions & 1 deletion build.config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { defineBuildConfig } from 'unbuild'

export default defineBuildConfig({
externals: ['vue', 'luxon', 'defu'],
externals: ['vue', 'luxon', 'defu', '@nuxt/kit', '@nuxt/schema'],
entries: [
'./src/index',
'./src/nuxt',
],
declaration: true,
})
15 changes: 10 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,18 @@
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
"import": "./dist/index.mjs"
},
"./nuxt": {
"types": "./dist/nuxt.d.ts",
"import": "./dist/nuxt.mjs"
}
},
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"files": [
"dist"
"dist/*",
"dist/nuxt/*"
],
"scripts": {
"build": "unbuild",
Expand All @@ -43,15 +46,17 @@
},
"devDependencies": {
"@antfu/eslint-config": "^3.6.0",
"@nuxt/kit": "^3.13.1",
"@types/luxon": "^3.3.0",
"@vitest/coverage-v8": "^2.1.1",
"@vitest/ui": "^2.1.0",
"eslint": "^9.10.0",
"jsdom": "^25.0.0",
"nuxt": "^3.13.1",
"ts-loader": "^9.4.4",
"typescript": "^5.1.3",
"unbuild": "^1.2.1",
"vitest": "^2.1.0",
"vue": "^3.3.4"
}
}
}
36 changes: 36 additions & 0 deletions src/nuxt.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import type { LuxOptions } from './types'
import { addPluginTemplate, defineNuxtModule } from '@nuxt/kit'
import defu from 'defu'
import { DEFAULT_OPTIONS } from './config'

export default defineNuxtModule<LuxOptions>({
meta: {
name: 'nuxt-lux',
configKey: 'lux',
compatibility: {
nuxt: '>=3.0.0',
},
},
defaults: DEFAULT_OPTIONS,
setup(luxOptions, nuxt) {
nuxt.options.runtimeConfig.public.lux = defu(
nuxt.options.runtimeConfig.public.lux || {},
luxOptions,
)

addPluginTemplate({
filename: '001.lux.client.mjs',
getContents() {
return `
import VueLux from 'vue-lux'
import { defineNuxtPlugin, useRuntimeConfig } from '#imports'
export default defineNuxtPlugin((nuxtApp) => {
const options = useRuntimeConfig().public?.lux || {}
nuxtApp.vueApp.use(VueLux, options)
})
`
},
})
},
})
40 changes: 39 additions & 1 deletion src/types.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { DateTimeFormatOptions, ToISOTimeOptions, ToRelativeOptions, ToSQLOptions, Zone } from 'luxon'
import type { DateTime, DateTimeFormatOptions, ToISOTimeOptions, ToRelativeOptions, ToSQLOptions, Zone } from 'luxon'

export interface InputOptions {
zone?: string | Zone
Expand All @@ -20,3 +20,41 @@ export interface LuxOptions {
input?: InputOptions
output?: OutputOptions
}

type ParseInput = string | number | Date
type FormatInputOptions = string | Partial<InputOptions>
type FormatOutputOptions = string | Partial<OutputOptions>

declare module '@nuxt/schema' {
interface NuxtConfig {
['lux']?: LuxOptions
}
interface NuxtOptions {
['lux']?: LuxOptions
}
}

declare module 'nuxt/schema' {
interface NuxtConfig {
['lux']?: LuxOptions
}
interface NuxtOptions {
['lux']?: LuxOptions
}
}

declare module '#app' {
interface NuxtApp {
$luxon: (value: ParseInput, format?: FormatOutputOptions, inputFormat?: FormatInputOptions) => string | number | Date | null
$lp: (value: ParseInput, format?: FormatInputOptions) => DateTime
$lf: (value: ParseInput, format?: FormatOutputOptions, inputFormat?: FormatInputOptions) => string | number | Date | null
}
}

declare module 'vue' {
interface ComponentCustomProperties {
$luxon: (value: ParseInput, format?: FormatOutputOptions, inputFormat?: FormatInputOptions) => string | number | Date | null
$lp: (value: ParseInput, format?: FormatInputOptions) => DateTime
$lf: (value: ParseInput, format?: FormatOutputOptions, inputFormat?: FormatInputOptions) => string | number | Date | null
}
}
8 changes: 1 addition & 7 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
import type { App } from 'vue'

import type { ParseOptions } from './parse'
import type { InputOptions, LuxOptions, OutputOptions } from './types'
import type { FormatInputOptions, FormatOutputOptions, InputOptions, LuxOptions, OutputOptions, ParseInput } from './types'
import { defu } from 'defu'
import formatDateTime from './format'
import parseInput from './parse'

type ParseInput = string | number | Date
type FormatInputOptions = string | Partial<InputOptions>
type FormatOutputOptions = string | Partial<OutputOptions>

function extendInput(luxOptions: Required<LuxOptions>, value: ParseInput, format?: FormatInputOptions): ParseOptions {
let options = typeof format === 'string' ? { format } : format
if (options === undefined) {
Expand Down
Loading

0 comments on commit 8e3d1d7

Please sign in to comment.