Skip to content

Commit b1c7afc

Browse files
committed
fix(build): fix build in all situations
1 parent 09b274c commit b1c7afc

File tree

3 files changed

+44
-33
lines changed

3 files changed

+44
-33
lines changed

src/generate.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { existsSync } from 'fs'
2-
import { rm, writeFile } from 'fs/promises'
2+
import { unlink, writeFile } from 'fs/promises'
33
import type { Core as Instance } from 'browser-style-dictionary/types/browser'
44
import StyleDictionary from 'browser-style-dictionary/browser.js'
55
import { tsTypesDeclaration, tsFull, jsFull } from './formats'
6+
import { createTokensDir } from './utils'
67
import type { NuxtDesignTokens } from './index'
78

89
export const stubTokens = async (buildPath: string, force = false) => {
@@ -18,7 +19,7 @@ export const stubTokens = async (buildPath: string, force = false) => {
1819
for (const [file, stubbingFunction] of Object.entries(files)) {
1920
const path = `${buildPath}${file}`
2021

21-
if (force && existsSync(path)) { await rm(path) }
22+
if (force && existsSync(path)) { await unlink(path) }
2223

2324
if (!existsSync(path)) { await writeFile(path, stubbingFunction ? stubbingFunction({ tokens: {} }) : '') }
2425
}
@@ -29,6 +30,10 @@ export const generateTokens = async (
2930
buildPath: string,
3031
silent = true
3132
) => {
33+
// Check for tokens directory existence; it might get cleaned-up from `.nuxt`
34+
if (!existsSync(buildPath)) { await createTokensDir(buildPath) }
35+
36+
// Stub tokens if no tokens provided
3237
if (!tokens || !Object.keys(tokens).length) {
3338
await stubTokens(buildPath, true)
3439
return

src/module.ts

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,26 @@ export default defineNuxtModule<ModuleOptions>({
3535

3636
const privateConfig = nuxt.options.runtimeConfig.designTokens
3737

38-
// `.nuxt/theme` resolver
38+
// `.nuxt/tokens` resolver
3939
const tokensDir = withTrailingSlash(nuxt.options.buildDir + '/tokens')
4040

41-
// Init directory
41+
// Set srcDir for external imports
42+
globalThis.__nuxtDesignTokensBuildDir__ = tokensDir
43+
44+
// Tokens dir resolver
45+
const { resolve: resolveTokensDir } = createResolver(tokensDir)
46+
privateConfig.tokensDir = tokensDir
47+
48+
// `runtime/` resolver
49+
const { resolve: resolveRuntime } = createResolver(import.meta.url)
50+
const resolveRuntimeModule = (path: string) => resolveModule(path, { paths: resolveRuntime('./runtime') })
51+
52+
// Init directory on first module run
4253
await createTokensDir(tokensDir)
4354

44-
// Refresh configuration
55+
// Refresh configurations
4556
const refreshTokens = async (nitro?: Nitro) => {
46-
// Resolve theme configuration from every layer
57+
// Resolve tokens.config configuration from every layer
4758
const { tokensFilePaths, tokens } = resolveTokens(layers as NuxtLayer[])
4859

4960
if (moduleOptions.tokens) { privateConfig.tokensFilePaths = tokensFilePaths }
@@ -55,26 +66,8 @@ export default defineNuxtModule<ModuleOptions>({
5566
return { tokens, tokensFilePaths }
5667
}
5768

58-
// Set srcDir for external imports
59-
globalThis.__nuxtDesignTokensBuildDir__ = tokensDir
60-
61-
// Theme dir resolver
62-
const { resolve: resolveTokensDir } = createResolver(tokensDir)
63-
privateConfig.tokensDir = tokensDir
64-
65-
// Initial theme resolving
66-
const { tokens } = await refreshTokens()
67-
68-
// `runtime/` resolver
69-
const { resolve: resolveRuntime } = createResolver(import.meta.url)
70-
const resolveRuntimeModule = (path: string) => resolveModule(path, { paths: resolveRuntime('./runtime') })
71-
72-
// Transpile
73-
nuxt.options.build.transpile = nuxt.options.build.transpile || []
74-
nuxt.options.build.transpile.push(resolveRuntime('./runtime'))
75-
7669
// Main function to build tokens (module-level)
77-
const buildTokens = async (nitro) => {
70+
const buildTokens = async (nitro: Nitro) => {
7871
try {
7972
const start = performance.now()
8073
const tokens = await nitro.storage.getItem('cache:design-tokens:tokens.json') as NuxtDesignTokens
@@ -88,6 +81,13 @@ export default defineNuxtModule<ModuleOptions>({
8881
}
8982
}
9083

84+
// Initial tokens resolving
85+
const { tokens } = await refreshTokens()
86+
87+
// Transpile
88+
nuxt.options.build.transpile = nuxt.options.build.transpile || []
89+
nuxt.options.build.transpile.push(resolveRuntime('./runtime'))
90+
9191
// Apply aliases
9292
nuxt.options.alias = nuxt.options.alias || {}
9393
nuxt.options.alias['#design-tokens'] = resolveTokensDir('index')
@@ -159,6 +159,7 @@ export default defineNuxtModule<ModuleOptions>({
159159
/**
160160
* Runtime
161161
*/
162+
162163
addPlugin({
163164
src: resolveRuntimeModule('./plugins/tokens')
164165
})
@@ -168,12 +169,10 @@ export default defineNuxtModule<ModuleOptions>({
168169
as: 'useTokens'
169170
})
170171

171-
// Create initial build targets for tokens
172-
await generateTokens(tokens, tokensDir, true)
173-
174172
/**
175-
* Build environments
173+
* Dev
176174
*/
175+
177176
if (nuxt.options.dev) {
178177
nuxt.hook('nitro:init', (nitro) => {
179178
nuxt.hook('vite:serverCreated', (viteServer: ViteDevServer) => {
@@ -196,9 +195,12 @@ export default defineNuxtModule<ModuleOptions>({
196195
})
197196
})
198197
})
199-
} else {
200-
// Production builds
201-
nuxt.hook('build:before', async () => await generateTokens(tokens, tokensDir, true))
202198
}
199+
200+
/**
201+
* Prod
202+
*/
203+
204+
nuxt.hook('build:before', async () => await generateTokens(tokens, tokensDir, true))
203205
}
204206
})

src/utils.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { resolve } from 'pathe'
55
import chalk from 'chalk'
66
import { requireModule, useLogger } from '@nuxt/kit'
77
import { name, version } from '../package.json'
8+
import { stubTokens } from './generate'
89
import type { NuxtDesignTokens, ModuleOptions } from './index'
910

1011
export interface NuxtLayer {
@@ -75,7 +76,10 @@ export const resolveTokens = (layers: NuxtLayer[]) => {
7576
}
7677

7778
export const createTokensDir = async (path: string) => {
78-
if (!existsSync(path)) { await mkdir(path, { recursive: true }) }
79+
if (!existsSync(path)) {
80+
await mkdir(path, { recursive: true })
81+
await stubTokens(path, true)
82+
}
7983
}
8084

8185
/**

0 commit comments

Comments
 (0)