Skip to content

Commit

Permalink
feat: poc for schema types generation
Browse files Browse the repository at this point in the history
  • Loading branch information
pi0 committed Dec 23, 2021
1 parent 0154bc5 commit 4991907
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 11 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
},
"devDependencies": {
"@nuxt/kit": "npm:@nuxt/kit-edge@latest",
"@nuxt/schema": "npm:@nuxt/schema-edge@latest",
"@nuxtjs/eslint-config-typescript": "^8.0.0",
"@types/mri": "^1.1.1",
"eslint": "^8.5.0",
Expand Down
10 changes: 5 additions & 5 deletions playground/package.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
{
"name": "mymodule",
"private": true,
"scripts": {
"build": "nuxt-build-module",
"prepack": "npm run build"
},
"exports": {
".": {
"require": "./dist/module.cjs",
"import": "./dist/module.mjs"
}
},
"main": "./dist/module.cjs",
"types": "./dist/module.d.ts",
"types": "./dist/types.d.ts",
"scripts": {
"build": "nuxt-build-module",
"prepack": "npm run build"
},
"build": {
"entries": [
"./src/custom"
Expand Down
18 changes: 16 additions & 2 deletions playground/src/module.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
import { defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
setup () {}
export interface ModuleOptions {
apiKey: string
}

export default defineNuxtModule<ModuleOptions>({
meta: {
name: 'my-module',
configKey: 'myModule'
},
defaults: {
apiKey: null
},
setup (options, _nuxt) {
// eslint-disable-next-line no-console
console.log('My module options:', options)
}
})
39 changes: 36 additions & 3 deletions src/build.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { promises as fsp } from 'fs'
import { existsSync, promises as fsp } from 'fs'
import { resolve } from 'pathe'
import type { ModuleMeta } from '@nuxt/schema'

export async function buildModule (rootDir: string) {
const { build } = await import('unbuild')
Expand All @@ -22,16 +23,48 @@ export async function buildModule (rootDir: string) {
],
hooks: {
async 'rollup:done' (ctx) {
// Load meta
const moduleEntryPath = resolve(ctx.options.outDir, 'module.mjs')
const moduleFn = await import(moduleEntryPath).then(r => r.default || r)
const moduleMeta = await moduleFn.getMeta()

await writeTypes(ctx.options.outDir, moduleMeta)
await writeCJSStub(ctx.options.outDir)
}
}
})
}

async function writeTypes (distDir: string, meta: ModuleMeta) {
const dtsFile = resolve(distDir, 'types.d.ts')
if (existsSync(dtsFile)) {
return
}

const schemaShims = []
if (meta.configKey) {
schemaShims.push(
` interface NuxtConfig { ${meta.configKey}?: ModuleOptions }`,
` interface NuxtOptions { ${meta.configKey}?: Partial<ModuleOptions> }`
)
}

const dtsContents = `
import type { ModuleOptions } from './module'
${schemaShims.length ? `declare module '@nuxt/schema' {\n${schemaShims.join('\n')}\n}\n` : ''}
export * from './module'
`

await fsp.writeFile(dtsFile, dtsContents, 'utf8')
}

async function writeCJSStub (distDir: string) {
const cjsStubFile = resolve(distDir, 'module.cjs')
const cjsStub = `// CommonJS proxy to use native ESM
module.exports = function(...args) {
if (existsSync(cjsStubFile)) {
return
}
const cjsStub = `module.exports = function(...args) {
return import('./module.mjs').then(m => m.default.call(this, ...args))
}
module.exports.meta = require('../package.json')
Expand Down
2 changes: 1 addition & 1 deletion yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@
unctx "^1.0.2"
untyped "^0.3.0"

"@nuxt/schema@npm:@nuxt/schema-edge@3.0.0-27337794.cac70e4":
"@nuxt/schema@npm:@nuxt/schema-edge@3.0.0-27337794.cac70e4", "@nuxt/schema@npm:@nuxt/schema-edge@latest":
version "3.0.0-27337794.cac70e4"
resolved "https://registry.yarnpkg.com/@nuxt/schema-edge/-/schema-edge-3.0.0-27337794.cac70e4.tgz#47ecd9f68695777fcebbdb994b0f3704c0160021"
integrity sha512-ErouOzVXgHgJ1tuWuwPbOST0bCX+utNaBeW6t6yBm7JiMjsJRjCHuti/claQDRrkntZShjF2nMYeRP2A4c8bsQ==
Expand Down

0 comments on commit 4991907

Please sign in to comment.