@qodalis/cli-guid 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/lib/guid.module.mjs +18 -0
- package/esm2022/lib/processors/cli-guid-command-processor.mjs +81 -0
- package/esm2022/public-api.mjs +5 -0
- package/esm2022/qodalis-cli-guid.mjs +5 -0
- package/fesm2022/qodalis-cli-guid.mjs +109 -0
- package/fesm2022/qodalis-cli-guid.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/guid.module.d.ts +6 -0
- package/lib/processors/cli-guid-command-processor.d.ts +18 -0
- package/package.json +43 -0
- package/public-api.d.ts +1 -0
- package/umd/index.js +97 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Guid
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project guid` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project guid`.
|
|
8
|
+
> Note: Don't forget to add `--project guid` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build guid` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build guid`, go to the dist folder `cd dist/guid` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test guid` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CliGuidCommandProcessor } from './processors/cli-guid-command-processor';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class GuidModule {
|
|
5
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuidModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
6
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: GuidModule }); }
|
|
7
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuidModule, providers: [CliGuidCommandProcessor] }); }
|
|
8
|
+
}
|
|
9
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuidModule, decorators: [{
|
|
10
|
+
type: NgModule,
|
|
11
|
+
args: [{
|
|
12
|
+
declarations: [],
|
|
13
|
+
imports: [],
|
|
14
|
+
exports: [],
|
|
15
|
+
providers: [CliGuidCommandProcessor],
|
|
16
|
+
}]
|
|
17
|
+
}] });
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWlkL3NyYy9saWIvZ3VpZC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7QUFRbEYsTUFBTSxPQUFPLFVBQVU7K0dBQVYsVUFBVTtnSEFBVixVQUFVO2dIQUFWLFVBQVUsYUFGUixDQUFDLHVCQUF1QixDQUFDOzs0RkFFM0IsVUFBVTtrQkFOdEIsUUFBUTttQkFBQztvQkFDTixZQUFZLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsU0FBUyxFQUFFLENBQUMsdUJBQXVCLENBQUM7aUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENsaUd1aWRDb21tYW5kUHJvY2Vzc29yIH0gZnJvbSAnLi9wcm9jZXNzb3JzL2NsaS1ndWlkLWNvbW1hbmQtcHJvY2Vzc29yJztcblxuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtdLFxuICAgIGltcG9ydHM6IFtdLFxuICAgIGV4cG9ydHM6IFtdLFxuICAgIHByb3ZpZGVyczogW0NsaUd1aWRDb21tYW5kUHJvY2Vzc29yXSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpZE1vZHVsZSB7fVxuIl19
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A command processor for generating and validating GUIDs.
|
|
3
|
+
*/
|
|
4
|
+
export class CliGuidCommandProcessor {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.command = 'guid';
|
|
7
|
+
this.description = 'Generate and validate GUIDs';
|
|
8
|
+
this.author = {
|
|
9
|
+
name: 'Nicolae Lupei',
|
|
10
|
+
email: 'nicolae.lupei@qodalis.com',
|
|
11
|
+
};
|
|
12
|
+
this.processors = [];
|
|
13
|
+
this.processors = [
|
|
14
|
+
{
|
|
15
|
+
command: 'new',
|
|
16
|
+
description: 'Generate a new GUID',
|
|
17
|
+
parameters: [
|
|
18
|
+
{
|
|
19
|
+
name: 'copy',
|
|
20
|
+
aliases: ['c'],
|
|
21
|
+
description: 'Copy the GUID to the clipboard',
|
|
22
|
+
required: false,
|
|
23
|
+
type: 'boolean',
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
processCommand: async (command, context) => {
|
|
27
|
+
const copyToClipboard = command.args['copy'] || command.args['c'];
|
|
28
|
+
const guid = CliGuidCommandProcessor.generateGUID();
|
|
29
|
+
context.writer.writeln(guid);
|
|
30
|
+
if (copyToClipboard) {
|
|
31
|
+
await context.clipboard.write(guid);
|
|
32
|
+
context.writer.writeInfo('The GUID has been copied to the clipboard');
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
command: 'validate',
|
|
38
|
+
allowUnlistedCommands: true,
|
|
39
|
+
description: 'Validate a GUID',
|
|
40
|
+
processCommand: async (command, context) => {
|
|
41
|
+
if (!command.value) {
|
|
42
|
+
context.writer.writeError('Please specify a GUID to validate');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const isValid = CliGuidCommandProcessor.validateGUID(command.value);
|
|
46
|
+
if (isValid) {
|
|
47
|
+
context.writer.writeSuccess('Yes, that is GUID!');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
context.writer.writeError(`The GUID <${command.value}> is not valid`);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
async processCommand(command, context) {
|
|
57
|
+
context.writer.writeln('Please specify a subcommand');
|
|
58
|
+
}
|
|
59
|
+
writeDescription(context) {
|
|
60
|
+
context.writer.writeln(this.description);
|
|
61
|
+
//examples
|
|
62
|
+
context.writer.writeln('Examples:');
|
|
63
|
+
context.writer.writeln(' guid new');
|
|
64
|
+
context.writer.writeln(' guid new --copy');
|
|
65
|
+
context.writer.writeln(' guid validate 123e4567-e89b-12d3-a456-426614174000');
|
|
66
|
+
}
|
|
67
|
+
static generateGUID() {
|
|
68
|
+
// Generate a GUID in the format of xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|
|
69
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char) => {
|
|
70
|
+
const random = (Math.random() * 16) | 0; // Random integer between 0 and 15
|
|
71
|
+
const value = char === 'x' ? random : (random & 0x3) | 0x8; // Ensure 'y' starts with 8, 9, A, or B
|
|
72
|
+
return value.toString(16); // Convert to hexadecimal
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
static validateGUID(guid) {
|
|
76
|
+
// Regular expression to match a valid GUID format
|
|
77
|
+
const guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/;
|
|
78
|
+
return guidRegex.test(guid);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWd1aWQtY29tbWFuZC1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWlkL3NyYy9saWIvcHJvY2Vzc29ycy9jbGktZ3VpZC1jb21tYW5kLXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQTs7R0FFRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFVaEM7UUFUQSxZQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ2pCLGdCQUFXLEdBQUcsNkJBQTZCLENBQUM7UUFDNUMsV0FBTSxHQUFHO1lBQ0wsSUFBSSxFQUFFLGVBQWU7WUFDckIsS0FBSyxFQUFFLDJCQUEyQjtTQUNyQyxDQUFDO1FBRUYsZUFBVSxHQUF3QyxFQUFFLENBQUM7UUFHakQsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNkO2dCQUNJLE9BQU8sRUFBRSxLQUFLO2dCQUNkLFdBQVcsRUFBRSxxQkFBcUI7Z0JBQ2xDLFVBQVUsRUFBRTtvQkFDUjt3QkFDSSxJQUFJLEVBQUUsTUFBTTt3QkFDWixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7d0JBQ2QsV0FBVyxFQUFFLGdDQUFnQzt3QkFDN0MsUUFBUSxFQUFFLEtBQUs7d0JBQ2YsSUFBSSxFQUFFLFNBQVM7cUJBQ2xCO2lCQUNKO2dCQUNELGNBQWMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO29CQUN2QyxNQUFNLGVBQWUsR0FDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM5QyxNQUFNLElBQUksR0FBRyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDcEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBRTdCLElBQUksZUFBZSxFQUFFO3dCQUNqQixNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNwQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDcEIsMkNBQTJDLENBQzlDLENBQUM7cUJBQ0w7Z0JBQ0wsQ0FBQzthQUNKO1lBQ0Q7Z0JBQ0ksT0FBTyxFQUFFLFVBQVU7Z0JBQ25CLHFCQUFxQixFQUFFLElBQUk7Z0JBQzNCLFdBQVcsRUFBRSxpQkFBaUI7Z0JBQzlCLGNBQWMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO29CQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTt3QkFDaEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQ3JCLG1DQUFtQyxDQUN0QyxDQUFDO3dCQUNGLE9BQU87cUJBQ1Y7b0JBRUQsTUFBTSxPQUFPLEdBQUcsdUJBQXVCLENBQUMsWUFBWSxDQUNoRCxPQUFPLENBQUMsS0FBSyxDQUNoQixDQUFDO29CQUVGLElBQUksT0FBTyxFQUFFO3dCQUNULE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7cUJBQ3JEO3lCQUFNO3dCQUNILE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUNyQixhQUFhLE9BQU8sQ0FBQyxLQUFLLGdCQUFnQixDQUM3QyxDQUFDO3FCQUNMO2dCQUNMLENBQUM7YUFDSjtTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FDaEIsT0FBMEIsRUFDMUIsT0FBNkI7UUFFN0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBNkI7UUFDMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pDLFVBQVU7UUFDVixPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNsQixzREFBc0QsQ0FDekQsQ0FBQztJQUNOLENBQUM7SUFFTSxNQUFNLENBQUMsWUFBWTtRQUN0Qix3RUFBd0U7UUFDeEUsT0FBTyxzQ0FBc0MsQ0FBQyxPQUFPLENBQ2pELE9BQU8sRUFDUCxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ0wsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0NBQWtDO1lBQzNFLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsdUNBQXVDO1lBQ25HLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHlCQUF5QjtRQUN4RCxDQUFDLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFTSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQVk7UUFDbkMsa0RBQWtEO1FBQ2xELE1BQU0sU0FBUyxHQUNYLHdGQUF3RixDQUFDO1FBQzdGLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENsaVByb2Nlc3NDb21tYW5kLFxuICAgIElDbGlDb21tYW5kUHJvY2Vzc29yLFxuICAgIElDbGlFeGVjdXRpb25Db250ZXh0LFxufSBmcm9tICdAcW9kYWxpcy9jbGktY29yZSc7XG5cbi8qKlxuICogQSBjb21tYW5kIHByb2Nlc3NvciBmb3IgZ2VuZXJhdGluZyBhbmQgdmFsaWRhdGluZyBHVUlEcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENsaUd1aWRDb21tYW5kUHJvY2Vzc29yIGltcGxlbWVudHMgSUNsaUNvbW1hbmRQcm9jZXNzb3Ige1xuICAgIGNvbW1hbmQgPSAnZ3VpZCc7XG4gICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgYW5kIHZhbGlkYXRlIEdVSURzJztcbiAgICBhdXRob3IgPSB7XG4gICAgICAgIG5hbWU6ICdOaWNvbGFlIEx1cGVpJyxcbiAgICAgICAgZW1haWw6ICduaWNvbGFlLmx1cGVpQHFvZGFsaXMuY29tJyxcbiAgICB9O1xuXG4gICAgcHJvY2Vzc29ycz86IElDbGlDb21tYW5kUHJvY2Vzc29yW10gfCB1bmRlZmluZWQgPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NvcnMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ25ldycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdHZW5lcmF0ZSBhIG5ldyBHVUlEJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb3B5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnYyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDb3B5IHRoZSBHVUlEIHRvIHRoZSBjbGlwYm9hcmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChjb21tYW5kLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvcHlUb0NsaXBib2FyZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLmFyZ3NbJ2NvcHknXSB8fCBjb21tYW5kLmFyZ3NbJ2MnXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpZCA9IENsaUd1aWRDb21tYW5kUHJvY2Vzc29yLmdlbmVyYXRlR1VJRCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKGd1aWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3B5VG9DbGlwYm9hcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpcGJvYXJkLndyaXRlKGd1aWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVJbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgR1VJRCBoYXMgYmVlbiBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ3ZhbGlkYXRlJyxcbiAgICAgICAgICAgICAgICBhbGxvd1VubGlzdGVkQ29tbWFuZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdWYWxpZGF0ZSBhIEdVSUQnLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kOiBhc3luYyAoY29tbWFuZCwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbW1hbmQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSBzcGVjaWZ5IGEgR1VJRCB0byB2YWxpZGF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNWYWxpZCA9IENsaUd1aWRDb21tYW5kUHJvY2Vzc29yLnZhbGlkYXRlR1VJRChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlU3VjY2VzcygnWWVzLCB0aGF0IGlzIEdVSUQhJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgR1VJRCA8JHtjb21tYW5kLnZhbHVlfT4gaXMgbm90IHZhbGlkYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzQ29tbWFuZChcbiAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCdQbGVhc2Ugc3BlY2lmeSBhIHN1YmNvbW1hbmQnKTtcbiAgICB9XG5cbiAgICB3cml0ZURlc2NyaXB0aW9uKGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4odGhpcy5kZXNjcmlwdGlvbik7XG4gICAgICAgIC8vZXhhbXBsZXNcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbignRXhhbXBsZXM6Jyk7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oJyAgZ3VpZCBuZXcnKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbignICBndWlkIG5ldyAtLWNvcHknKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICcgIGd1aWQgdmFsaWRhdGUgMTIzZTQ1NjctZTg5Yi0xMmQzLWE0NTYtNDI2NjE0MTc0MDAwJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlR1VJRCgpOiBzdHJpbmcge1xuICAgICAgICAvLyBHZW5lcmF0ZSBhIEdVSUQgaW4gdGhlIGZvcm1hdCBvZiB4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHhcbiAgICAgICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoXG4gICAgICAgICAgICAvW3h5XS9nLFxuICAgICAgICAgICAgKGNoYXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5kb20gPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7IC8vIFJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTVcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoYXIgPT09ICd4JyA/IHJhbmRvbSA6IChyYW5kb20gJiAweDMpIHwgMHg4OyAvLyBFbnN1cmUgJ3knIHN0YXJ0cyB3aXRoIDgsIDksIEEsIG9yIEJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoMTYpOyAvLyBDb252ZXJ0IHRvIGhleGFkZWNpbWFsXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVHVUlEKGd1aWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYSB2YWxpZCBHVUlEIGZvcm1hdFxuICAgICAgICBjb25zdCBndWlkUmVnZXggPVxuICAgICAgICAgICAgL15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS00WzAtOWEtZkEtRl17M30tWzg5YWJBQl1bMC05YS1mQS1GXXszfS1bMC05YS1mQS1GXXsxMn0kLztcbiAgICAgICAgcmV0dXJuIGd1aWRSZWdleC50ZXN0KGd1aWQpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of guid
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/guid.module';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2d1aWQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBndWlkXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvZ3VpZC5tb2R1bGUnO1xuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicW9kYWxpcy1jbGktZ3VpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2d1aWQvc3JjL3FvZGFsaXMtY2xpLWd1aWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A command processor for generating and validating GUIDs.
|
|
6
|
+
*/
|
|
7
|
+
class CliGuidCommandProcessor {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.command = 'guid';
|
|
10
|
+
this.description = 'Generate and validate GUIDs';
|
|
11
|
+
this.author = {
|
|
12
|
+
name: 'Nicolae Lupei',
|
|
13
|
+
email: 'nicolae.lupei@qodalis.com',
|
|
14
|
+
};
|
|
15
|
+
this.processors = [];
|
|
16
|
+
this.processors = [
|
|
17
|
+
{
|
|
18
|
+
command: 'new',
|
|
19
|
+
description: 'Generate a new GUID',
|
|
20
|
+
parameters: [
|
|
21
|
+
{
|
|
22
|
+
name: 'copy',
|
|
23
|
+
aliases: ['c'],
|
|
24
|
+
description: 'Copy the GUID to the clipboard',
|
|
25
|
+
required: false,
|
|
26
|
+
type: 'boolean',
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
processCommand: async (command, context) => {
|
|
30
|
+
const copyToClipboard = command.args['copy'] || command.args['c'];
|
|
31
|
+
const guid = CliGuidCommandProcessor.generateGUID();
|
|
32
|
+
context.writer.writeln(guid);
|
|
33
|
+
if (copyToClipboard) {
|
|
34
|
+
await context.clipboard.write(guid);
|
|
35
|
+
context.writer.writeInfo('The GUID has been copied to the clipboard');
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
command: 'validate',
|
|
41
|
+
allowUnlistedCommands: true,
|
|
42
|
+
description: 'Validate a GUID',
|
|
43
|
+
processCommand: async (command, context) => {
|
|
44
|
+
if (!command.value) {
|
|
45
|
+
context.writer.writeError('Please specify a GUID to validate');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const isValid = CliGuidCommandProcessor.validateGUID(command.value);
|
|
49
|
+
if (isValid) {
|
|
50
|
+
context.writer.writeSuccess('Yes, that is GUID!');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
context.writer.writeError(`The GUID <${command.value}> is not valid`);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
async processCommand(command, context) {
|
|
60
|
+
context.writer.writeln('Please specify a subcommand');
|
|
61
|
+
}
|
|
62
|
+
writeDescription(context) {
|
|
63
|
+
context.writer.writeln(this.description);
|
|
64
|
+
//examples
|
|
65
|
+
context.writer.writeln('Examples:');
|
|
66
|
+
context.writer.writeln(' guid new');
|
|
67
|
+
context.writer.writeln(' guid new --copy');
|
|
68
|
+
context.writer.writeln(' guid validate 123e4567-e89b-12d3-a456-426614174000');
|
|
69
|
+
}
|
|
70
|
+
static generateGUID() {
|
|
71
|
+
// Generate a GUID in the format of xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|
|
72
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char) => {
|
|
73
|
+
const random = (Math.random() * 16) | 0; // Random integer between 0 and 15
|
|
74
|
+
const value = char === 'x' ? random : (random & 0x3) | 0x8; // Ensure 'y' starts with 8, 9, A, or B
|
|
75
|
+
return value.toString(16); // Convert to hexadecimal
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
static validateGUID(guid) {
|
|
79
|
+
// Regular expression to match a valid GUID format
|
|
80
|
+
const guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/;
|
|
81
|
+
return guidRegex.test(guid);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
class GuidModule {
|
|
86
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuidModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
87
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: GuidModule }); }
|
|
88
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuidModule, providers: [CliGuidCommandProcessor] }); }
|
|
89
|
+
}
|
|
90
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuidModule, decorators: [{
|
|
91
|
+
type: NgModule,
|
|
92
|
+
args: [{
|
|
93
|
+
declarations: [],
|
|
94
|
+
imports: [],
|
|
95
|
+
exports: [],
|
|
96
|
+
providers: [CliGuidCommandProcessor],
|
|
97
|
+
}]
|
|
98
|
+
}] });
|
|
99
|
+
|
|
100
|
+
/*
|
|
101
|
+
* Public API Surface of guid
|
|
102
|
+
*/
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Generated bundle index. Do not edit.
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
export { GuidModule };
|
|
109
|
+
//# sourceMappingURL=qodalis-cli-guid.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qodalis-cli-guid.mjs","sources":["../../../projects/guid/src/lib/processors/cli-guid-command-processor.ts","../../../projects/guid/src/lib/guid.module.ts","../../../projects/guid/src/public-api.ts","../../../projects/guid/src/qodalis-cli-guid.ts"],"sourcesContent":["import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\n\n/**\n * A command processor for generating and validating GUIDs.\n */\nexport class CliGuidCommandProcessor implements ICliCommandProcessor {\n command = 'guid';\n description = 'Generate and validate GUIDs';\n author = {\n name: 'Nicolae Lupei',\n email: 'nicolae.lupei@qodalis.com',\n };\n\n processors?: ICliCommandProcessor[] | undefined = [];\n\n constructor() {\n this.processors = [\n {\n command: 'new',\n description: 'Generate a new GUID',\n parameters: [\n {\n name: 'copy',\n aliases: ['c'],\n description: 'Copy the GUID to the clipboard',\n required: false,\n type: 'boolean',\n },\n ],\n processCommand: async (command, context) => {\n const copyToClipboard =\n command.args['copy'] || command.args['c'];\n const guid = CliGuidCommandProcessor.generateGUID();\n context.writer.writeln(guid);\n\n if (copyToClipboard) {\n await context.clipboard.write(guid);\n context.writer.writeInfo(\n 'The GUID has been copied to the clipboard',\n );\n }\n },\n },\n {\n command: 'validate',\n allowUnlistedCommands: true,\n description: 'Validate a GUID',\n processCommand: async (command, context) => {\n if (!command.value) {\n context.writer.writeError(\n 'Please specify a GUID to validate',\n );\n return;\n }\n\n const isValid = CliGuidCommandProcessor.validateGUID(\n command.value,\n );\n\n if (isValid) {\n context.writer.writeSuccess('Yes, that is GUID!');\n } else {\n context.writer.writeError(\n `The GUID <${command.value}> is not valid`,\n );\n }\n },\n },\n ];\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n context.writer.writeln('Please specify a subcommand');\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description);\n //examples\n context.writer.writeln('Examples:');\n context.writer.writeln(' guid new');\n context.writer.writeln(' guid new --copy');\n context.writer.writeln(\n ' guid validate 123e4567-e89b-12d3-a456-426614174000',\n );\n }\n\n public static generateGUID(): string {\n // Generate a GUID in the format of xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(\n /[xy]/g,\n (char) => {\n const random = (Math.random() * 16) | 0; // Random integer between 0 and 15\n const value = char === 'x' ? random : (random & 0x3) | 0x8; // Ensure 'y' starts with 8, 9, A, or B\n return value.toString(16); // Convert to hexadecimal\n },\n );\n }\n\n public static validateGUID(guid: string): boolean {\n // Regular expression to match a valid GUID format\n const guidRegex =\n /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/;\n return guidRegex.test(guid);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CliGuidCommandProcessor } from './processors/cli-guid-command-processor';\n\n@NgModule({\n declarations: [],\n imports: [],\n exports: [],\n providers: [CliGuidCommandProcessor],\n})\nexport class GuidModule {}\n","/*\n * Public API Surface of guid\n */\n\nexport * from './lib/guid.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;AAMA;;AAEG;MACU,uBAAuB,CAAA;AAUhC,IAAA,WAAA,GAAA;QATA,IAAO,CAAA,OAAA,GAAG,MAAM,CAAC;QACjB,IAAW,CAAA,WAAA,GAAG,6BAA6B,CAAC;AAC5C,QAAA,IAAA,CAAA,MAAM,GAAG;AACL,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,KAAK,EAAE,2BAA2B;SACrC,CAAC;QAEF,IAAU,CAAA,UAAA,GAAwC,EAAE,CAAC;QAGjD,IAAI,CAAC,UAAU,GAAG;AACd,YAAA;AACI,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,WAAW,EAAE,qBAAqB;AAClC,gBAAA,UAAU,EAAE;AACR,oBAAA;AACI,wBAAA,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,CAAC,GAAG,CAAC;AACd,wBAAA,WAAW,EAAE,gCAAgC;AAC7C,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,IAAI,EAAE,SAAS;AAClB,qBAAA;AACJ,iBAAA;AACD,gBAAA,cAAc,EAAE,OAAO,OAAO,EAAE,OAAO,KAAI;AACvC,oBAAA,MAAM,eAAe,GACjB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9C,oBAAA,MAAM,IAAI,GAAG,uBAAuB,CAAC,YAAY,EAAE,CAAC;AACpD,oBAAA,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE7B,oBAAA,IAAI,eAAe,EAAE;wBACjB,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpC,wBAAA,OAAO,CAAC,MAAM,CAAC,SAAS,CACpB,2CAA2C,CAC9C,CAAC;AACL,qBAAA;iBACJ;AACJ,aAAA;AACD,YAAA;AACI,gBAAA,OAAO,EAAE,UAAU;AACnB,gBAAA,qBAAqB,EAAE,IAAI;AAC3B,gBAAA,WAAW,EAAE,iBAAiB;AAC9B,gBAAA,cAAc,EAAE,OAAO,OAAO,EAAE,OAAO,KAAI;AACvC,oBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAChB,wBAAA,OAAO,CAAC,MAAM,CAAC,UAAU,CACrB,mCAAmC,CACtC,CAAC;wBACF,OAAO;AACV,qBAAA;oBAED,MAAM,OAAO,GAAG,uBAAuB,CAAC,YAAY,CAChD,OAAO,CAAC,KAAK,CAChB,CAAC;AAEF,oBAAA,IAAI,OAAO,EAAE;AACT,wBAAA,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;AACrD,qBAAA;AAAM,yBAAA;wBACH,OAAO,CAAC,MAAM,CAAC,UAAU,CACrB,CAAa,UAAA,EAAA,OAAO,CAAC,KAAK,CAAgB,cAAA,CAAA,CAC7C,CAAC;AACL,qBAAA;iBACJ;AACJ,aAAA;SACJ,CAAC;KACL;AAED,IAAA,MAAM,cAAc,CAChB,OAA0B,EAC1B,OAA6B,EAAA;AAE7B,QAAA,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;KACzD;AAED,IAAA,gBAAgB,CAAC,OAA6B,EAAA;QAC1C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;;AAEzC,QAAA,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AACpC,QAAA,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AACrC,QAAA,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAC5C,QAAA,OAAO,CAAC,MAAM,CAAC,OAAO,CAClB,sDAAsD,CACzD,CAAC;KACL;AAEM,IAAA,OAAO,YAAY,GAAA;;QAEtB,OAAO,sCAAsC,CAAC,OAAO,CACjD,OAAO,EACP,CAAC,IAAI,KAAI;AACL,YAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;YAC3D,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC9B,SAAC,CACJ,CAAC;KACL;IAEM,OAAO,YAAY,CAAC,IAAY,EAAA;;QAEnC,MAAM,SAAS,GACX,wFAAwF,CAAC;AAC7F,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC/B;AACJ;;MCtGY,UAAU,CAAA;+GAAV,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;gHAAV,UAAU,EAAA,CAAA,CAAA,EAAA;gHAAV,UAAU,EAAA,SAAA,EAFR,CAAC,uBAAuB,CAAC,EAAA,CAAA,CAAA,EAAA;;4FAE3B,UAAU,EAAA,UAAA,EAAA,CAAA;kBANtB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,CAAC,uBAAuB,CAAC;AACvC,iBAAA,CAAA;;;ACRD;;AAEG;;ACFH;;AAEG;;;;"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CliProcessCommand, ICliCommandProcessor, ICliExecutionContext } from '@qodalis/cli-core';
|
|
2
|
+
/**
|
|
3
|
+
* A command processor for generating and validating GUIDs.
|
|
4
|
+
*/
|
|
5
|
+
export declare class CliGuidCommandProcessor implements ICliCommandProcessor {
|
|
6
|
+
command: string;
|
|
7
|
+
description: string;
|
|
8
|
+
author: {
|
|
9
|
+
name: string;
|
|
10
|
+
email: string;
|
|
11
|
+
};
|
|
12
|
+
processors?: ICliCommandProcessor[] | undefined;
|
|
13
|
+
constructor();
|
|
14
|
+
processCommand(command: CliProcessCommand, context: ICliExecutionContext): Promise<void>;
|
|
15
|
+
writeDescription(context: ICliExecutionContext): void;
|
|
16
|
+
static generateGUID(): string;
|
|
17
|
+
static validateGUID(guid: string): boolean;
|
|
18
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@qodalis/cli-guid",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "An Angular CLI extension for generating and validating GUIDs.",
|
|
5
|
+
"author": "Nicolae Lupei, Qodalis Solutions",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/qodalis-solutions/qodalis-angular-cli"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://qodalis.com",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"angular",
|
|
14
|
+
"cli",
|
|
15
|
+
"qodalis",
|
|
16
|
+
"terminal"
|
|
17
|
+
],
|
|
18
|
+
"umd": "./umd/index.js",
|
|
19
|
+
"unpkg": "./umd/index.js",
|
|
20
|
+
"peerDependencies": {
|
|
21
|
+
"@angular/common": "^16.2.0",
|
|
22
|
+
"@angular/core": "^16.2.0"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"tslib": "^2.3.0",
|
|
26
|
+
"@qodalis/cli-core": "^0.0.2",
|
|
27
|
+
"@qodalis/angular-cli": "^1.0.10"
|
|
28
|
+
},
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"module": "fesm2022/qodalis-cli-guid.mjs",
|
|
31
|
+
"typings": "index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
"./package.json": {
|
|
34
|
+
"default": "./package.json"
|
|
35
|
+
},
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./index.d.ts",
|
|
38
|
+
"esm2022": "./esm2022/qodalis-cli-guid.mjs",
|
|
39
|
+
"esm": "./esm2022/qodalis-cli-guid.mjs",
|
|
40
|
+
"default": "./fesm2022/qodalis-cli-guid.mjs"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib/guid.module';
|
package/umd/index.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
typeof define === 'function' && define.amd ? define(factory) :
|
|
3
|
+
factory();
|
|
4
|
+
})((function () { 'use strict';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A command processor for generating and validating GUIDs.
|
|
8
|
+
*/
|
|
9
|
+
class CliGuidCommandProcessor {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.command = 'guid';
|
|
12
|
+
this.description = 'Generate and validate GUIDs';
|
|
13
|
+
this.author = {
|
|
14
|
+
name: 'Nicolae Lupei',
|
|
15
|
+
email: 'nicolae.lupei@qodalis.com',
|
|
16
|
+
};
|
|
17
|
+
this.processors = [];
|
|
18
|
+
this.processors = [
|
|
19
|
+
{
|
|
20
|
+
command: 'new',
|
|
21
|
+
description: 'Generate a new GUID',
|
|
22
|
+
parameters: [
|
|
23
|
+
{
|
|
24
|
+
name: 'copy',
|
|
25
|
+
aliases: ['c'],
|
|
26
|
+
description: 'Copy the GUID to the clipboard',
|
|
27
|
+
required: false,
|
|
28
|
+
type: 'boolean',
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
processCommand: async (command, context) => {
|
|
32
|
+
const copyToClipboard = command.args['copy'] || command.args['c'];
|
|
33
|
+
const guid = CliGuidCommandProcessor.generateGUID();
|
|
34
|
+
context.writer.writeln(guid);
|
|
35
|
+
if (copyToClipboard) {
|
|
36
|
+
await context.clipboard.write(guid);
|
|
37
|
+
context.writer.writeInfo('The GUID has been copied to the clipboard');
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
command: 'validate',
|
|
43
|
+
allowUnlistedCommands: true,
|
|
44
|
+
description: 'Validate a GUID',
|
|
45
|
+
processCommand: async (command, context) => {
|
|
46
|
+
if (!command.value) {
|
|
47
|
+
context.writer.writeError('Please specify a GUID to validate');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const isValid = CliGuidCommandProcessor.validateGUID(command.value);
|
|
51
|
+
if (isValid) {
|
|
52
|
+
context.writer.writeSuccess('Yes, that is GUID!');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
context.writer.writeError(`The GUID <${command.value}> is not valid`);
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
async processCommand(command, context) {
|
|
62
|
+
context.writer.writeln('Please specify a subcommand');
|
|
63
|
+
}
|
|
64
|
+
writeDescription(context) {
|
|
65
|
+
context.writer.writeln(this.description);
|
|
66
|
+
//examples
|
|
67
|
+
context.writer.writeln('Examples:');
|
|
68
|
+
context.writer.writeln(' guid new');
|
|
69
|
+
context.writer.writeln(' guid new --copy');
|
|
70
|
+
context.writer.writeln(' guid validate 123e4567-e89b-12d3-a456-426614174000');
|
|
71
|
+
}
|
|
72
|
+
static generateGUID() {
|
|
73
|
+
// Generate a GUID in the format of xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|
|
74
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char) => {
|
|
75
|
+
const random = (Math.random() * 16) | 0; // Random integer between 0 and 15
|
|
76
|
+
const value = char === 'x' ? random : (random & 0x3) | 0x8; // Ensure 'y' starts with 8, 9, A, or B
|
|
77
|
+
return value.toString(16); // Convert to hexadecimal
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
static validateGUID(guid) {
|
|
81
|
+
// Regular expression to match a valid GUID format
|
|
82
|
+
const guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/;
|
|
83
|
+
return guidRegex.test(guid);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (typeof window !== 'undefined') {
|
|
88
|
+
const module = {
|
|
89
|
+
processors: [new CliGuidCommandProcessor()],
|
|
90
|
+
};
|
|
91
|
+
window.guid = module;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.log('window is undefined');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
}));
|