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
35 changes: 35 additions & 0 deletions src/Http/View/View.imba
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import isString from '../../Support/Helpers/isString'
import querystring from 'querystring'
import UndefinedDataPropException from './Exceptions/UndefinedDataPropException'
import Language from '../../Support/Language/Language'
import viteHelper from '../../Support/Helpers/vite'

export default class View

Expand Down Expand Up @@ -36,6 +37,40 @@ export default class View

self

def vite file\string|string[]
if Array.isArray(file)
let tags = []

for asset in file
if !isString(asset)
throw TypeError "Expected string."

const jsTagExtensions = ['js', 'ts']
const cssTagExtensions = ['css', 'scss', 'sass', 'less', 'styl', 'stylus']
const imgTagExtensions = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'avif']
const fontTagExtensions = ['woff', 'woff2', 'eot', 'ttf', 'otf']

const extension = asset.split('.').pop!.toLowerCase!

if !isString(extension)
throw new Error "Could not determine file extension for: {asset}"

if jsTagExtensions.includes(extension)
tags.push("<script type='module' src={viteHelper(asset)}></script>")
else if cssTagExtensions.includes(extension)
tags.push("<link rel='stylesheet' href={viteHelper(asset)}>")
else if imgTagExtensions.includes(extension)
tags.push("<img src={viteHelper(asset)} alt=''>")
else if fontTagExtensions.includes(extension)
tags.push("<link rel='preload' href={viteHelper(asset)} as='font' type='font/{extension}' crossorigin>")
else
throw new Error "Unsupported file extension: {extension}"

if tags.length > 0
tags.join('\n')
else
viteHelper(file)

def translate key\string, default\any
self.#_language.get(key, default)

Expand Down
2 changes: 2 additions & 0 deletions src/Support/Helpers/index.imba
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const { default: toBoolean } = require './toBoolean'
const { default: updateLine } = require './updateLine'
const { default: version } = require './version'
const { default: view } = require './view'
const { default: vite } = require './vite'
const { default: wildcard } = require './wildcard'
const { default: without } = require './without'

Expand Down Expand Up @@ -81,6 +82,7 @@ export {
updateLine
version
view
vite
wildcard
without
}
4 changes: 4 additions & 0 deletions src/Support/Helpers/vite.imba
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import Repository from '../../Vite/Repository'

export default def vite file\string
Repository.get file
46 changes: 46 additions & 0 deletions src/Vite/Repository.imba
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { readFileSync, existsSync } from 'fs'
import { join } from 'path'

export default class Repository

static manifestCache\ViteManifest|null = null

static def get file\string
const manifest = self.getManifest!

if !manifest
return file

const normalizedFile = file.startsWith('/') ? file.slice(1) : file

if manifest[normalizedFile]
return '/build/' + manifest[normalizedFile].file

if normalizedFile == 'css/app.css'
for [key, value] in Object.entries(manifest)
if key.includes('css/app.css')
return '/build/' + value.file

if normalizedFile == 'js/app.js'
for [key, value] in Object.entries(manifest)
if key.includes('js/app.ts')
return '/build/' + value.file

file

static def getManifest\ViteManifest|null
if self.manifestCache != null
return self.manifestCache

const location = join(process.cwd!, 'public', 'build', '.vite', 'manifest.json')

try
if existsSync(location)
const content = readFileSync(location, 'utf8')
self.manifestCache = content ? JSON.parse(content) : null
else
self.manifestCache = null
catch err
self.manifestCache = null

self.manifestCache
8 changes: 8 additions & 0 deletions types/Http/View/View.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,14 @@ export default class View {
*/
__(key: string, default$?: string): string;

/**
* Get asset path(s) from Vite manifest.
*
* @param {string | string[]} file
* @returns {string}
*/
vite(file: string | string[]): string;

/**
* Get old input.
*/
Expand Down
7 changes: 5 additions & 2 deletions types/Support/Helpers/mix.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
/**
@param {string} file
*/
* Get asset path from Laravel Mix manifest.
* @param {string} file
* @returns {string}
* @deprecated
*/
export default function mix(file: string): string;
7 changes: 7 additions & 0 deletions types/Support/Helpers/vite.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/**
* Get asset path(s) from Vite manifest.
*
* @param {string | string[]} file
* @returns {string}
*/
export default function vite(file: string | string[]): string;
16 changes: 16 additions & 0 deletions types/Vite/Repository.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
interface ViteManifest {
[key: string]: {
file: string;
src?: string;
isEntry?: boolean;
imports?: string[];
css?: string[];
assets?: string[];
};
}

export default class Repository {
static manifestCache: ViteManifest | null = null;
static file(file: string): string;
static getManifest(): ViteManifest | null;
}