@devcoffee/nuxt-core 1.0.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/README.md ADDED
@@ -0,0 +1,84 @@
1
+ <!--
2
+ Get your module up and running quickly.
3
+
4
+ Find and replace all on all files (CMD+SHIFT+F):
5
+ - Name: My Module
6
+ - Package name: my-module
7
+ - Description: My new Nuxt module
8
+ -->
9
+
10
+ # My Module
11
+
12
+ [![npm version][npm-version-src]][npm-version-href]
13
+ [![npm downloads][npm-downloads-src]][npm-downloads-href]
14
+ [![License][license-src]][license-href]
15
+ [![Nuxt][nuxt-src]][nuxt-href]
16
+
17
+ My new Nuxt module for doing amazing things.
18
+
19
+ - [✨ &nbsp;Release Notes](/CHANGELOG.md)
20
+ <!-- - [🏀 Online playground](https://stackblitz.com/github/your-org/my-module?file=playground%2Fapp.vue) -->
21
+ <!-- - [📖 &nbsp;Documentation](https://example.com) -->
22
+
23
+ ## Features
24
+
25
+ <!-- Highlight some of the features your module provide here -->
26
+ - ⛰ &nbsp;Foo
27
+ - 🚠 &nbsp;Bar
28
+ - 🌲 &nbsp;Baz
29
+
30
+ ## Quick Setup
31
+
32
+ Install the module to your Nuxt application with one command:
33
+
34
+ ```bash
35
+ npx nuxi module add my-module
36
+ ```
37
+
38
+ That's it! You can now use My Module in your Nuxt app ✨
39
+
40
+
41
+ ## Contribution
42
+
43
+ <details>
44
+ <summary>Local development</summary>
45
+
46
+ ```bash
47
+ # Install dependencies
48
+ npm install
49
+
50
+ # Generate type stubs
51
+ npm run dev:prepare
52
+
53
+ # Develop with the playground
54
+ npm run dev
55
+
56
+ # Build the playground
57
+ npm run dev:build
58
+
59
+ # Run ESLint
60
+ npm run lint
61
+
62
+ # Run Vitest
63
+ npm run test
64
+ npm run test:watch
65
+
66
+ # Release new version
67
+ npm run release
68
+ ```
69
+
70
+ </details>
71
+
72
+
73
+ <!-- Badges -->
74
+ [npm-version-src]: https://img.shields.io/npm/v/my-module/latest.svg?style=flat&colorA=020420&colorB=00DC82
75
+ [npm-version-href]: https://npmjs.com/package/my-module
76
+
77
+ [npm-downloads-src]: https://img.shields.io/npm/dm/my-module.svg?style=flat&colorA=020420&colorB=00DC82
78
+ [npm-downloads-href]: https://npm.chart.dev/my-module
79
+
80
+ [license-src]: https://img.shields.io/npm/l/my-module.svg?style=flat&colorA=020420&colorB=00DC82
81
+ [license-href]: https://npmjs.com/package/my-module
82
+
83
+ [nuxt-src]: https://img.shields.io/badge/Nuxt-020420?logo=nuxt.js
84
+ [nuxt-href]: https://nuxt.com
@@ -0,0 +1,161 @@
1
+ import * as _nuxt_schema from '@nuxt/schema';
2
+ import { LogLevel, ConsolaOptions } from 'consola';
3
+
4
+ type LoggingOptions = {
5
+ tag: string;
6
+ level: LogLevel;
7
+ } & DeepPartial<Pick<ConsolaOptions, 'throttle' | 'throttleMin' | 'formatOptions'>>;
8
+ type ModuleOptions = {
9
+ logging: {
10
+ server: LoggingOptions;
11
+ ssr: LoggingOptions;
12
+ client: LoggingOptions;
13
+ };
14
+ };
15
+
16
+ declare const configKey: "nuxtCore";
17
+ declare module 'nuxt/schema' {
18
+ interface RuntimeConfig {
19
+ [configKey]: ModuleOptions;
20
+ }
21
+ interface PublicRuntimeConfig {
22
+ [configKey]: {
23
+ logging: ModuleOptions['logging']['client'];
24
+ };
25
+ }
26
+ }
27
+ declare const _default: _nuxt_schema.NuxtModule<{
28
+ logging?: {
29
+ server?: {
30
+ tag?: string | undefined;
31
+ level?: 0 | 1 | 2 | 3 | 4 | 5 | {
32
+ toString?: {} | undefined;
33
+ toFixed?: {} | undefined;
34
+ toExponential?: {} | undefined;
35
+ toPrecision?: {} | undefined;
36
+ valueOf?: {} | undefined;
37
+ toLocaleString?: {} | undefined;
38
+ } | undefined;
39
+ throttle?: number | undefined;
40
+ throttleMin?: number | undefined;
41
+ formatOptions?: {
42
+ [x: string]: unknown;
43
+ columns?: number | undefined;
44
+ date?: boolean | undefined;
45
+ colors?: boolean | undefined;
46
+ compact?: boolean | number | undefined;
47
+ errorLevel?: number | undefined;
48
+ } | undefined;
49
+ } | undefined;
50
+ ssr?: {
51
+ tag?: string | undefined;
52
+ level?: 0 | 1 | 2 | 3 | 4 | 5 | {
53
+ toString?: {} | undefined;
54
+ toFixed?: {} | undefined;
55
+ toExponential?: {} | undefined;
56
+ toPrecision?: {} | undefined;
57
+ valueOf?: {} | undefined;
58
+ toLocaleString?: {} | undefined;
59
+ } | undefined;
60
+ throttle?: number | undefined;
61
+ throttleMin?: number | undefined;
62
+ formatOptions?: {
63
+ [x: string]: unknown;
64
+ columns?: number | undefined;
65
+ date?: boolean | undefined;
66
+ colors?: boolean | undefined;
67
+ compact?: boolean | number | undefined;
68
+ errorLevel?: number | undefined;
69
+ } | undefined;
70
+ } | undefined;
71
+ client?: {
72
+ tag?: string | undefined;
73
+ level?: 0 | 1 | 2 | 3 | 4 | 5 | {
74
+ toString?: {} | undefined;
75
+ toFixed?: {} | undefined;
76
+ toExponential?: {} | undefined;
77
+ toPrecision?: {} | undefined;
78
+ valueOf?: {} | undefined;
79
+ toLocaleString?: {} | undefined;
80
+ } | undefined;
81
+ throttle?: number | undefined;
82
+ throttleMin?: number | undefined;
83
+ formatOptions?: {
84
+ [x: string]: unknown;
85
+ columns?: number | undefined;
86
+ date?: boolean | undefined;
87
+ colors?: boolean | undefined;
88
+ compact?: boolean | number | undefined;
89
+ errorLevel?: number | undefined;
90
+ } | undefined;
91
+ } | undefined;
92
+ } | undefined;
93
+ }, {
94
+ logging?: {
95
+ server?: {
96
+ tag?: string | undefined;
97
+ level?: 0 | 1 | 2 | 3 | 4 | 5 | {
98
+ toString?: {} | undefined;
99
+ toFixed?: {} | undefined;
100
+ toExponential?: {} | undefined;
101
+ toPrecision?: {} | undefined;
102
+ valueOf?: {} | undefined;
103
+ toLocaleString?: {} | undefined;
104
+ } | undefined;
105
+ throttle?: number | undefined;
106
+ throttleMin?: number | undefined;
107
+ formatOptions?: {
108
+ [x: string]: unknown;
109
+ columns?: number | undefined;
110
+ date?: boolean | undefined;
111
+ colors?: boolean | undefined;
112
+ compact?: boolean | number | undefined;
113
+ errorLevel?: number | undefined;
114
+ } | undefined;
115
+ } | undefined;
116
+ ssr?: {
117
+ tag?: string | undefined;
118
+ level?: 0 | 1 | 2 | 3 | 4 | 5 | {
119
+ toString?: {} | undefined;
120
+ toFixed?: {} | undefined;
121
+ toExponential?: {} | undefined;
122
+ toPrecision?: {} | undefined;
123
+ valueOf?: {} | undefined;
124
+ toLocaleString?: {} | undefined;
125
+ } | undefined;
126
+ throttle?: number | undefined;
127
+ throttleMin?: number | undefined;
128
+ formatOptions?: {
129
+ [x: string]: unknown;
130
+ columns?: number | undefined;
131
+ date?: boolean | undefined;
132
+ colors?: boolean | undefined;
133
+ compact?: boolean | number | undefined;
134
+ errorLevel?: number | undefined;
135
+ } | undefined;
136
+ } | undefined;
137
+ client?: {
138
+ tag?: string | undefined;
139
+ level?: 0 | 1 | 2 | 3 | 4 | 5 | {
140
+ toString?: {} | undefined;
141
+ toFixed?: {} | undefined;
142
+ toExponential?: {} | undefined;
143
+ toPrecision?: {} | undefined;
144
+ valueOf?: {} | undefined;
145
+ toLocaleString?: {} | undefined;
146
+ } | undefined;
147
+ throttle?: number | undefined;
148
+ throttleMin?: number | undefined;
149
+ formatOptions?: {
150
+ [x: string]: unknown;
151
+ columns?: number | undefined;
152
+ date?: boolean | undefined;
153
+ colors?: boolean | undefined;
154
+ compact?: boolean | number | undefined;
155
+ errorLevel?: number | undefined;
156
+ } | undefined;
157
+ } | undefined;
158
+ } | undefined;
159
+ }, false>;
160
+
161
+ export { _default as default };
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "nuxt-core",
3
+ "version": "1.0.0",
4
+ "configKey": "nuxtCore",
5
+ "compatibility": {
6
+ "nuxt": "^4.0.0"
7
+ },
8
+ "builder": {
9
+ "@nuxt/module-builder": "1.0.2",
10
+ "unbuild": "3.6.1"
11
+ }
12
+ }
@@ -0,0 +1,76 @@
1
+ import { useLogger, defineNuxtModule, createResolver, addServerImportsDir, addServerPlugin, addImportsDir, addPlugin } from '@nuxt/kit';
2
+ import { merge } from 'lodash-es';
3
+
4
+ const version = "1.0.0";
5
+
6
+ const defaultModuleOptions = {
7
+ logging: {
8
+ server: {
9
+ tag: "server",
10
+ level: 2
11
+ },
12
+ ssr: {
13
+ tag: "app-ssr",
14
+ level: 2
15
+ },
16
+ client: {
17
+ tag: "app-client",
18
+ level: 2
19
+ }
20
+ }
21
+ };
22
+ function normalizedModuleOptions(...inputOpts) {
23
+ return merge({}, defaultModuleOptions, ...inputOpts);
24
+ }
25
+
26
+ const moduleName = "nuxt-core";
27
+ const configKey = "nuxtCore";
28
+ const logger = useLogger(moduleName);
29
+ const module = defineNuxtModule({
30
+ meta: {
31
+ name: moduleName,
32
+ version,
33
+ configKey,
34
+ compatibility: {
35
+ nuxt: "^4.0.0"
36
+ }
37
+ },
38
+ // Default configuration options of the Nuxt module
39
+ defaults: {},
40
+ setup(_options, _nuxt) {
41
+ const resolver = createResolver(import.meta.url);
42
+ let normalizedRuntimeConfig = _nuxt.options.runtimeConfig || {};
43
+ const normalizedOptions = normalizedModuleOptions(_options, normalizedRuntimeConfig[configKey] || {});
44
+ normalizedRuntimeConfig = merge(normalizedRuntimeConfig, {
45
+ [configKey]: normalizedOptions,
46
+ public: {
47
+ [configKey]: merge({}, { logging: normalizedOptions.logging.client })
48
+ }
49
+ });
50
+ _nuxt.options.runtimeConfig = normalizedRuntimeConfig;
51
+ const sharedAlias = {};
52
+ _nuxt.options.alias = merge(_nuxt.options.alias, sharedAlias);
53
+ _nuxt.options.typescript = merge(_nuxt.options.typescript, {
54
+ tsConfig: { compilerOptions: { types: [] } }
55
+ });
56
+ addServerImportsDir(resolver.resolve("./runtime/server/composables"));
57
+ addServerPlugin(resolver.resolve("./runtime/server/plugins/logging"));
58
+ addImportsDir(resolver.resolve("./runtime/app/composables"));
59
+ addPlugin({
60
+ mode: "all",
61
+ name: "devcoffee-nuxt-core-logging",
62
+ src: resolver.resolve("./runtime/app/plugins/logging.ts")
63
+ });
64
+ _nuxt.hook("nitro:prepare:types", (opts) => {
65
+ opts.references.push({ path: resolver.resolve("./runtime/types/global.env.d.ts") });
66
+ opts.references.push({ path: resolver.resolve("./runtime/types/nitro.d.ts") });
67
+ });
68
+ _nuxt.hook("prepare:types", (opts) => {
69
+ opts.references.push({ path: resolver.resolve("./runtime/types/global.env.d.ts") });
70
+ opts.references.push({ path: resolver.resolve("./runtime/types/nuxt.d.ts") });
71
+ });
72
+ logger.success("`%s` setup finished", moduleName);
73
+ }
74
+ });
75
+
76
+ export { module as default };
@@ -0,0 +1,5 @@
1
+ import type { LogLevel } from 'consola';
2
+ export default function useLogger(opts?: {
3
+ tag?: string;
4
+ level?: LogLevel;
5
+ }): any;
@@ -0,0 +1,4 @@
1
+ import { useNuxtApp } from "#app";
2
+ export default function useLogger(opts) {
3
+ return useNuxtApp().$logging.getLogger(opts);
4
+ }
@@ -0,0 +1,17 @@
1
+ import { type ConsolaInstance, type LogLevel } from 'consola';
2
+ declare const _default: import("#app").Plugin<{
3
+ logging: {
4
+ getLogger: (opts?: {
5
+ tag?: string;
6
+ level?: LogLevel;
7
+ }) => ConsolaInstance;
8
+ };
9
+ }> & import("#app").ObjectPlugin<{
10
+ logging: {
11
+ getLogger: (opts?: {
12
+ tag?: string;
13
+ level?: LogLevel;
14
+ }) => ConsolaInstance;
15
+ };
16
+ }>;
17
+ export default _default;
@@ -0,0 +1,26 @@
1
+ import { reactive } from "vue";
2
+ import { defineNuxtPlugin, useRequestEvent, useRuntimeConfig } from "#app";
3
+ import { consola } from "consola";
4
+ function initLogger() {
5
+ let config;
6
+ if (import.meta.server) {
7
+ config = useRuntimeConfig(useRequestEvent()).nuxtCore.logging.ssr;
8
+ } else {
9
+ config = useRuntimeConfig().public.nuxtCore.logging;
10
+ console.log("Initializing logger with tag:", config);
11
+ }
12
+ const { tag = "app", ...opts } = config;
13
+ return consola.create(opts).withTag(tag);
14
+ }
15
+ export default defineNuxtPlugin(async (_nuxtApp) => {
16
+ const logger = reactive(initLogger());
17
+ function getLogger(opts) {
18
+ const { tag, level } = opts || {};
19
+ let _logger = logger;
20
+ if (level != void 0) {
21
+ _logger = _logger.create({ level });
22
+ }
23
+ return tag != void 0 ? _logger.withTag(tag) : _logger;
24
+ }
25
+ return { provide: { logging: { getLogger } } };
26
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: import("#app").Plugin<Record<string, unknown>> & import("#app").ObjectPlugin<Record<string, unknown>>;
2
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import { defineNuxtPlugin } from "#app";
2
+ export default defineNuxtPlugin((_nuxtApp) => {
3
+ console.log("Plugin injected by my-module!");
4
+ });
@@ -0,0 +1,6 @@
1
+ import { type ConsolaInstance, type LogLevel } from 'consola';
2
+ import type { H3Event } from 'h3';
3
+ export default function useServerLogger(event?: H3Event, opts?: {
4
+ tag?: string;
5
+ level: LogLevel;
6
+ }): ConsolaInstance;
@@ -0,0 +1,15 @@
1
+ import { consola } from "consola";
2
+ import { useRuntimeConfig } from "nitropack/runtime";
3
+ let globalServerLogger;
4
+ export default function useServerLogger(event, opts) {
5
+ if (!globalServerLogger) {
6
+ const { tag: tag2, ...opts2 } = useRuntimeConfig(event).nuxtCore.logging.server;
7
+ globalServerLogger = consola.create(opts2).withTag(tag2);
8
+ }
9
+ const { tag, level } = opts || {};
10
+ let _logger = globalServerLogger;
11
+ if (level != void 0) {
12
+ _logger = _logger.create({ level });
13
+ }
14
+ return tag != void 0 ? _logger.withTag(tag) : _logger;
15
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: import("nitropack").NitroAppPlugin;
2
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import { defineNitroPlugin } from "nitropack/runtime";
2
+ import useServerLogger from "../composables/useServerLogger.js";
3
+ export default defineNitroPlugin((nitroApp) => {
4
+ nitroApp.hooks.hook("request", async (event) => {
5
+ event.context.logger = useServerLogger(event);
6
+ });
7
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "../../../.nuxt/tsconfig.server.json",
3
+ }
@@ -0,0 +1,39 @@
1
+ declare global {
2
+ type GenericType<T = any, K extends string = string> = Record<K, T>
3
+
4
+ type Nullable<T> = T | null
5
+
6
+ type Concrete<Type> = {
7
+ [Property in keyof Type]-?: Type[Property]
8
+ }
9
+
10
+ type DeepPartial<T> = T extends object
11
+ ? {
12
+ [P in keyof T]?: DeepPartial<T[P]>
13
+ }
14
+ : T
15
+
16
+ type DeepReadonly<T> = T extends (infer R)[]
17
+ ? ReadonlyArray<DeepReadonly<R>>
18
+ : T extends (...args: any[]) => any
19
+ ? T // Functions are not frozen, but their properties are
20
+ : T extends object
21
+ ? { readonly [P in keyof T]: DeepReadonly<T[P]> }
22
+ : T
23
+
24
+ type UnionKeyOf<T1, T2> = Array<Partial<keyof T1> & Partial<keyof T2>>
25
+
26
+ type WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] }
27
+
28
+ type ElementType<T extends ReadonlyArray<unknown>> = T extends ReadonlyArray<infer ElementType> ? ElementType : never
29
+
30
+ type IteratorKeys<T extends Readonly<Array<string>>> = T[number]
31
+
32
+ type Distinct<T, DistinctName> = T & { __TYPE__: DistinctName }
33
+
34
+ type MayBeDate = Date | string | number
35
+
36
+ type Awaitable<T> = T | Promise<T>
37
+ }
38
+
39
+ export {}
@@ -0,0 +1,9 @@
1
+ import type { ConsolaInstance } from 'consola'
2
+
3
+ declare module 'h3' {
4
+ interface H3EventContext {
5
+ logger: ConsolaInstance
6
+ }
7
+ }
8
+
9
+ export {}
@@ -0,0 +1,17 @@
1
+ import type { ConsolaInstance } from 'consola'
2
+
3
+ type NuxtCoreLogging = {
4
+ getLogger: (opts?: { tag?: string; level?: LogLevel }) => ConsolaInstance
5
+ }
6
+
7
+ declare module 'vue' {
8
+ interface ComponentCustomProperties {
9
+ $logging: NuxtCoreLogging
10
+ }
11
+ }
12
+
13
+ declare module '#app' {
14
+ interface NuxtApp {
15
+ $logging: NuxtCoreLogging
16
+ }
17
+ }
@@ -0,0 +1,7 @@
1
+ import type { NuxtModule } from '@nuxt/schema'
2
+
3
+ import type { default as Module } from './module.mjs'
4
+
5
+ export type ModuleOptions = typeof Module extends NuxtModule<infer O> ? Partial<O> : Record<string, any>
6
+
7
+ export { default } from './module.mjs'
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@devcoffee/nuxt-core",
3
+ "version": "1.0.0",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "author": "Hieu Nguyen <hieunguyen@devcoffee.tech>",
8
+ "description": "devcoffee core module for Nuxt",
9
+ "license": "MIT",
10
+ "type": "module",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/types.d.mts",
14
+ "import": "./dist/module.mjs"
15
+ }
16
+ },
17
+ "main": "./dist/module.mjs",
18
+ "typesVersions": {
19
+ "*": {
20
+ ".": [
21
+ "./dist/types.d.mts"
22
+ ]
23
+ }
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "nuxt": {
29
+ "module": "src/module.ts"
30
+ },
31
+ "scripts": {
32
+ "dev": "npm run dev:prepare && nuxi dev playground",
33
+ "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground",
34
+ "dev:build": "nuxi build playground",
35
+ "prepack": "nuxt-module-build build",
36
+ "release": "npm run lint && npm run test && npm run prepack && changelogen --release && npm publish && git push --follow-tags",
37
+ "lint": "eslint .",
38
+ "test": "vitest run",
39
+ "test:watch": "vitest watch",
40
+ "test:types": "vue-tsc --noEmit && cd playground && vue-tsc --noEmit"
41
+ },
42
+ "dependencies": {
43
+ "@nuxt/kit": "^4.1.3",
44
+ "consola": "^3.4.2",
45
+ "lodash-es": "^4.17.21"
46
+ },
47
+ "devDependencies": {
48
+ "@ianvs/prettier-plugin-sort-imports": "^4.7.0",
49
+ "@nuxt/devtools": "^2.6.5",
50
+ "@nuxt/eslint": "^1.9.0",
51
+ "@nuxt/eslint-config": "^1.9.0",
52
+ "@nuxt/module-builder": "^1.0.2",
53
+ "@nuxt/schema": "^4.1.3",
54
+ "@nuxt/test-utils": "^3.19.2",
55
+ "@types/lodash-es": "^4.17.12",
56
+ "@types/node": "latest",
57
+ "changelogen": "^0.6.2",
58
+ "cross-env": "^10.1.0",
59
+ "devcoffee-global-types": "^1.0.0",
60
+ "eslint": "^9.37.0",
61
+ "eslint-config-prettier": "^10.1.8",
62
+ "eslint-plugin-prettier": "^5.5.4",
63
+ "nuxt": "^4.1.3",
64
+ "prettier": "^3.6.2",
65
+ "typescript": "~5.9.3",
66
+ "vitest": "^3.2.4",
67
+ "vue-tsc": "^3.1.0"
68
+ }
69
+ }