Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions packages/core/src/utils/injectUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import type { PluginData } from './types'
import { deepMerge } from './deepMerge'

function addResolver(plugin: PluginData, resolver: string) {
if (plugin.initializer == null || plugin.initializer.includes(resolver)) {
return plugin
}
Comment on lines +5 to +7
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Substring check may cause false positives.

The includes(resolver) check on line 5 uses substring matching, which could cause false positives. For example, if resolver = "Foo" and initializer contains "FooResolver", the function would incorrectly skip injection.

Consider using a more precise check, such as a regex word boundary or matching the exact resolver within the resolvers array.

-  if (plugin.initializer == null || plugin.initializer.includes(resolver)) {
+  if (plugin.initializer == null || new RegExp(`\\b${resolver}\\b`).test(plugin.initializer)) {
     return plugin
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (plugin.initializer == null || plugin.initializer.includes(resolver)) {
return plugin
}
if (plugin.initializer == null || new RegExp(`\\b${resolver}\\b`).test(plugin.initializer)) {
return plugin
}
🤖 Prompt for AI Agents
In packages/core/src/utils/injectUtils.ts around lines 5 to 7, the use of
plugin.initializer.includes(resolver) performs substring matching and can
produce false positives (e.g. "Foo" matching "FooResolver"); change the check to
a precise match by either (a) ensuring initializer is parsed as an array and
using a strict equality check (initializerArray.includes(resolver)) or (b) use a
regex word-boundary match (new
RegExp(`\\b${escapeForRegex(resolver)}\\b`).test(initializer)) so only exact
resolver names are considered; implement one of these approaches and add a small
helper escapeForRegex to safely build the regex if using option (b).


return {
...plugin,
initializer: plugin.initializer.replace(
/(resolvers\s*:\s*\[)([\s\S]*?)(\])/,
(_, prefix, content, suffix) => {
const cont = content.trim()

return `${prefix}${cont}${cont ? ', ' : ''}${resolver}${suffix}`
},
),
}
}

function mergeExtraConfig(oldConfig: Record<string, any> | null, config: Record<string, any>) {
return deepMerge(oldConfig || {}, config)
}

export const injectUtils = {
deepMerge,
addResolver,
mergeExtraConfig,
}
2 changes: 2 additions & 0 deletions packages/core/src/utils/renderTemplate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import * as path from 'node:path'
import { pathToFileURL } from 'node:url'

import { deepMerge } from './deepMerge'
import { injectUtils } from './injectUtils'
import { sortDependencies } from './sortDependencies'

/**
Expand Down Expand Up @@ -77,6 +78,7 @@ export function renderTemplate(src: string, dest: string, callbacks: Callback[])
// Though current `getData` are all sync, we still retain the possibility of async
dataStore[dest] = await getData({
oldData: dataStore[dest] || {},
utils: injectUtils,
})
})

Expand Down
6 changes: 6 additions & 0 deletions packages/core/src/utils/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export interface PluginData {
id: string
importer?: string
dynamicImporter?: string
initializer?: string
}
18 changes: 6 additions & 12 deletions packages/core/template/UI/ano/vite.config.js.data.mjs
Original file line number Diff line number Diff line change
@@ -1,21 +1,15 @@
export default function getData({ oldData }) {
export default function getData({ oldData, utils }) {
const autoImportAnoUiPlugin = {
id: 'ano-ui',
importer: `import { AnoResolver } from '@uni-helper/vite-plugin-uni-components/resolvers'`,
initializer: `Components({
dts: true,
resolvers: [AnoResolver()]
})`,
}

return {
...oldData,
plugins: oldData.plugins.some(plugin => plugin.id === 'autoImport')
? oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport' ? [{ id: plugin.id, importer: plugin.importer }, autoImportAnoUiPlugin] : plugin,
)
: oldData.plugins.flatMap(plugin =>
plugin.id === 'uni' ? [autoImportAnoUiPlugin, plugin] : plugin,
),
plugins: oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport'
? [utils.addResolver(plugin, 'AnoResolver()'), autoImportAnoUiPlugin]
: plugin,
),
}
}
20 changes: 7 additions & 13 deletions packages/core/template/UI/nut/vite.config.js.data.mjs
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
export default function getData({ oldData }) {
export default function getData({ oldData, utils }) {
const autoImportNutUiPlugin = {
id: 'nutui-uniapp',
importer: `import { NutResolver } from 'nutui-uniapp'`,
initializer: `Components({
dts: true,
resolvers: [NutResolver()]
})`,
}

const nutuiExtraConfig = {
Expand All @@ -20,13 +16,11 @@ export default function getData({ oldData }) {

return {
...oldData,
plugins: oldData.plugins.some(plugin => plugin.id === 'autoImport')
? oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport' ? [{ id: plugin.id, importer: plugin.importer }, autoImportNutUiPlugin] : plugin,
)
: oldData.plugins.flatMap(plugin =>
plugin.id === 'uni' ? [autoImportNutUiPlugin, plugin] : plugin,
),
extraConfig: oldData?.extraConfig ? { ...oldData.extraConfig, ...nutuiExtraConfig } : nutuiExtraConfig,
plugins: oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport'
? [utils.addResolver(plugin, 'NutResolver()'), autoImportNutUiPlugin]
: plugin,
),
extraConfig: utils.mergeExtraConfig(oldData.extraConfig, nutuiExtraConfig),
}
}
18 changes: 6 additions & 12 deletions packages/core/template/UI/skiyee/vite.config.js.data.mjs
Original file line number Diff line number Diff line change
@@ -1,21 +1,15 @@
export default function getData({ oldData }) {
export default function getData({ oldData, utils }) {
const autoImportSkiyeeUiPlugin = {
id: 'skiyee-ui',
importer: `import SkResolver from '@skiyee/ui-resolver'`,
initializer: `Components({
dts: true,
resolvers: [SkResolver()]
})`,
}

return {
...oldData,
plugins: oldData.plugins.some(plugin => plugin.id === 'autoImport')
? oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport' ? [{ id: plugin.id, importer: plugin.importer }, autoImportSkiyeeUiPlugin] : plugin,
)
: oldData.plugins.flatMap(plugin =>
plugin.id === 'uni' ? [autoImportSkiyeeUiPlugin, plugin] : plugin,
),
plugins: oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport'
? [utils.addResolver(plugin, 'SkResolver()'), autoImportSkiyeeUiPlugin]
: plugin,
),
}
}
23 changes: 6 additions & 17 deletions packages/core/template/UI/uni/vite.config.js.data.mjs
Original file line number Diff line number Diff line change
@@ -1,29 +1,18 @@
export default function getData({ oldData }) {
export default function getData({ oldData, utils }) {
const hasRootPlugin = oldData.plugins.some(plugin => plugin.id === 'root')
const resolverOptions = hasRootPlugin ? '{ exclude: \'UniKuAppRoot\' }' : ''

const autoImportUniUiPlugin = {
id: 'uni-ui',
importer: `import { UniUIResolver } from '@uni-helper/vite-plugin-uni-components/resolvers'`,
initializer: `Components({
dts: true,
resolvers: [UniUIResolver(${resolverOptions})]
})`,
}

return {
...oldData,
plugins: oldData.plugins.some(plugin => plugin.id === 'autoImport')
? oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport'
? [
{ id: plugin.id, importer: plugin.importer },
autoImportUniUiPlugin,
]
: plugin,
)
: oldData.plugins.flatMap(plugin =>
plugin.id === 'uni' ? [autoImportUniUiPlugin, plugin] : plugin,
),
plugins: oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport'
? [utils.addResolver(plugin, `UniUIResolver(${resolverOptions})`), autoImportUniUiPlugin]
: plugin,
),
}
}
18 changes: 6 additions & 12 deletions packages/core/template/UI/uv/vite.config.js.data.mjs
Original file line number Diff line number Diff line change
@@ -1,21 +1,15 @@
export default function getData({ oldData }) {
export default function getData({ oldData, utils }) {
const autoImportUvUiPlugin = {
id: 'uv-ui',
importer: `import { UvResolver } from '@uni-helper/vite-plugin-uni-components/resolvers'`,
initializer: `Components({
dts: true,
resolvers: [UvResolver()]
})`,
}

return {
...oldData,
plugins: oldData.plugins.some(plugin => plugin.id === 'autoImport')
? oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport' ? [{ id: plugin.id, importer: plugin.importer }, autoImportUvUiPlugin] : plugin,
)
: oldData.plugins.flatMap(plugin =>
plugin.id === 'uni' ? [autoImportUvUiPlugin, plugin] : plugin,
),
plugins: oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport'
? [utils.addResolver(plugin, 'UvResolver()'), autoImportUvUiPlugin]
: plugin,
),
}
}
20 changes: 7 additions & 13 deletions packages/core/template/UI/uview-pro/vite.config.js.data.mjs
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
export default function getData({ oldData }) {
export default function getData({ oldData, utils }) {
const autoImportUviewProPlugin = {
id: 'uview-pro',
importer: `import { uViewProResolver } from '@uni-helper/vite-plugin-uni-components/resolvers'`,
initializer: `Components({
dts: true,
resolvers: [uViewProResolver()]
})`,
}

const uviewProExtraConfig = {
Expand All @@ -20,13 +16,11 @@ export default function getData({ oldData }) {

return {
...oldData,
plugins: oldData.plugins.some(plugin => plugin.id === 'autoImport')
? oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport' ? [{ id: plugin.id, importer: plugin.importer }, autoImportUviewProPlugin] : plugin,
)
: oldData.plugins.flatMap(plugin =>
plugin.id === 'uni' ? [autoImportUviewProPlugin, plugin] : plugin,
),
extraConfig: oldData?.extraConfig ? { ...oldData.extraConfig, ...uviewProExtraConfig } : uviewProExtraConfig,
plugins: oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport'
? [utils.addResolver(plugin, 'uViewProResolver()'), autoImportUviewProPlugin]
: plugin,
),
extraConfig: utils.mergeExtraConfig(oldData.extraConfig, uviewProExtraConfig),
}
}
18 changes: 6 additions & 12 deletions packages/core/template/UI/wot/vite.config.js.data.mjs
Original file line number Diff line number Diff line change
@@ -1,21 +1,15 @@
export default function getData({ oldData }) {
export default function getData({ oldData, utils }) {
const autoImportWotDesignUiPlugin = {
id: 'wot-design-ui',
importer: `import { WotResolver } from '@uni-helper/vite-plugin-uni-components/resolvers'`,
initializer: `Components({
dts: true,
resolvers: [WotResolver()]
})`,
}

return {
...oldData,
plugins: oldData.plugins.some(plugin => plugin.id === 'autoImport')
? oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport' ? [{ id: plugin.id, importer: plugin.importer }, autoImportWotDesignUiPlugin] : plugin,
)
: oldData.plugins.flatMap(plugin =>
plugin.id === 'uni' ? [autoImportWotDesignUiPlugin, plugin] : plugin,
),
plugins: oldData.plugins.flatMap(plugin =>
plugin.id === 'autoImport'
? [utils.addResolver(plugin, 'WotResolver()'), autoImportWotDesignUiPlugin]
: plugin,
),
}
}
2 changes: 1 addition & 1 deletion packages/core/template/base/vite.config.js.data.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export default function getData() {
id: 'uni',
importer: `import Uni from '@uni-helper/plugin-uni'`,
initializer: `// https://uni-helper.js.org/plugin-uni
Uni()`,
Uni()`,
}],
extraConfig: null,
dynamic: false,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export default function getData({ oldData }) {
export default function getData({ oldData, utils }) {
const promisesExtraConfig = {
build: {
target: 'es6',
Expand All @@ -8,8 +8,9 @@ export default function getData({ oldData }) {
exclude: ['vue-demi'],
},
}

return {
...oldData,
extraConfig: oldData?.extraConfig ? { ...oldData.extraConfig, ...promisesExtraConfig } : promisesExtraConfig,
extraConfig: utils.mergeExtraConfig(oldData.extraConfig, promisesExtraConfig),
}
}
4 changes: 2 additions & 2 deletions packages/core/template/module/uniUse/vite.config.js.data.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export default function getData({ oldData }) {
export default function getData({ oldData, utils }) {
const uniUseExtraConfig = {
build: {
target: 'es6',
Expand All @@ -11,6 +11,6 @@ export default function getData({ oldData }) {

return {
...oldData,
extraConfig: oldData?.extraConfig ? { ...oldData.extraConfig, ...uniUseExtraConfig } : uniUseExtraConfig,
extraConfig: utils.mergeExtraConfig(oldData.extraConfig, uniUseExtraConfig),
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export default function getData({ oldData }) {
initializer: `// https://uni-helper.js.org/vite-plugin-uni-components
Components({
dts: true,
resolvers: []
})`,
}

Expand Down
Loading
Loading