Uptime Robot ratio (30 days)      
v2020.10.102
 73

🆖 Angular Dynamic Compile - Convert strings to Angular components

Built on Angular v10.0.1

Use case 

Dynamically compile standard strings to fully functional Angular components. Supports imports, exports, and standard context.

NPM 

It is an ESNEXT bundle by default.

Install 

npm install --save p3x-angular-compile
# or
yarn add p3x-angular-compile

Check out how it works and code 

https://angular-compile.corifeus.com

https://github.com/patrikx3/angular-compile/blob/master/test/angular-webpack/angular/page.ts#L115

IMPORTANT 

Make sure Ivy is disabled in the tsconfig.json:

"angularCompilerOptions": {
  "enableIvy": false
}

Make sure AOT is disabled in the angular.json:

{ 
    "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/workspace",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.app.json",

            // make sure it is false
            "aot": false,
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.scss"
            ],
            "scripts": []
          }
    }
}

When you work with P3X Angular Compile, you have to disable AOT as well, so like this:

ng serve --aot=false

Usage 

import { CompileModule} from "p3x-angular-compile"

// the module settings
@NgModule({
    imports: [
        CorifeusWebMaterialModule, // Optional
        CompileModule, // Required
    ],
    declarations: [
        Page,
    ],
    providers: [
    ],
    bootstrap: [ Page ]
})
export class Module { };

Template 

 <span 

 <!--- Not required -->
 *ngIf="isEnabled" 

 <!--- Required -->
 [p3x-compile]="template"

 <!--- Required -->
 [p3x-compile-ctx]="this"

 <!--- Not required, will just throw the component's exception if not provided -->
 [p3x-compile-error-handler]="handleCompileErrorHandler"

 <!--- Not required -->
 [p3x-compile-module]="dataModule"
 >     
</span>

Code 

// A page example
export class Page {

    isEnabled: boolean = true;

    dataModule : any =  {
        //schemas: [CUSTOM_ELEMENTS_SCHEMA],
        //declarations: [],
        imports: [
            MatButtonModule
        ],
        exports: [       
        ]
    }

    template: string = "<button mat-button mat-raised-button (click)="context.alert()">Dynamic template</button>";

    handleCompileErrorHandler(error: Error) {
        console.error(error)
    }

    alert() {
        alert('ok');
    }
}

Options 

Reference for the Angular module settings which are available.

Dev environment end test 

npm install -g yarn
git clone https://github.com/patrikx3/angular-compile.git
cd angular-compile
npm install
grunt run|default

http://localhost:8080

Errors 

Type x is part of the declarations of 2 modules 

Basically, you need a shared component.

https://stackoverflow.com/questions/42993580/angular-2-type-childcomponent-is-a-part-of-the-declarations-of-2-modules-par

AOT + JIT 

Since Angular 5.x.x + 

We cannot use AOT + JIT at once.

Info 

https://github.com/angular/angular/issues/20156#issuecomment-341767899

On the issue, you can see:

To reduce the payload, we do not ship the compiler in AOT.

So right now, it is not possible.

Although, there are some hacks, but you are on your own...
https://github.com/angular/angular/issues/20156#issuecomment-468686933

Size 

If you want very small bundle, use gzip.

p3x Logico
onenoteGithub onenoteredis-uiGithub redis-uiangular-compileGithub angular-compilegitlistGithub gitlistramdiskGithub ramdiskfreenomGithub freenomopenwrt-insomniaGithub openwrt-insomniadocker-debian-testing-mongodb-stableGithub docker-debian-testing-mongodb-stablecorifeusGithub corifeusredis-ui-serverGithub redis-ui-serversystemd-managerGithub systemd-managerverdaccio-cliGithub verdaccio-clicorifeus-app-web-pagesGithub corifeus-app-web-pagesredis-ui-materialGithub redis-ui-materialxml2jsonGithub xml2jsongrunt-p3x-expressGithub grunt-p3x-expresshtml-pdfGithub html-pdfbinary-search-closestGithub binary-search-closestangular-http-cache-interceptorGithub angular-http-cache-interceptorcorifeus-app-server-patrikx3Github corifeus-app-server-patrikx3corifeus-builderGithub corifeus-buildercorifeus-builder-angularGithub corifeus-builder-angularcorifeus-utilsGithub corifeus-utilsfortune-cookieGithub fortune-cookiejson2xls-worker-threadGithub json2xls-worker-threadtoolsGithub tools
  Bugs are evident™ - MATRIX
OK