committed by
GitHub
4 changed files with 8433 additions and 8911 deletions
@ -1,31 +1,104 @@ |
|||||
import GenerateConfig from 'unplugin-config/vite'; |
import colors from 'picocolors'; |
||||
|
import { readPackageJSON } from 'pkg-types'; |
||||
import { type PluginOption } from 'vite'; |
import { type PluginOption } from 'vite'; |
||||
|
|
||||
import { getEnvConfig } from '../utils/env'; |
import { getEnvConfig } from '../utils/env'; |
||||
import { strToHex } from '../utils/hash'; |
import { createContentHash } from '../utils/hash'; |
||||
|
|
||||
const GLOBAL_CONFIG_FILE_NAME = '_app.config.js'; |
const GLOBAL_CONFIG_FILE_NAME = '_app.config.js'; |
||||
// This constant sets the output directory for the Vite package
|
const PLUGIN_NAME = 'app-config'; |
||||
const OUTPUT_DIR = 'dist'; |
|
||||
export async function createConfigPluginConfig( |
async function createAppConfigPlugin({ |
||||
shouldGenerateConfig: boolean, |
root, |
||||
): Promise<PluginOption> { |
isBuild, |
||||
const config = await getEnvConfig(); |
}: { |
||||
// LINK /src/utils/env.ts -> getVariableName
|
root: string; |
||||
const APP_NAME = strToHex(config?.VITE_GLOB_APP_TITLE ?? '__APP'); |
isBuild: boolean; |
||||
// https://github.com/kirklin/unplugin-config
|
}): Promise<PluginOption> { |
||||
return GenerateConfig({ |
let publicPath: string; |
||||
appName: APP_NAME, |
let source: string; |
||||
envVariables: { |
if (!isBuild) { |
||||
prefix: 'VITE_GLOB_', |
return { |
||||
|
name: PLUGIN_NAME, |
||||
|
}; |
||||
|
} |
||||
|
const { version = '' } = await readPackageJSON(root); |
||||
|
|
||||
|
return { |
||||
|
name: PLUGIN_NAME, |
||||
|
async configResolved(_config) { |
||||
|
const appTitle = _config?.env?.VITE_GLOB_APP_TITLE ?? ''; |
||||
|
// appTitle = appTitle.replace(/\s/g, '_').replace(/-/g, '_');
|
||||
|
publicPath = _config.base; |
||||
|
source = await getConfigSource(appTitle); |
||||
}, |
}, |
||||
configFile: { |
async transformIndexHtml(html) { |
||||
generate: shouldGenerateConfig, |
publicPath = publicPath.endsWith('/') ? publicPath : `${publicPath}/`; |
||||
fileName: GLOBAL_CONFIG_FILE_NAME, |
|
||||
outputDir: OUTPUT_DIR, |
const appConfigSrc = `${ |
||||
|
publicPath || '/' |
||||
|
}${GLOBAL_CONFIG_FILE_NAME}?v=${version}-${createContentHash(source)}`;
|
||||
|
|
||||
|
return { |
||||
|
html, |
||||
|
tags: [ |
||||
|
{ |
||||
|
tag: 'script', |
||||
|
attrs: { |
||||
|
src: appConfigSrc, |
||||
|
}, |
||||
|
}, |
||||
|
], |
||||
|
}; |
||||
}, |
}, |
||||
htmlInjection: { |
async generateBundle() { |
||||
decodeEntities: true, |
try { |
||||
|
this.emitFile({ |
||||
|
type: 'asset', |
||||
|
fileName: GLOBAL_CONFIG_FILE_NAME, |
||||
|
source, |
||||
|
}); |
||||
|
|
||||
|
console.log(colors.cyan(`✨configuration file is build successfully!`)); |
||||
|
} catch (error) { |
||||
|
console.log( |
||||
|
colors.red('configuration file configuration file failed to package:\n' + error), |
||||
|
); |
||||
|
} |
||||
}, |
}, |
||||
}); |
}; |
||||
} |
} |
||||
|
|
||||
|
/** |
||||
|
* Get the configuration file variable name |
||||
|
* @param env |
||||
|
*/ |
||||
|
const getVariableName = (title: string) => { |
||||
|
function strToHex(str: string) { |
||||
|
const result: string[] = []; |
||||
|
for (let i = 0; i < str.length; ++i) { |
||||
|
const hex = str.charCodeAt(i).toString(16); |
||||
|
result.push(('000' + hex).slice(-4)); |
||||
|
} |
||||
|
return result.join('').toUpperCase(); |
||||
|
} |
||||
|
return `__PRODUCTION__${strToHex(title) || '__APP'}__CONF__`.toUpperCase().replace(/\s/g, ''); |
||||
|
}; |
||||
|
|
||||
|
async function getConfigSource(appTitle: string) { |
||||
|
const config = await getEnvConfig(); |
||||
|
const variableName = getVariableName(appTitle); |
||||
|
const windowVariable = `window.${variableName}`; |
||||
|
// Ensure that the variable will not be modified
|
||||
|
let source = `${windowVariable}=${JSON.stringify(config)};`; |
||||
|
source += ` |
||||
|
Object.freeze(${windowVariable}); |
||||
|
Object.defineProperty(window, "${variableName}", { |
||||
|
configurable: false, |
||||
|
writable: false, |
||||
|
}); |
||||
|
`.replace(/\s/g, '');
|
||||
|
return source; |
||||
|
} |
||||
|
|
||||
|
export { createAppConfigPlugin }; |
||||
|
|||||
File diff suppressed because it is too large
Loading…
Reference in new issue