Skip to content

Commit 56ad3f4

Browse files
authored
Merge pull request #322 from hakimzulkufli/feat/laravel-vite-support
feat: add support for Laravel projects
2 parents aecd1ce + 36004fd commit 56ad3f4

3 files changed

Lines changed: 69 additions & 3 deletions

File tree

src/__tests__/plugin.spec.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ import {
3535
isRegExp,
3636
isString,
3737
isObject,
38-
isBoolean
38+
isBoolean,
39+
isLaravelProject
3940
} from '../utils/is';
4041
import {Worker} from 'node:worker_threads';
4142
import {encode} from '@jridgewell/sourcemap-codec';
@@ -643,6 +644,36 @@ describe('is utils - additional tests', () => {
643644
expect(isNuxtProject({ plugins: [{ name: 'nuxt:config' }] } as any)).toBe(true);
644645
});
645646
});
647+
648+
describe('isLaravelProject', () => {
649+
const mkTmp = () => mkdtempSync(join(tmpdir(), 'vite-bundle-obfuscator-'));
650+
651+
const writePackageJson = (root: string, pkg: any) => {
652+
writeFileSync(join(root, 'package.json'), JSON.stringify(pkg), 'utf-8');
653+
};
654+
655+
it('should return false for non-laravel project', () => {
656+
expect(isLaravelProject({root: process.cwd()})).toBe(false);
657+
});
658+
659+
it('should use process.cwd() when root is not provided', () => {
660+
expect(isLaravelProject({})).toBe(false);
661+
});
662+
663+
it('should return true when package.json depends on laravel', () => {
664+
const root = mkTmp();
665+
try {
666+
writePackageJson(root, { dependencies: { 'laravel-vite-plugin': '^3.0.0' } });
667+
expect(isLaravelProject({root})).toBe(true);
668+
} finally {
669+
rmSync(root, { recursive: true, force: true });
670+
}
671+
});
672+
673+
it('should return true when laravel plugin is present', () => {
674+
expect(isLaravelProject({ plugins: [{ name: 'laravel' }] } as any)).toBe(true);
675+
});
676+
});
646677
});
647678

648679
describe('utils/index - additional tests', () => {

src/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@ import {
1919
obfuscateBundle,
2020
obfuscateLibBundle,
2121
} from './utils';
22-
import { isArray, isFunction, isLibMode, isNuxtProject, isObject } from './utils/is';
22+
import { isArray, isFunction, isLaravelProject, isLibMode, isNuxtProject, isObject } from './utils/is';
2323
import { defaultConfig, LOG_COLOR, NODE_MODULES, VENDOR_MODULES } from './utils/constants';
2424

2525
export default function viteBundleObfuscator(config?: Partial<Config>): PluginOption {
2626
const finalConfig: Config = { ...defaultConfig, ...config };
2727
const _log = new Log(finalConfig.log);
2828
let _isLibMode = false;
2929
let _isNuxtProject = false;
30+
let _isLaravelProject = false;
3031
let _isSsrBuild = false;
3132

3233
const obfuscateAllChunks = async (
@@ -66,6 +67,7 @@ export default function viteBundleObfuscator(config?: Partial<Config>): PluginOp
6667
_isSsrBuild = !!env.isSsrBuild;
6768
_isLibMode = isLibMode(config);
6869
_isNuxtProject = isNuxtProject(config);
70+
_isLaravelProject = isLaravelProject(config);
6971

7072
if (finalConfig.enable && isEnabledFeature(finalConfig.obfuscateWorker)) {
7173
const original = config.worker?.plugins;
@@ -190,7 +192,8 @@ export default function viteBundleObfuscator(config?: Partial<Config>): PluginOp
190192
};
191193

192194
const generateBundleHandler: Rollup.Plugin['generateBundle'] = async (_, bundle) => {
193-
if (!finalConfig.enable || !bundle || _isLibMode || !_isNuxtProject || _isSsrBuild) return;
195+
if (!finalConfig.enable || !bundle || _isLibMode || _isSsrBuild) return;
196+
if (!_isNuxtProject && !_isLaravelProject) return;
194197
await obfuscateAllChunks(bundle);
195198
};
196199

src/utils/is.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,35 @@ export function isNuxtProject(config: { root?: string; plugins?: any } = {}): bo
108108

109109
return false;
110110
}
111+
112+
function hasLaravelDependency(packageJsonPath: string): boolean {
113+
if (!existsSync(packageJsonPath)) return false;
114+
try {
115+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
116+
const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies };
117+
return !!dependencies?.['laravel-vite-plugin'];
118+
} catch {
119+
return false;
120+
}
121+
}
122+
123+
function hasLaravelPlugins(config: any): boolean {
124+
const plugins = config?.plugins;
125+
if (!Array.isArray(plugins)) return false;
126+
return plugins.some(p => typeof p?.name === 'string' && (p.name === 'laravel' || p.name.startsWith('laravel:')));
127+
}
128+
129+
export function isLaravelProject(config: { root?: string; plugins?: any } = {}): boolean {
130+
if (hasLaravelPlugins(config)) return true;
131+
132+
const startDir = config.root || process.cwd();
133+
134+
for (const dir of walkUpDirs(startDir)) {
135+
const packageJsonPath = resolve(dir, 'package.json');
136+
if (existsSync(packageJsonPath)) {
137+
return hasLaravelDependency(packageJsonPath);
138+
}
139+
}
140+
141+
return false;
142+
}

0 commit comments

Comments
 (0)