Skip to content

Commit 2f299fc

Browse files
crisbetoalan-agius4
authored andcommitted
fix(@angular-devkit/build-angular): account for styles specified as string literals and styleUrl
An upcoming change in Angular will allow `style` specified as strings, in addition to a new `styleUrl` property. These changes update the JIT resource transform to support the change.
1 parent 828030d commit 2f299fc

File tree

1 file changed

+64
-49
lines changed

1 file changed

+64
-49
lines changed

packages/angular_devkit/build_angular/src/tools/esbuild/angular/jit-resource-transformer.ts

Lines changed: 64 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -143,75 +143,90 @@ function visitComponentMetadata(
143143
switch (node.name.text) {
144144
case 'templateUrl':
145145
// Only analyze string literals
146-
if (
147-
!ts.isStringLiteral(node.initializer) &&
148-
!ts.isNoSubstitutionTemplateLiteral(node.initializer)
149-
) {
146+
if (!ts.isStringLiteralLike(node.initializer)) {
150147
return node;
151148
}
152149

153-
const url = node.initializer.text;
154-
if (!url) {
155-
return node;
156-
}
157-
158-
return nodeFactory.updatePropertyAssignment(
159-
node,
160-
nodeFactory.createIdentifier('template'),
161-
createResourceImport(
162-
nodeFactory,
163-
generateJitFileUri(url, 'template'),
164-
resourceImportDeclarations,
165-
),
166-
);
150+
return node.initializer.text.length === 0
151+
? node
152+
: nodeFactory.updatePropertyAssignment(
153+
node,
154+
nodeFactory.createIdentifier('template'),
155+
createResourceImport(
156+
nodeFactory,
157+
generateJitFileUri(node.initializer.text, 'template'),
158+
resourceImportDeclarations,
159+
),
160+
);
167161
case 'styles':
168-
if (!ts.isArrayLiteralExpression(node.initializer)) {
169-
return node;
162+
if (ts.isStringLiteralLike(node.initializer)) {
163+
styleReplacements.unshift(
164+
createResourceImport(
165+
nodeFactory,
166+
generateJitInlineUri(node.initializer.text, 'style'),
167+
resourceImportDeclarations,
168+
),
169+
);
170+
171+
return undefined;
170172
}
171173

172-
const inlineStyles = ts.visitNodes(node.initializer.elements, (node) => {
173-
if (!ts.isStringLiteral(node) && !ts.isNoSubstitutionTemplateLiteral(node)) {
174-
return node;
175-
}
174+
if (ts.isArrayLiteralExpression(node.initializer)) {
175+
const inlineStyles = ts.visitNodes(node.initializer.elements, (node) => {
176+
if (!ts.isStringLiteralLike(node)) {
177+
return node;
178+
}
179+
180+
return node.text.length === 0
181+
? undefined // An empty inline style is equivalent to not having a style element
182+
: createResourceImport(
183+
nodeFactory,
184+
generateJitInlineUri(node.text, 'style'),
185+
resourceImportDeclarations,
186+
);
187+
}) as ts.NodeArray<ts.Expression>;
188+
189+
// Inline styles should be placed first
190+
styleReplacements.unshift(...inlineStyles);
191+
192+
// The inline styles will be added afterwards in combination with any external styles
193+
return undefined;
194+
}
176195

177-
const contents = node.text;
178-
if (!contents) {
179-
// An empty inline style is equivalent to not having a style element
180-
return undefined;
181-
}
196+
return node;
182197

183-
return createResourceImport(
184-
nodeFactory,
185-
generateJitInlineUri(contents, 'style'),
186-
resourceImportDeclarations,
198+
case 'styleUrl':
199+
if (ts.isStringLiteralLike(node.initializer)) {
200+
styleReplacements.push(
201+
createResourceImport(
202+
nodeFactory,
203+
generateJitFileUri(node.initializer.text, 'style'),
204+
resourceImportDeclarations,
205+
),
187206
);
188-
}) as ts.NodeArray<ts.Expression>;
189207

190-
// Inline styles should be placed first
191-
styleReplacements.unshift(...inlineStyles);
208+
return undefined;
209+
}
210+
211+
return node;
192212

193-
// The inline styles will be added afterwards in combination with any external styles
194-
return undefined;
195213
case 'styleUrls':
196214
if (!ts.isArrayLiteralExpression(node.initializer)) {
197215
return node;
198216
}
199217

200218
const externalStyles = ts.visitNodes(node.initializer.elements, (node) => {
201-
if (!ts.isStringLiteral(node) && !ts.isNoSubstitutionTemplateLiteral(node)) {
202-
return node;
203-
}
204-
205-
const url = node.text;
206-
if (!url) {
219+
if (!ts.isStringLiteralLike(node)) {
207220
return node;
208221
}
209222

210-
return createResourceImport(
211-
nodeFactory,
212-
generateJitFileUri(url, 'style'),
213-
resourceImportDeclarations,
214-
);
223+
return node.text
224+
? createResourceImport(
225+
nodeFactory,
226+
generateJitFileUri(node.text, 'style'),
227+
resourceImportDeclarations,
228+
)
229+
: undefined;
215230
}) as ts.NodeArray<ts.Expression>;
216231

217232
// External styles are applied after any inline styles

0 commit comments

Comments
 (0)