Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- run: npm i -g npm@latest
- run: npm i -g @angular/cli@20 zibri-cli @loopback/cli@6 @nestjs/cli@11 create-vite@6 create-storybook@9.1.16
- run: npm i -g @angular/cli@20 zibri-cli @loopback/cli@7 @nestjs/cli@11 create-vite@6 create-storybook@9.1.20
- run: npm i
- run: npm run build
- run: npm run test
2 changes: 1 addition & 1 deletion jest.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const config = {
testEnvironment: 'node',
rootDir: 'src',
transform: {
'^.+.tsx?$': ['ts-jest', {}]
'^.+.tsx?$': ['ts-jest']
},
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
bail: false,
Expand Down
3,579 changes: 2,100 additions & 1,479 deletions package-lock.json

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "monux-cli",
"version": "2.5.6",
"version": "2.5.7",
"license": "MIT",
"main": "index.js",
"engines": {
Expand Down Expand Up @@ -46,22 +46,22 @@
"cli-table3": "^0.6.5",
"death": "^1.1.0",
"figlet": "^1.8.2",
"inquirer": "^10.2.2",
"inquirer": "^13.3.2",
"js-yaml": "^4.1.0",
"json5": "^2.2.3"
},
"devDependencies": {
"@angular/common": "^20.2.1",
"@faker-js/faker": "^9.0.3",
"@jest/globals": "^30.0.5",
"@nestjs/common": "^11.1.6",
"@jest/globals": "^30.3.0",
"@nestjs/common": "^11.1.18",
"@types/death": "^1.1.5",
"@types/figlet": "^1.7.0",
"@types/js-yaml": "^4.0.9",
"eslint": "^9.34.0",
"eslint-config-service-soft": "^2.1.2",
"jest": "^30.0.5",
"ngx-material-navigation": "^20.0.0",
"ts-jest": "^29.4.1"
"eslint-config-service-soft": "^2.1.6",
"jest": "^30.3.0",
"ngx-material-navigation": "^20.2.2",
"ts-jest": "^29.4.9"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export function fakeAddNavElementConfig(addTo: 'navbar' | 'footer' = 'navbar'):
rowIndex: 0,
element: {
type: NavElementTypes.TITLE_WITH_INTERNAL_LINK,
id: 'test',
title: 'Test',
link: {
route: {
Expand Down
12 changes: 6 additions & 6 deletions src/__testing__/mock/inquire.mock.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
/* eslint-disable jsdoc/require-jsdoc */
import { BuiltInQuestion } from 'inquirer/dist/cjs/types/types';
import { Question } from 'inquirer';

// eslint-disable-next-line typescript/no-explicit-any
export function inquireMock(answers: Record<string, unknown>): (question: BuiltInQuestion) => Promise<any> {
return (question: BuiltInQuestion) => {
export function inquireMock(answers: Record<string, unknown>): (question: Question) => Promise<any> {
return (question: Question) => {
if (typeof question.message !== 'string') {
throw new Error('Cannot mock questions with messages that are async functions.');
}

if (!Object.keys(answers).includes(question.message)) {
throw new Error(`No answer for the question "${question.message}" has been provided.`);
if (!Object.keys(answers).includes(question.name)) {
throw new Error(`No answer for the question "${question.name}" has been provided.`);
}

// eslint-disable-next-line typescript/no-unsafe-return, typescript/no-explicit-any
return answers[question.message] as any;
return answers[question.name] as any;
};
}
4 changes: 4 additions & 0 deletions src/angular/angular-utilities.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ describe('AngularUtilities', () => {
' elements: [',
' {',
' type: NavElementTypes.TITLE_WITH_INTERNAL_LINK,',
' id: \'test\',',
' title: \'Test\',',
' link: {',
' route: {',
Expand Down Expand Up @@ -216,6 +217,7 @@ describe('AngularUtilities', () => {
' elements: [',
' {',
' type: NavElementTypes.TITLE_WITH_INTERNAL_LINK,',
' id: \'test\',',
' title: \'Test\',',
' link: {',
' route: {',
Expand All @@ -227,6 +229,7 @@ describe('AngularUtilities', () => {
' },',
' {',
' type: NavElementTypes.TITLE_WITH_INTERNAL_LINK,',
' id: \'test\',',
' title: \'Test\',',
' link: {',
' route: {',
Expand Down Expand Up @@ -297,6 +300,7 @@ describe('AngularUtilities', () => {
' elements: [',
' {',
' type: NavElementTypes.TITLE_WITH_INTERNAL_LINK,',
' id: \'test\',',
' title: \'Test\',',
' link: {',
' route: {',
Expand Down
3 changes: 1 addition & 2 deletions src/angular/content/admins-page-ts.content.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const adminsPageTsContent: string
= `import { CommonModule } from '@angular/common';
export const adminsPageTsContent: string = `import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { NgxMatEntityTableComponent, TableData } from 'ngx-material-entity';
import { Admin } from '../../models/admin.model';
Expand Down
3 changes: 1 addition & 2 deletions src/angular/content/auth-service.content.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
/* eslint-disable stylistic/max-len */
// eslint-disable-next-line jsdoc/require-jsdoc
export const authServiceContent: string
= `import { HttpClient } from '@angular/common/http';
export const authServiceContent: string = `import { HttpClient } from '@angular/common/http';
import { Inject, Injectable, NgZone, PLATFORM_ID } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { MatSnackBar } from '@angular/material/snack-bar';
Expand Down
3 changes: 1 addition & 2 deletions src/angular/content/base-entity-model.content.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const baseEntityModelContent: string
= `import { string } from 'ngx-material-entity';
export const baseEntityModelContent: string = `import { string } from 'ngx-material-entity';

export class BaseEntity {

Expand Down
3 changes: 1 addition & 2 deletions src/angular/content/change-set-service.content.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const changeSetServiceContent: string
= `import { HttpClient } from '@angular/common/http';
export const changeSetServiceContent: string = `import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { BaseChangeSetService, ChangeSet } from 'ngx-material-change-sets';

Expand Down
6 changes: 2 additions & 4 deletions src/angular/content/change-sets-component-html.content.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,2 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const changeSetsComponentHtmlContent: string
// eslint-disable-next-line stylistic/max-len
= '<ngx-mat-change-sets [entity]="e" [config]="config" [changeSetsApiBaseUrl]="metadata.customMetadata.changeSetsApiBaseUrl"></ngx-mat-change-sets>';
// eslint-disable-next-line jsdoc/require-jsdoc, stylistic/max-len
export const changeSetsComponentHtmlContent: string = '<ngx-mat-change-sets [entity]="e" [config]="config" [changeSetsApiBaseUrl]="metadata.customMetadata.changeSetsApiBaseUrl"></ngx-mat-change-sets>';
3 changes: 1 addition & 2 deletions src/angular/content/change-sets-component-ts.content.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const changeSetsComponentTsContent: string
= `import { Component, OnInit } from '@angular/core';
export const changeSetsComponentTsContent: string = `import { Component, OnInit } from '@angular/core';
import { ChangeSet, ChangeSetEntity, ChangeSetsComponent, ChangeSetsConfig } from 'ngx-material-change-sets';
import { DecoratorTypes, NgxMatEntityBaseInputComponent } from 'ngx-material-entity';
import { LodashUtilities } from '../../utilities/lodash.utilities';
Expand Down
3 changes: 1 addition & 2 deletions src/angular/content/lodash-utilities.content.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const lodashUtilitiesContent: string
= `import { cloneDeep } from 'lodash';
export const lodashUtilitiesContent: string = `import { cloneDeep } from 'lodash';

export abstract class LodashUtilities {
static cloneDeep<E>(value: E): E {
Expand Down
3 changes: 1 addition & 2 deletions src/angular/content/offline-service.content.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const offlineServiceContent: string
= `import { HttpClient } from '@angular/common/http';
export const offlineServiceContent: string = `import { HttpClient } from '@angular/common/http';
import { Inject, Injectable, NgZone, PLATFORM_ID } from '@angular/core';
import { MatSnackBar } from '@angular/material/snack-bar';
import { NgxPwaOfflineService } from 'ngx-pwa';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ export class AddAngularLibraryCommand extends BaseAddCommand<AddAngularLibraryCo
protected override configQuestions: QuestionsFor<OmitStrict<AddAngularLibraryConfiguration, keyof AddConfiguration>> = {
scope: {
type: 'input',
required: true,
name: 'scope',
message: 'scope',
validate: (v?: string) => !!v,
default: async () => {
const workspaceConfig: WorkspaceConfig = await WorkspaceUtilities.getConfigOrFail();
return `@${workspaceConfig.name}`;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const buttonComponentHtmlContent: string
= `<button
export const buttonComponentHtmlContent: string = `<button
class="transition duration-200 ease-in-out rounded-md p-2 px-4 font-semibold"
[ngClass]="{
'bg-primary hover:bg-primary-darker text-primary-contrast': color === 'primary',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const buttonComponentTsContent: string
= `import { CommonModule } from '@angular/common';
export const buttonComponentTsContent: string = `import { CommonModule } from '@angular/common';
import { Component, Input } from '@angular/core';

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const buttonStoriesTsContent: string
= `import { componentWrapperDecorator, StoryFn, type Meta } from '@storybook/angular';
export const buttonStoriesTsContent: string = `import { componentWrapperDecorator, StoryFn, type Meta } from '@storybook/angular';

import { ButtonComponent } from './button.component';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// eslint-disable-next-line jsdoc/require-jsdoc
export const storybookMainTsContent: string
= `import { join, dirname } from 'path';
export const storybookMainTsContent: string = `import { join, dirname } from 'path';

import type { StorybookConfig } from '@storybook/angular';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ describe('AddAngularWebsiteCommand', () => {
await FileMockUtilities.setup(mockConstants);
InquirerUtilities['inquire'] = jest.fn(inquireMock({
port: 4200,
'sub domain': undefined,
'title suffix (eg. "| My Company")': '| Website',
'Add tracking?': false
subDomain: undefined,
titleSuffix: '| Website',
addTracking: false
}));
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,23 +48,26 @@ export class AddAngularWebsiteCommand extends BaseAddCommand<AddAngularWebsiteCo
protected override configQuestions: QuestionsFor<OmitStrict<AddAngularWebsiteConfiguration, keyof AddConfiguration>> = {
port: {
type: 'number',
name: 'port',
message: 'port',
required: true,
validate: (v?: number) => !!v,
default: 4200
},
subDomain: {
type: 'input',
message: 'sub domain',
required: false
name: 'subDomain',
message: 'sub domain'
},
titleSuffix: {
type: 'input',
name: 'titleSuffix',
message: 'title suffix (eg. "| My Company")',
default: `| ${toPascalCase(this.baseConfig.name)}`,
required: true
validate: (v?: string) => !!v,
default: `| ${toPascalCase(this.baseConfig.name)}`
},
addTracking: {
type: 'select',
name: 'addTracking',
message: 'Add tracking?',
choices: [{ value: true, name: 'Yes' }, { value: false, name: 'No' }],
default: true
Expand Down Expand Up @@ -126,6 +129,7 @@ export class AddAngularWebsiteCommand extends BaseAddCommand<AddAngularWebsiteCo
rowIndex: 0,
element: {
type: NavElementTypes.TITLE_WITH_INTERNAL_LINK,
id: 'home-navbar',
title: 'Home',
link: {
route: {
Expand All @@ -142,6 +146,7 @@ export class AddAngularWebsiteCommand extends BaseAddCommand<AddAngularWebsiteCo
addTo: 'footer',
rowIndex: 0,
element: {
id: 'imprint-footer',
type: NavElementTypes.INTERNAL_LINK,
name: 'Imprint',
route: {
Expand All @@ -158,6 +163,7 @@ export class AddAngularWebsiteCommand extends BaseAddCommand<AddAngularWebsiteCo
rowIndex: 0,
element: {
type: NavElementTypes.INTERNAL_LINK,
id: 'privacy-footer',
name: 'Privacy',
route: {
path: 'privacy',
Expand Down
6 changes: 3 additions & 3 deletions src/commands/add/add-angular/add-angular-command.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ describe('AddAngularCommand', () => {
await FileMockUtilities.setup(mockConstants);
InquirerUtilities['inquire'] = jest.fn(inquireMock({
port: 4200,
'sub domain': 'admin',
'title suffix (eg. "| My Company")': '| Admin',
'name of the api to use': 'api'
subDomain: 'admin',
titleSuffix: '| Admin',
apiName: 'api'
}));
});

Expand Down
13 changes: 8 additions & 5 deletions src/commands/add/add-angular/add-angular.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,25 +47,28 @@ export class AddAngularCommand extends BaseAddCommand<AddAngularConfiguration> {
protected override readonly configQuestions: QuestionsFor<OmitStrict<AddAngularConfiguration, keyof AddConfiguration>> = {
port: {
type: 'number',
name: 'port',
message: 'port',
required: true,
validate: (v?: number) => !!v,
default: 4200
},
subDomain: {
type: 'input',
message: 'sub domain',
required: false
name: 'subDomain',
message: 'sub domain'
},
titleSuffix: {
type: 'input',
name: 'titleSuffix',
message: 'title suffix (eg. "| My Company")',
required: true,
validate: (v?: string) => !!v,
default: `| ${toPascalCase(this.baseConfig.name)}`
},
apiName: {
type: 'input',
name: 'apiName',
message: 'name of the api to use',
required: true,
validate: (v?: string) => !!v,
default: 'api'
}
};
Expand Down
16 changes: 8 additions & 8 deletions src/commands/add/add-loopback/add-loopback-command.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ describe('AddLoopbackCommand', () => {
await FileMockUtilities.setup(mockConstants);
InquirerUtilities['inquire'] = jest.fn(inquireMock({
port: 3000,
'sub domain': 'api',
'Email of the default user': 'test@test.com',
'Password of the default user': 'stringstring',
'Name of the frontend where the reset password ui is implemented': 'admin',
'Database compose service': 'NEW',
'Compose service name': 'db',
'Database name': 'sandbox',
'database type': DbType.POSTGRES
subDomain: 'api',
defaultUserEmail: 'test@test.com',
defaultUserPassword: 'stringstring',
frontendName: 'admin',
dbComposeService: 'NEW',
dbComposeServiceName: 'db',
databaseName: 'sandbox',
dbType: DbType.POSTGRES
}));
LoopbackUtilities['createMailService'] = jest.fn(createMailServiceMock);
LoopbackUtilities['createBiometricCredentialsService'] = jest.fn(async () => {});
Expand Down
Loading
Loading