From 7b4f26dad8e700cb019f4bc687d11003c9b5ddc3 Mon Sep 17 00:00:00 2001 From: Mehmet Date: Sun, 10 Dec 2023 13:44:02 +0300 Subject: [PATCH] feat: update PergelOptions import and function signatures (#53) --- packages/nuxt/client/composables/state.ts | 4 +- packages/nuxt/src/core/devtools.ts | 4 +- packages/nuxt/src/core/types/devtools.ts | 6 +- packages/nuxt/src/core/types/module.ts | 295 +++++++++++++++++++++- packages/nuxt/src/module.ts | 67 ++++- 5 files changed, 361 insertions(+), 15 deletions(-) diff --git a/packages/nuxt/client/composables/state.ts b/packages/nuxt/client/composables/state.ts index c205ef3f..fa8e7ad4 100644 --- a/packages/nuxt/client/composables/state.ts +++ b/packages/nuxt/client/composables/state.ts @@ -1,4 +1,4 @@ import { ref } from 'vue' -import type { ModuleOptions } from '../../src/core/types' +import type { PergelOptions } from '../../src/core/types' -export const options = ref() +export const options = ref() diff --git a/packages/nuxt/src/core/devtools.ts b/packages/nuxt/src/core/devtools.ts index d721518d..c9f23032 100644 --- a/packages/nuxt/src/core/devtools.ts +++ b/packages/nuxt/src/core/devtools.ts @@ -7,7 +7,7 @@ import { } from '@nuxt/devtools-kit' import type { ClientFunctions, - ModuleOptions, + PergelOptions, ServerFunctions, } from './types' import { useViteWebSocket } from './utils' @@ -23,7 +23,7 @@ import { } from './constants' export function setupDevToolsUI( - options: ModuleOptions, + options: PergelOptions, resolve: Resolver['resolve'], nuxt: Nuxt, ) { diff --git a/packages/nuxt/src/core/types/devtools.ts b/packages/nuxt/src/core/types/devtools.ts index ed98ce62..696be680 100644 --- a/packages/nuxt/src/core/types/devtools.ts +++ b/packages/nuxt/src/core/types/devtools.ts @@ -1,9 +1,9 @@ import type { Nuxt } from 'nuxt/schema' import type { WebSocketServer } from 'vite' -import type { ModuleOptions } from './module' +import type { PergelOptions } from './module' export interface ServerFunctions { - getOptions(): ModuleOptions + getOptions(): PergelOptions reset(): void } @@ -13,6 +13,6 @@ export interface ClientFunctions { export interface DevtoolsServerContext { nuxt: Nuxt - options: ModuleOptions + options: PergelOptions wsServer: Promise } diff --git a/packages/nuxt/src/core/types/module.ts b/packages/nuxt/src/core/types/module.ts index 17d20b4e..1e60b70d 100644 --- a/packages/nuxt/src/core/types/module.ts +++ b/packages/nuxt/src/core/types/module.ts @@ -1,2 +1,295 @@ -export interface ModuleOptions { +/** + * @credit + * https://github.com/nuxt/nuxt/blob/main/packages/schema/src/types/module.ts + */ + +import type { Nuxt } from '@nuxt/schema' + +export interface Modules { + S3?: true } + +export interface PergelOptions { + /** + * @default {} + * @example + * { + * project1: { + * S3: true, + * }, + * project2: { + * S3: true, + * }, + * } + */ + projects: { + [project: string]: Modules + } + /** + * The root folder of the pergel folder. + * @default 'pergel' + * @example '/users/productdevbook/nuxt3/pergel' + */ + pergelDir?: string + + /** + * The root folder of the application. + * Defaults to the path where `nuxt.options.rootDir` is located. + * @default '/' + * @example '/playground' + */ + rootDir?: string + /** + * @default true + */ + esnext?: boolean +} + +export interface ResolvedPergelOptions { + /** + * Pergel user defined options. + */ + rootOptions: Required + + /** + * Root Options resolved from `rootOptions`. + */ + resolvedOptions: { + + dir: { + /** + * @example + * 'pergel' + */ + pergel: string + + /** + * @example + * './' + */ + root: string + + /** + * @example + * 'pergel/README.yml' + */ + readme: string + + } + + templateDir: { + /** + * @example + * './' + */ + root: string + } + + resolveDir: { + + /** + * @example + * '/users/productdevbook/nuxt3/pergel/README.yml' + */ + readmeDir: string + + /** + * @example + * 'users/productdevbook/nuxt3' + */ + root: string + + /** + * @example + * 'users/productdevbook/nuxt3/pergel' + */ + pergelRoot: string + } + + /** + * @example + * ['project1', 'project2'] + */ + projectNames: string[] + + } + + resolvedModule: { + /** + * @example + * 'S3' | 'nodecron' | 'graphQL' | 'drizzle' + */ + name: string + + /** + * End user defined module options. + * @example + * 'project1' + */ + projectName: string + + /** + * @example + * 'users/productdevbook/nuxt3/pergel/${projectName}' + */ + projectDir: string + /** + * @example + * 'users/productdevbook/nuxt3/pergel/${projectName}/${moduleName}' + */ + moduleDir: string + + dir: { + /** + * @example + * 'pergel/${activeBranch}/${projectName}' + */ + project: string + + /** + * @example + * 'pergel/${activeBranch}/${projectName}/${moduleName}' + */ + module: string + } + + templateDir: { + /** + * @example + * 'pergel' + */ + root: string + /** + * @example + * 'pergel/${projectName}/${moduleName}' + */ + module: string + + /** + * @example + * 'pergel/${projectName}' + */ + project: string + } + } + + _contents: { + projectName: string + moduleName: string + content: string | Promise + resolve: string | Promise + }[] + + moduleOptions: T +} + +export interface ResolvedProjectOptions { + resolvedPergelOptions: ResolvedPergelOptions + /** + * @example + * 'project1' + */ + currentProject: { + /** + * @example + * 'project1' + */ + name: string + + dir: { + /** + * @example + * 'pergel/dev/${projectname}' + */ + project: string + + /** + * @example + * 'pergel/project1' + */ + output: string + + } + /** + * @example + * ['S3', 'nodecron', 'graphql', 'drizzle'] + */ + modules: Modules + } +} + +interface ModuleMeta { + /** Module name. */ + name?: string + /** Module version. */ + version?: string + /** + * The configuration key used within `nuxt.config` for this module's options. + * For example, `@nuxtjs/axios` uses `axios`. + */ + configKey?: string + + devDependencies?: Record + dependencies?: Record + + [key: string]: unknown +} + +/** The options received. */ +export type ModuleOptions = Record + +/** Optional result for nuxt modules */ +export interface ModuleSetupReturn { + /** + * Timing information for the initial setup + */ + timings?: { + /** Total time took for module setup in ms */ + setup?: number + [key: string]: number | undefined + } +} + +export type Awaitable = T | Promise +type _ModuleSetupReturn = Awaitable + +export interface ModuleDefinition { + meta?: ModuleMeta + defaults?: T | ((nuxt: Nuxt, resolvedOptions: ResolvedPergelOptions) => T) + setup?: ( + this: void, + resolvedOptions: ResolvedPergelOptions, + nuxt: Nuxt + ) => + _ModuleSetupReturn +} + +export interface PergelModule { + (this: void, inlineOptions: ResolvedPergelOptions, nuxt: Nuxt): _ModuleSetupReturn + getOptions?: (inlineOptions?: T, nuxt?: Nuxt) => Promise + getMeta?: () => ModuleMeta +} + +export interface ModuleDefaults { + [module: string]: any +} + +export interface ModuleIndex { + index: { + name: string + path: string + }[] +} + +export type Env = string | number | undefined +export type EnvList = Record + +export interface GenerateReadmeYamlOpts { + envs: Record> + projectNames: string[] +} + +export type PartinalKey = Omit & Partial> +export type MaybePromise = T | Promise + +export { } diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index 471e8e7a..5877aeaf 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -3,26 +3,79 @@ import { defineNuxtModule, logger, } from '@nuxt/kit' +import type { Resolver } from '@nuxt/kit' + +import type { ImportsOptions } from '@nuxt/schema' +import type { UnimportPluginOptions } from 'unimport/unplugin' + +import { version } from '../package.json' import { setupDevToolsUI } from './core/devtools' import { DEVTOOLS_MODULE_KEY, DEVTOOLS_MODULE_NAME } from './core/constants' -import type { ModuleOptions } from './core/types/module' +import type { PergelOptions } from './core/types/module' -export default defineNuxtModule({ +export default defineNuxtModule({ meta: { name: DEVTOOLS_MODULE_NAME, configKey: DEVTOOLS_MODULE_KEY, }, - defaults: {}, + defaults: { + esnext: true, + projects: { + + }, + }, async setup(options, nuxt) { - const { resolve } = createResolver(import.meta.url) + const _resolver = createResolver(import.meta.url) + + nuxt.options.vite.optimizeDeps ??= {} + nuxt.options.vite.optimizeDeps.include ??= [] + nuxt.options.vite.optimizeDeps.include.push('@nuxt/devtools-kit/iframe-client') + + // Pergel _pergel default options + nuxt._pergel = { + nitroImports: {}, + nuxtImports: {}, + readmeYaml: { + pergel: { + 'comment-block-1': 'This file is generated by pergel. Do not edit it manually.', + 'comment-block-2': `Version: ${version}`, + }, + }, + modules: [ + 'S3', + ], + resolver: _resolver, + } + + if (options.esnext) { + nuxt.options.vite.build ??= {} + nuxt.options.vite.build.target = 'esnext' + + nuxt.options.nitro.esbuild ??= {} + nuxt.options.nitro.esbuild.options ??= {} + nuxt.options.nitro.esbuild.options.target = 'esnext' + } const isDevToolsEnabled = typeof nuxt.options.devtools === 'boolean' ? nuxt.options.devtools : nuxt.options.devtools.enabled - if (nuxt.options.dev && isDevToolsEnabled) - setupDevToolsUI(options, resolve, nuxt) + if (nuxt.options.dev && isDevToolsEnabled) { + setupDevToolsUI(options, _resolver.resolve, nuxt) - logger.success(`${DEVTOOLS_MODULE_NAME} is ready!`) + logger.success(`${DEVTOOLS_MODULE_NAME} is ready!`) + } }, }) + +declare module '@nuxt/schema' { + interface Nuxt { + _pergel: { + nitroImports: Partial + nuxtImports: Partial + readmeYaml: Record + modules: string[] + resolver: Resolver + } + } +}