diff --git a/lib/templateCompilerModules/utils.ts b/lib/templateCompilerModules/utils.ts
index 914ae55..893d8a4 100644
--- a/lib/templateCompilerModules/utils.ts
+++ b/lib/templateCompilerModules/utils.ts
@@ -8,7 +8,10 @@ export interface ASTNode {
attrs: Attr[]
}
+import { UrlWithStringQuery, parse as uriParse } from 'url'
+
export function urlToRequire(url: string): string {
+ const returnValue = `"${url}"`
// same logic as in transform-require.js
const firstChar = url.charAt(0)
if (firstChar === '.' || firstChar === '~' || firstChar === '@') {
@@ -16,8 +19,36 @@ export function urlToRequire(url: string): string {
const secondChar = url.charAt(1)
url = url.slice(secondChar === '/' ? 2 : 1)
}
- return `require("${url}")`
- } else {
- return `"${url}"`
+
+ const uriParts = parseUriParts(url)
+
+ if (!uriParts.hash) {
+ return `require("${url}")`
+ } else {
+ // support uri fragment case by excluding it from
+ // the require and instead appending it as string;
+ // assuming that the path part is sufficient according to
+ // the above caseing(t.i. no protocol-auth-host parts expected)
+ return `require("${uriParts.path}") + "${uriParts.hash}"`
+ }
+ }
+ return returnValue
+}
+
+/**
+ * vuejs/component-compiler-utils#22 Support uri fragment in transformed require
+ * @param urlString an url as a string
+ */
+function parseUriParts(urlString: string): UrlWithStringQuery {
+ // initialize return value
+ const returnValue: UrlWithStringQuery = uriParse('')
+ if (urlString) {
+ // A TypeError is thrown if urlString is not a string
+ // @see https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost
+ if ('string' === typeof urlString) {
+ // check is an uri
+ return uriParse(urlString) // take apart the uri
+ }
}
+ return returnValue
}
diff --git a/test/compileTemplate.spec.ts b/test/compileTemplate.spec.ts
index d4f88e1..ccd52b4 100644
--- a/test/compileTemplate.spec.ts
+++ b/test/compileTemplate.spec.ts
@@ -59,6 +59,48 @@ test('preprocess pug', () => {
expect(result.errors.length).toBe(0)
})
+/**
+ * vuejs/component-compiler-utils#22 Support uri fragment in transformed require
+ */
+test('supports uri fragment in transformed require', () => {
+ const source = //
+ ''
+ const result = compileTemplate({
+ filename: 'svgparticle.html',
+ source: source,
+ transformAssetUrls: {
+ use: 'href'
+ },
+ compiler: compiler
+ })
+ expect(result.errors.length).toBe(0)
+ expect(result.code).toMatch(
+ /href: require\("@svg\/file.svg"\) \+ "#fragment"/
+ )
+})
+
+/**
+ * vuejs/component-compiler-utils#22 Support uri fragment in transformed require
+ */
+test('when too short uri then empty require', () => {
+ const source = //
+ ''
+ const result = compileTemplate({
+ filename: 'svgparticle.html',
+ source: source,
+ transformAssetUrls: {
+ use: 'href'
+ },
+ compiler: compiler
+ })
+ expect(result.errors.length).toBe(0)
+ expect(result.code).toMatch(/href: require\(""\)/)
+})
+
test('warn missing preprocessor', () => {
const template = parse({
source: '\n' + '\n',