AdaskoTheBeAsT / Typewriter

Automatic TypeScript template generation from C# source files
http://frhagn.github.io/Typewriter
Apache License 2.0
62 stars 12 forks source link

Added single file mode #20

Closed nfMalde closed 1 year ago

nfMalde commented 1 year ago

Added single file mode as option to generate files like Modules or index files. Here are a few example of use cases:

Example 1: I want to generate an NG Module out of my generated files. I use the same helper functions to generate the class names etc.

The TST File looks like this:

${
    Template(Settings settings) {

        settings.SingleFileMode("api.module.ts");

    }

    string GenerateServiceNameOutOfControllerClass(Class cls) {

            string name = cls.Name.Substring(0, cls.Name.IndexOf("Controller"));

            return name;

    }
}
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

@NgModule({
  imports: [
    CommonModule
  ],
  declarations: [],
  providers: [
    $Classes(x => x.Namespace.StartsWith("TypewriterTestApp.Controllers"))[
        $GenerateServiceNameOutOfControllerClass][,]  
  ]
})
export class CustomerDashboardModule { }   

Please note: Single File Mode is activated by Settings.SingleFileMode("filename")

Given I have 2 Controllers in the Namespace TypewriterTestApp.Controllers the file results as "api.module.ts" like:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

@NgModule({
  imports: [
    CommonModule
  ],
  declarations: [],
  providers: [

        Settings,
        UserApi  
  ]
})
export class CustomerDashboardModule { }   

Example 2 I want to create an index.d.ts. I use the same path helper and name helper

The Template looking like this:

${
    Template(Settings settings) {

        settings.SingleFileMode("index.ts");

    }

    string GenerateServiceNameOutOfControllerClass(Class cls) {

            string name = cls.Name.Substring(0, cls.Name.IndexOf("Controller"));

            return name;

    }

    string GetTsPath(Class cls) {
        return $"./clients/{cls.name}.client.ts";
    }
}
// Index TS for all api clients
$Classes(x => x.Namespace.StartsWith("TypewriterTestApp.Controllers"))[
export *  from '$GetTsPath';
]

Will result in index.ts like:


// Index TS for all api clients

export *  from './clients/settingsController.client.ts';

export *  from './clients/userApiController.client.ts';

Please note: Single File Usage can demand more RAM depending on the filter set.

The SingleFileParser is fully tested.

AdaskoTheBeAsT commented 1 year ago

@nfMalde thanks for implementation I will try to release this weekend