ngx-metafrenzy
Version:
Angular 13 module for setting head tags such as title, meta, and link.
142 lines • 19 kB
JavaScript
import { Injectable, Inject, ViewEncapsulation } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
export class MetafrenzyService {
constructor(title, meta, rendererFactory, document) {
this.title = title;
this.meta = meta;
this.rendererFactory = rendererFactory;
this.document = document;
}
setTitle(title) {
this.title.setTitle(title);
}
getTitle() {
return this.title.getTitle();
}
setMetaTag(name, content) {
const metaDefinition = {};
if (name.lastIndexOf('og:', 0) === 0) {
metaDefinition['property'] = name;
}
else {
metaDefinition['name'] = name;
}
metaDefinition['content'] = content;
this.meta.updateTag(metaDefinition);
}
getMetaTag(selector, returnElement) {
const tag = this.meta.getTag(selector);
if (!tag) {
return '';
}
return returnElement === true ? tag : tag.content;
}
removeMetaTag(selector) {
if (selector instanceof HTMLMetaElement) {
this.meta.removeTagElement(selector);
}
else {
this.meta.removeTag(selector);
}
}
setMetaCharsetTag(value) {
this.meta.updateTag({
charset: value
}, 'charset');
}
removeLinkTags(shouldRemoveLinkTagCb) {
const links = this.document.head.getElementsByTagName('link');
const toRemove = [];
for (let i = 0; i < links.length; i++) {
if (shouldRemoveLinkTagCb(links[i])) {
toRemove.push(links[i]);
}
}
toRemove.forEach(el => el.remove());
}
setLinkTag(tag) {
try {
const renderer = this.rendererFactory.createRenderer(this.document, {
id: '-1',
encapsulation: ViewEncapsulation.None,
styles: [],
data: {}
});
const link = renderer.createElement('link');
const head = this.document.head;
Object.keys(tag).forEach((property) => {
return renderer.setAttribute(link, property, String(tag[property]));
});
this.removeLinkTags(el => {
if ((el.getAttribute('name') !== null &&
el.getAttribute('name') === link.getAttribute('name')) ||
(el.getAttribute('rel') !== null &&
el.getAttribute('rel') === link.getAttribute('rel') &&
link.getAttribute('rel') !== 'stylesheet' &&
link.getAttribute('rel') !== 'alternate')) {
return true;
}
return false;
});
renderer.appendChild(head, link);
}
catch (e) { }
}
setAllTitleTags(title) {
this.setTitle(title);
this.setMetaTag('og:title', title);
}
setAllDescriptionTags(description) {
this.setMetaTag('description', description);
this.setMetaTag('og:description', description);
}
setCanonical(href) {
this.setLinkTag({
rel: 'canonical',
href
});
}
removeCanonical() {
this.removeLinkTags(el => el.getAttribute('rel') === 'canonical');
}
setRobots(content) {
this.setLinkTag({
rel: 'robots',
content
});
}
setOpenGraph(og) {
Object.keys(og).forEach((name) => {
this.setMetaTag('og:' + name, String(og[name]));
});
}
setTags(tags) {
if (tags.hasOwnProperty('title') && tags.title) {
this.setAllTitleTags(tags.title);
}
if (tags.hasOwnProperty('description') && tags.description) {
this.setAllDescriptionTags(tags.description);
}
if (tags.hasOwnProperty('url') && tags.url) {
this.setMetaTag('og:url', tags.url);
this.setCanonical(tags.url);
}
if (tags.hasOwnProperty('image') && tags.image) {
this.setMetaTag('og:image:url', tags.image);
}
if (tags.hasOwnProperty('robots') && tags.robots) {
this.setRobots(tags.robots);
}
}
}
MetafrenzyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyService, deps: [{ token: i1.Title }, { token: i1.Meta }, { token: i0.RendererFactory2 }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
MetafrenzyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MetafrenzyService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.Title }, { type: i1.Meta }, { type: i0.RendererFactory2 }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWZyZW56eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9tZXRhZnJlbnp5L21ldGFmcmVuenkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFvQixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUF1QzNDLE1BQU0sT0FBTyxpQkFBaUI7SUFFMUIsWUFDcUIsS0FBWSxFQUNaLElBQVUsRUFDVixlQUFpQyxFQUN4QixRQUFhO1FBSHRCLFVBQUssR0FBTCxLQUFLLENBQU87UUFDWixTQUFJLEdBQUosSUFBSSxDQUFNO1FBQ1Ysb0JBQWUsR0FBZixlQUFlLENBQWtCO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQUs7SUFDeEMsQ0FBQztJQUVKLFFBQVEsQ0FBQyxLQUFhO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBWSxFQUFFLE9BQWU7UUFDcEMsTUFBTSxjQUFjLEdBQVEsRUFBRSxDQUFDO1FBRS9CLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDckM7YUFBTTtZQUNILGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDakM7UUFFRCxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBRXBDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMs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MkZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVTs7MEJBT0YsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgUmVuZGVyZXJGYWN0b3J5MiwgSW5qZWN0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWV0YSwgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVmaW5pdGlvbiB7XG4gICAgY2hhcnNldD86IHN0cmluZztcbiAgICBjcm9zc29yaWdpbj86IHN0cmluZztcbiAgICBocmVmPzogc3RyaW5nO1xuICAgIGhyZWZsYW5nPzogc3RyaW5nO1xuICAgIG1lZGlhPzogc3RyaW5nO1xuICAgIHJlbD86IHN0cmluZztcbiAgICByZXY/OiBzdHJpbmc7XG4gICAgc2l6ZXM/OiBzdHJpbmc7XG4gICAgdGFyZ2V0Pzogc3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgW3Byb3A6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuR3JhcGgge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIGltYWdlPzogc3RyaW5nO1xuICAgIHNpdGVfbmFtZT86IHN0cmluZztcbiAgICBbcHJvcDogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ3Mge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICByb2JvdHM/OiBSb2JvdHM7XG4gICAgaW1hZ2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFJvYm90cyA9XG4gICAgJ2luZGV4LGZvbGxvdycgfCAnaW5kZXgsbm9mb2xsb3cnIHwgJ25vaW5kZXgsbm9mb2xsb3cnIHwgJ25vaW5kZXgsZm9sbG93JyB8XG4gICAgJ2luZGV4LCBmb2xsb3cnIHwgJ2luZGV4LCBub2ZvbGxvdycgfCAnbm9pbmRleCwgbm9mb2xsb3cnIHwgJ25vaW5kZXgsIGZvbGxvdyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNZXRhZnJlbnp5U2VydmljZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogVGl0bGUsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YTogTWV0YSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTIsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueVxuICAgICkge31cblxuICAgIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy50aXRsZS5zZXRUaXRsZSh0aXRsZSk7XG4gICAgfVxuXG4gICAgZ2V0VGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGl0bGUuZ2V0VGl0bGUoKTtcbiAgICB9XG5cbiAgICBzZXRNZXRhVGFnKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG1ldGFEZWZpbml0aW9uOiBhbnkgPSB7fTtcblxuICAgICAgICBpZiAobmFtZS5sYXN0SW5kZXhPZignb2c6JywgMCkgPT09IDApIHtcbiAgICAgICAgICAgIG1ldGFEZWZpbml0aW9uWydwcm9wZXJ0eSddID0gbmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1ldGFEZWZpbml0aW9uWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgbWV0YURlZmluaXRpb25bJ2NvbnRlbnQnXSA9IGNvbnRlbnQ7XG5cbiAgICAgICAgdGhpcy5tZXRhLnVwZGF0ZVRhZyhtZXRhRGVmaW5pdGlvbik7XG4gICAgfVxuXG4gICAgZ2V0TWV0YVRhZyhzZWxlY3Rvcjogc3RyaW5nLCByZXR1cm5FbGVtZW50PzogYm9vbGVhbik6IHN0cmluZ3xIVE1MTWV0YUVsZW1lbnQge1xuICAgICAgICBjb25zdCB0YWcgPSB0aGlzLm1ldGEuZ2V0VGFnKHNlbGVjdG9yKTtcbiAgICAgICAgaWYgKCF0YWcpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5FbGVtZW50ID09PSB0cnVlID8gdGFnIDogdGFnLmNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcmVtb3ZlTWV0YVRhZyhzZWxlY3Rvcjogc3RyaW5nfEhUTUxNZXRhRWxlbWVudCkge1xuICAgICAgICBpZiAoc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MTWV0YUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMubWV0YS5yZW1vdmVUYWdFbGVtZW50KHNlbGVjdG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWV0YS5yZW1vdmVUYWcoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0TWV0YUNoYXJzZXRUYWcodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHtcbiAgICAgICAgICAgIGNoYXJzZXQ6IHZhbHVlXG4gICAgICAgIH0sICdjaGFyc2V0Jyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTGlua1RhZ3Moc2hvdWxkUmVtb3ZlTGlua1RhZ0NiOiAobGlua1RhZzogSFRNTExpbmtFbGVtZW50KSA9PiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzOiBIVE1MQ29sbGVjdGlvbk9mPEhUTUxMaW5rRWxlbWVudD4gPSB0aGlzLmRvY3VtZW50LmhlYWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpbmsnKTtcblxuICAgICAgICBjb25zdCB0b1JlbW92ZTogSFRNTExpbmtFbGVtZW50W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlTGlua1RhZ0NiKGxpbmtzW2ldKSkge1xuICAgICAgICAgICAgICAgIHRvUmVtb3ZlLnB1c2gobGlua3NbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdG9SZW1vdmUuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG4gICAgfVxuXG4gICAgc2V0TGlua1RhZyh0YWc6IExpbmtEZWZpbml0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKHRoaXMuZG9jdW1lbnQsIHtcbiAgICAgICAgICAgICAgICBpZDogJy0xJyxcbiAgICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgICAgICAgICAgICAgIHN0eWxlczogW10sXG4gICAgICAgICAgICAgICAgZGF0YToge31cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBsaW5rID0gcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgY29uc3QgaGVhZCA9IHRoaXMuZG9jdW1lbnQuaGVhZDtcblxuICAgICAgICAgICAgT2JqZWN0LmtleXModGFnKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnNldEF0dHJpYnV0ZShsaW5rLCBwcm9wZXJ0eSwgU3RyaW5nKHRhZ1twcm9wZXJ0eV0pKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUxpbmtUYWdzKGVsID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIChlbC5nZXRBdHRyaWJ1dGUoJ25hbWUnKSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKCduYW1lJykgPT09IGxpbmsuZ2V0QXR0cmlidXRlKCduYW1lJykpIHx8XG4gICAgICAgICAgICAgICAgICAgIChlbC5nZXRBdHRyaWJ1dGUoJ3JlbCcpICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoJ3JlbCcpID09PSBsaW5rLmdldEF0dHJpYnV0ZSgncmVsJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuZ2V0QXR0cmlidXRlKCdyZWwnKSAhPT0gJ3N0eWxlc2hlZXQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmdldEF0dHJpYnV0ZSgncmVsJykgIT09ICdhbHRlcm5hdGUnKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlbmRlcmVyLmFwcGVuZENoaWxkKGhlYWQsIGxpbmspO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cblxuICAgIHNldEFsbFRpdGxlVGFncyh0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0VGl0bGUodGl0bGUpO1xuICAgICAgICB0aGlzLnNldE1ldGFUYWcoJ29nOnRpdGxlJywgdGl0bGUpO1xuICAgIH1cblxuICAgIHNldEFsbERlc2NyaXB0aW9uVGFncyhkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0TWV0YVRhZygnZGVzY3JpcHRpb24nLCBkZXNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMuc2V0TWV0YVRhZygnb2c6ZGVzY3JpcHRpb24nLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgc2V0Q2Fub25pY2FsKGhyZWY6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNldExpbmtUYWcoe1xuICAgICAgICAgICAgcmVsOiAnY2Fub25pY2FsJyxcbiAgICAgICAgICAgIGhyZWZcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQ2Fub25pY2FsKCkge1xuICAgICAgdGhpcy5yZW1vdmVMaW5rVGFncyhlbCA9PiBlbC5nZXRBdHRyaWJ1dGUoJ3JlbCcpID09PSAnY2Fub25pY2FsJyk7XG4gICAgfVxuXG4gICAgc2V0Um9ib3RzKGNvbnRlbnQ6IFJvYm90cykge1xuICAgICAgICB0aGlzLnNldExpbmtUYWcoe1xuICAgICAgICAgICAgcmVsOiAncm9ib3RzJyxcbiAgICAgICAgICAgIGNvbnRlbnRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0T3BlbkdyYXBoKG9nOiBPcGVuR3JhcGgpIHtcbiAgICAgICAgT2JqZWN0LmtleXMob2cpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRNZXRhVGFnKCdvZzonICsgbmFtZSwgU3RyaW5nKG9nW25hbWVdKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRhZ3ModGFnczogVGFncykge1xuICAgICAgICBpZiAodGFncy5oYXNPd25Qcm9wZXJ0eSgndGl0bGUnKSAmJiB0YWdzLnRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEFsbFRpdGxlVGFncyh0YWdzLnRpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YWdzLmhhc093blByb3BlcnR5KCdkZXNjcmlwdGlvbicpICYmIHRhZ3MuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWxsRGVzY3JpcHRpb25UYWdzKHRhZ3MuZGVzY3JpcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhZ3MuaGFzT3duUHJvcGVydHkoJ3VybCcpICYmIHRhZ3MudXJsKSB7XG4gICAgICAgICAgICB0aGlzLnNldE1ldGFUYWcoJ29nOnVybCcsIHRhZ3MudXJsKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2Fub25pY2FsKHRhZ3MudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YWdzLmhhc093blByb3BlcnR5KCdpbWFnZScpICYmIHRhZ3MuaW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TWV0YVRhZygnb2c6aW1hZ2U6dXJsJywgdGFncy5pbWFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFncy5oYXNPd25Qcm9wZXJ0eSgncm9ib3RzJykgJiYgdGFncy5yb2JvdHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Um9ib3RzKHRhZ3Mucm9ib3RzKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIl19