@mxpicture/gcp-functions-generator 0.2.0

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.
Files changed (51) hide show
  1. package/dist/4testing/index.d.ts +1 -0
  2. package/dist/4testing/index.js +2 -0
  3. package/dist/4testing/templates/index.d.ts +2 -0
  4. package/dist/4testing/templates/index.js +3 -0
  5. package/dist/4testing/templates/template.medication.d.ts +35 -0
  6. package/dist/4testing/templates/template.medication.js +134 -0
  7. package/dist/4testing/templates/template.settings.d.ts +23 -0
  8. package/dist/4testing/templates/template.settings.js +73 -0
  9. package/dist/4testing/utils.d.ts +5 -0
  10. package/dist/4testing/utils.js +14 -0
  11. package/dist/common/Barrel.d.ts +24 -0
  12. package/dist/common/Barrel.js +80 -0
  13. package/dist/common/Collector.d.ts +22 -0
  14. package/dist/common/Collector.js +37 -0
  15. package/dist/common/Directories.d.ts +36 -0
  16. package/dist/common/Directories.js +69 -0
  17. package/dist/common/Evaluate.d.ts +12 -0
  18. package/dist/common/Evaluate.js +120 -0
  19. package/dist/common/Extractor.d.ts +33 -0
  20. package/dist/common/Extractor.js +201 -0
  21. package/dist/common/GenChangeDetector.d.ts +19 -0
  22. package/dist/common/GenChangeDetector.js +33 -0
  23. package/dist/common/generator.common.d.ts +21 -0
  24. package/dist/common/generator.common.js +86 -0
  25. package/dist/common/index.d.ts +7 -0
  26. package/dist/common/index.js +8 -0
  27. package/dist/generator/Generator.d.ts +41 -0
  28. package/dist/generator/Generator.js +132 -0
  29. package/dist/generator/GeneratorAnnotations.d.ts +9 -0
  30. package/dist/generator/GeneratorAnnotations.js +65 -0
  31. package/dist/generator/GeneratorBackend.d.ts +13 -0
  32. package/dist/generator/GeneratorBackend.js +134 -0
  33. package/dist/generator/GeneratorDoc.d.ts +9 -0
  34. package/dist/generator/GeneratorDoc.js +22 -0
  35. package/dist/generator/GeneratorFrontend.d.ts +12 -0
  36. package/dist/generator/GeneratorFrontend.js +94 -0
  37. package/dist/generator/GeneratorRoutes.d.ts +11 -0
  38. package/dist/generator/GeneratorRoutes.js +52 -0
  39. package/dist/generator/GeneratorZod.d.ts +25 -0
  40. package/dist/generator/GeneratorZod.js +149 -0
  41. package/dist/generator/index.d.ts +7 -0
  42. package/dist/generator/index.js +8 -0
  43. package/dist/meta/index.d.ts +3 -0
  44. package/dist/meta/index.js +4 -0
  45. package/dist/meta/meta.decorators.d.ts +26 -0
  46. package/dist/meta/meta.decorators.js +17 -0
  47. package/dist/meta/meta.imports.d.ts +11 -0
  48. package/dist/meta/meta.imports.js +54 -0
  49. package/dist/meta/meta.names.d.ts +13 -0
  50. package/dist/meta/meta.names.js +93 -0
  51. package/package.json +48 -0
@@ -0,0 +1,149 @@
1
+ import { castMetaPropertyArray, castMetaPropertyBoolean, castMetaPropertyCreateTime, castMetaPropertyDate, castMetaPropertyKey, castMetaPropertyNumber, castMetaPropertyObject, castMetaPropertyString, castMetaPropertyUpdateTime, MetaFileExtension, MetaFileType, MetaTargetType, } from "@mxpicture/gcp-functions-common/meta";
2
+ import { Generator } from "./Generator.js";
3
+ import { Collector } from "../common/Collector.js";
4
+ export class GeneratorZod extends Generator {
5
+ zImports = new Set();
6
+ constructor() {
7
+ super(MetaFileType.zod, MetaFileExtension.ts, MetaTargetType.backend, Collector.instance());
8
+ }
9
+ async runHeader(mainData, names) {
10
+ if (mainData.properties.length === 0)
11
+ return null;
12
+ this.startZ();
13
+ const code = [
14
+ ...this.buildShape(mainData.properties, names),
15
+ "",
16
+ ...this.buildSchema(names),
17
+ ];
18
+ return {
19
+ code,
20
+ imports: this.endZ(),
21
+ name: mainData.templateName,
22
+ };
23
+ }
24
+ startZ() {
25
+ this.zImports = new Set();
26
+ }
27
+ endZ() {
28
+ if (this.zImports.size === 0)
29
+ return [];
30
+ const results = [
31
+ {
32
+ props: [...this.zImports],
33
+ path: "zod",
34
+ },
35
+ ];
36
+ this.zImports = new Set();
37
+ return results;
38
+ }
39
+ z(name, params = "()") {
40
+ this.zImports.add(name);
41
+ return name + params;
42
+ }
43
+ buildShape(properties, names) {
44
+ const code = [];
45
+ code.push(`export const ${names.shape} = {`);
46
+ for (const prop of properties) {
47
+ let line = this.buildProperty(prop);
48
+ if (prop.optional)
49
+ line += ".optional()";
50
+ code.push(` ${prop.propertyKey}: ${line},`);
51
+ }
52
+ code.push("};");
53
+ return code;
54
+ }
55
+ buildSchema(names) {
56
+ return [
57
+ `export const ${names.schema} = ${this.z("object", `(${names.shape})`)};`,
58
+ ];
59
+ }
60
+ buildProperty(prop) {
61
+ return (this.buildNumber(prop) ??
62
+ this.buildKey(prop) ??
63
+ this.buildCreateTime(prop) ??
64
+ this.buildUpdateTime(prop) ??
65
+ this.buildString(prop) ??
66
+ this.buildArray(prop) ??
67
+ this.buildObject(prop) ??
68
+ this.buildDate(prop) ??
69
+ this.buildBoolean(prop));
70
+ }
71
+ buildNumber(_prop) {
72
+ const prop = castMetaPropertyNumber(_prop);
73
+ if (!prop)
74
+ return null;
75
+ // todo format?: MetaNumberFormat;
76
+ let line = this.z("number");
77
+ if (prop.min !== undefined)
78
+ line += `.${prop.minInclusive ? "gte" : "gt"}(${prop.min})`;
79
+ if (prop.max !== undefined)
80
+ line += `.${prop.maxInclusive ? "lte" : "lt"}(${prop.max})`;
81
+ if (prop.multipleOf !== undefined)
82
+ line += `.multipleOf(${prop.multipleOf})`;
83
+ return line;
84
+ }
85
+ buildKey(_prop) {
86
+ const prop = castMetaPropertyKey(_prop);
87
+ if (!prop)
88
+ return null;
89
+ return this.z("string");
90
+ }
91
+ buildCreateTime(_prop) {
92
+ const prop = castMetaPropertyCreateTime(_prop);
93
+ if (!prop)
94
+ return null;
95
+ return this.z("date");
96
+ }
97
+ buildUpdateTime(_prop) {
98
+ const prop = castMetaPropertyUpdateTime(_prop);
99
+ if (!prop)
100
+ return null;
101
+ return this.z("date");
102
+ }
103
+ buildString(_prop) {
104
+ const prop = castMetaPropertyString(_prop);
105
+ if (!prop)
106
+ return null;
107
+ // todo format?: MetaStringFormat;
108
+ let line = this.z("string");
109
+ if (prop.minLength !== undefined || prop.exactLength !== undefined)
110
+ line += `.min(${prop.minLength ?? prop.exactLength})`;
111
+ if (prop.maxLength !== undefined || prop.exactLength !== undefined)
112
+ line += `.max(${prop.maxLength ?? prop.exactLength})`;
113
+ if (prop.regex !== undefined)
114
+ line += `.regex(${prop.regex})`;
115
+ return line;
116
+ }
117
+ buildArray(_prop) {
118
+ const prop = castMetaPropertyArray(_prop);
119
+ if (!prop)
120
+ return null;
121
+ let propertyType = _prop.propertyType.endsWith("[]")
122
+ ? _prop.propertyType.substring(0, _prop.propertyType.length - "[]".length)
123
+ : _prop.propertyType;
124
+ propertyType =
125
+ this.collector.findFirst(propertyType)?.data.names.schema ??
126
+ `${propertyType}()`;
127
+ return `${this.z("array", `(${propertyType})`)}`;
128
+ }
129
+ buildObject(_prop) {
130
+ const prop = castMetaPropertyObject(_prop);
131
+ if (!prop)
132
+ return null;
133
+ return (this.collector.findFirst(_prop.propertyType)?.data.names.schema ??
134
+ _prop.propertyType);
135
+ }
136
+ buildDate(_prop) {
137
+ const prop = castMetaPropertyDate(_prop);
138
+ if (!prop)
139
+ return null;
140
+ return this.z("date");
141
+ }
142
+ buildBoolean(_prop) {
143
+ const prop = castMetaPropertyBoolean(_prop);
144
+ if (!prop)
145
+ return null;
146
+ return this.z("boolean");
147
+ }
148
+ }
149
+ export default new GeneratorZod();
@@ -0,0 +1,7 @@
1
+ export * from "./Generator.js";
2
+ export * from "./GeneratorAnnotations.js";
3
+ export * from "./GeneratorBackend.js";
4
+ export * from "./GeneratorDoc.js";
5
+ export * from "./GeneratorFrontend.js";
6
+ export * from "./GeneratorRoutes.js";
7
+ export * from "./GeneratorZod.js";
@@ -0,0 +1,8 @@
1
+ // This file is auto-generated. Do not edit manually.
2
+ export * from "./Generator.js";
3
+ export * from "./GeneratorAnnotations.js";
4
+ export * from "./GeneratorBackend.js";
5
+ export * from "./GeneratorDoc.js";
6
+ export * from "./GeneratorFrontend.js";
7
+ export * from "./GeneratorRoutes.js";
8
+ export * from "./GeneratorZod.js";
@@ -0,0 +1,3 @@
1
+ export * from "./meta.decorators.js";
2
+ export * from "./meta.imports.js";
3
+ export * from "./meta.names.js";
@@ -0,0 +1,4 @@
1
+ // This file is auto-generated. Do not edit manually.
2
+ export * from "./meta.decorators.js";
3
+ export * from "./meta.imports.js";
4
+ export * from "./meta.names.js";
@@ -0,0 +1,26 @@
1
+ import type { WithoutType } from "@mxpicture/gcp-functions-common/types";
2
+ import { MetaHeadDecorator, MetaPropertyDecorator } from "@mxpicture/gcp-functions-common/meta";
3
+ import { MetaInterfaceOptions, MetaHeadInterfaceOptions, MetaKeyOptions, MetaCreateTimeOptions, MetaUpdateTimeOptions, MetaNumberOptions, MetaStringOptions, MetaArrayOptions, MetaObjectOptions, MetaDateOptions, MetaBooleanOptions } from "@mxpicture/gcp-functions-common/types";
4
+ export declare const MetaInterface: (options: WithoutType<MetaInterfaceOptions>, decoratorType?: MetaHeadDecorator.MetaInterface) => <T extends {
5
+ new (...args: any[]): {};
6
+ }>(constructor: T) => T;
7
+ export declare const MetaHeadInterface: (options: WithoutType<MetaHeadInterfaceOptions>, decoratorType?: MetaHeadDecorator.MetaHeadInterface) => <T extends {
8
+ new (...args: any[]): {};
9
+ }>(constructor: T) => T;
10
+ export declare const MetaKey: (options: Omit<WithoutType<MetaKeyOptions>, "optional">, decoratorType?: MetaPropertyDecorator.MetaKey) => (target: any, propertyKey: string) => void;
11
+ export type MetaCreateTimeOptionsBase = WithoutType<MetaCreateTimeOptions>;
12
+ export declare const MetaCreateTime: <Opt extends MetaCreateTimeOptionsBase>(options: Opt, decoratorType?: MetaPropertyDecorator.MetaCreateTime) => <T, K extends Extract<keyof T, string>>(target: T, propertyKey: K & (T[K] extends (Opt["optional"] extends true ? Date | undefined : Date) ? unknown : never)) => void;
13
+ export type MetaUpdateTimeOptionsBase = WithoutType<MetaUpdateTimeOptions>;
14
+ export declare const MetaUpdateTime: <Opt extends MetaUpdateTimeOptionsBase>(options: Opt, decoratorType?: MetaPropertyDecorator.MetaUpdateTime) => <T, K extends Extract<keyof T, string>>(target: T, propertyKey: K & (T[K] extends (Opt["optional"] extends true ? Date | undefined : Date) ? unknown : never)) => void;
15
+ export type MetaNumberOptionsBase = WithoutType<MetaNumberOptions>;
16
+ export declare const MetaNumber: <Opt extends MetaNumberOptionsBase>(options: Opt, decoratorType?: MetaPropertyDecorator.MetaNumber) => <T, K extends Extract<keyof T, string>>(target: T, propertyKey: K & (T[K] extends (Opt["optional"] extends true ? number | undefined : number) ? unknown : never)) => void;
17
+ export type MetaStringOptionsBase = WithoutType<MetaStringOptions>;
18
+ export declare const MetaString: <Opt extends MetaStringOptionsBase>(options: Opt, decoratorType?: MetaPropertyDecorator.MetaString) => <T, K extends Extract<keyof T, string>>(target: T, propertyKey: K & (T[K] extends (Opt["optional"] extends true ? string | undefined : string) ? unknown : never)) => void;
19
+ export type MetaArrayOptionsBase = WithoutType<MetaArrayOptions>;
20
+ export declare const MetaArray: <Opt extends MetaArrayOptionsBase>(options: Opt, decoratorType?: MetaPropertyDecorator.MetaArray) => <T, K extends Extract<keyof T, string>>(target: T, propertyKey: K & (T[K] extends (Opt["optional"] extends true ? unknown[] | undefined : unknown[]) ? unknown : never)) => void;
21
+ export type MetaObjectOptionsBase = WithoutType<MetaObjectOptions>;
22
+ export declare const MetaObject: <Opt extends MetaObjectOptionsBase>(options: Opt, decoratorType?: MetaPropertyDecorator.MetaObject) => <T, K extends Extract<keyof T, string>>(target: T, propertyKey: K & (T[K] extends (Opt["optional"] extends true ? object | undefined : object) ? unknown : never)) => void;
23
+ export type MetaDateOptionsBase = WithoutType<MetaDateOptions>;
24
+ export declare const MetaDate: <Opt extends MetaDateOptionsBase>(options: Opt, decoratorType?: MetaPropertyDecorator.MetaDate) => <T, K extends Extract<keyof T, string>>(target: T, propertyKey: K & (T[K] extends (Opt["optional"] extends true ? Date | undefined : Date) ? unknown : never)) => void;
25
+ export type MetaBooleanOptionsBase = WithoutType<MetaBooleanOptions>;
26
+ export declare const MetaBoolean: <Opt extends MetaBooleanOptionsBase>(options: Opt, decoratorType?: MetaPropertyDecorator.MetaBoolean) => <T, K extends Extract<keyof T, string>>(target: T, propertyKey: K & (T[K] extends (Opt["optional"] extends true ? boolean | undefined : boolean) ? unknown : never)) => void;
@@ -0,0 +1,17 @@
1
+ import { MetaHeadDecorator, MetaPropertyDecorator, } from "@mxpicture/gcp-functions-common/meta";
2
+ // after adding new decorator add it to MetaPropDecorator too
3
+ export const MetaInterface = (options, decoratorType = MetaHeadDecorator.MetaInterface) => (constructor) => {
4
+ return constructor;
5
+ };
6
+ export const MetaHeadInterface = (options, decoratorType = MetaHeadDecorator.MetaHeadInterface) => (constructor) => {
7
+ return constructor;
8
+ };
9
+ export const MetaKey = (options, decoratorType = MetaPropertyDecorator.MetaKey) => (target, propertyKey) => { };
10
+ export const MetaCreateTime = (options, decoratorType = MetaPropertyDecorator.MetaCreateTime) => (target, propertyKey) => { };
11
+ export const MetaUpdateTime = (options, decoratorType = MetaPropertyDecorator.MetaUpdateTime) => (target, propertyKey) => { };
12
+ export const MetaNumber = (options, decoratorType = MetaPropertyDecorator.MetaNumber) => (target, propertyKey) => { };
13
+ export const MetaString = (options, decoratorType = MetaPropertyDecorator.MetaString) => (target, propertyKey) => { };
14
+ export const MetaArray = (options, decoratorType = MetaPropertyDecorator.MetaArray) => (target, propertyKey) => { };
15
+ export const MetaObject = (options, decoratorType = MetaPropertyDecorator.MetaObject) => (target, propertyKey) => { };
16
+ export const MetaDate = (options, decoratorType = MetaPropertyDecorator.MetaDate) => (target, propertyKey) => { };
17
+ export const MetaBoolean = (options, decoratorType = MetaPropertyDecorator.MetaBoolean) => (target, propertyKey) => { };
@@ -0,0 +1,11 @@
1
+ import ts from "typescript";
2
+ import { MetaImport } from "@mxpicture/gcp-functions-common/types";
3
+ export interface ExtractedImport {
4
+ module: string;
5
+ defaultImport?: string;
6
+ namedImports?: string[];
7
+ namespaceImport?: string;
8
+ isTypeOnly?: boolean;
9
+ }
10
+ export declare const extractNamedImports: (sourceFile: ts.SourceFile | string) => MetaImport[];
11
+ export declare const extractImports: (sourceFile: ts.SourceFile) => ExtractedImport[];
@@ -0,0 +1,54 @@
1
+ import ts from "typescript";
2
+ import { createSourceFiles } from "@mxpicture/gcp-functions-code/common";
3
+ export const extractNamedImports = (sourceFile) => {
4
+ if (typeof sourceFile === "string") {
5
+ const files = createSourceFiles([sourceFile]);
6
+ if (files.length === 0)
7
+ return [];
8
+ sourceFile = files[0].sourceFile;
9
+ }
10
+ const results = [];
11
+ const imports = extractImports(sourceFile);
12
+ for (const imp of imports) {
13
+ if (!imp.namedImports || imp.namedImports.length === 0)
14
+ continue;
15
+ results.push({
16
+ path: imp.module,
17
+ props: [...imp.namedImports],
18
+ isType: imp.isTypeOnly,
19
+ });
20
+ }
21
+ return results;
22
+ };
23
+ export const extractImports = (sourceFile) => {
24
+ const imports = [];
25
+ sourceFile.forEachChild((node) => {
26
+ if (ts.isImportDeclaration(node) && node.moduleSpecifier) {
27
+ const moduleName = node.moduleSpecifier.text;
28
+ let defaultImport;
29
+ let namedImports = [];
30
+ let namespaceImport;
31
+ if (!node.importClause)
32
+ return;
33
+ if (node.importClause.name)
34
+ defaultImport = node.importClause.name.text;
35
+ const isTypeOnly = node.importClause.phaseModifier === ts.SyntaxKind.TypeKeyword;
36
+ if (node.importClause.namedBindings) {
37
+ if (ts.isNamedImports(node.importClause.namedBindings)) {
38
+ namedImports = node.importClause.namedBindings.elements.map((el) => el.name.text);
39
+ }
40
+ else if (ts.isNamespaceImport(node.importClause.namedBindings)) {
41
+ namespaceImport = node.importClause.namedBindings.name.text;
42
+ }
43
+ }
44
+ imports.push({
45
+ module: moduleName,
46
+ defaultImport,
47
+ namedImports: namedImports.length ? namedImports : undefined,
48
+ namespaceImport,
49
+ isTypeOnly,
50
+ });
51
+ }
52
+ });
53
+ return imports;
54
+ };
@@ -0,0 +1,13 @@
1
+ import { MetaFileType, MetaTargetType } from "@mxpicture/gcp-functions-common/meta";
2
+ import type { MetaNames } from "@mxpicture/gcp-functions-common/types";
3
+ export declare const metaRename: (name: string, type: MetaFileType | string) => string;
4
+ export declare const metaRenameAsync: (name: string, type: MetaFileType | string) => Promise<string>;
5
+ export declare const metaBasename: (name: string) => string;
6
+ export declare const metaBasenameAsync: (name: string) => Promise<string>;
7
+ export declare const isMetaNameType: (name: string, type: MetaFileType) => boolean;
8
+ export declare const metaNames: (basename: string, prefix?: string, apiType?: string, funcType?: string, targetType?: MetaTargetType) => MetaNames;
9
+ export declare const metaNamesAsync: (basename: string, prefix?: string, apiType?: string, funcType?: string, targetType?: MetaTargetType) => Promise<MetaNames>;
10
+ export declare const metaFrontendNames: (basename: string, prefix?: string) => MetaNames;
11
+ export declare const metaFrontendNamesAsync: (basename: string, prefix?: string) => Promise<MetaNames>;
12
+ export declare const metaBackendNames: (basename: string, prefix?: string) => MetaNames;
13
+ export declare const metaBackendNamesAsync: (basename: string, prefix?: string) => Promise<MetaNames>;
@@ -0,0 +1,93 @@
1
+ import { MetaFileType, MetaTargetType, } from "@mxpicture/gcp-functions-common/meta";
2
+ import { lowerFirstLetter, lowerFirstLetterAsync, upperFirstLetter, upperFirstLetterAsync, } from "@mxpicture/gcp-functions-code/common";
3
+ export const metaRename = (name, type) => `${metaBasename(name)}${upperFirstLetter(type)}`;
4
+ export const metaRenameAsync = async (name, type) => {
5
+ const [n, t] = await Promise.all([
6
+ metaBasenameAsync(name),
7
+ upperFirstLetterAsync(type),
8
+ ]);
9
+ return `${n}${t}`;
10
+ };
11
+ export const metaBasename = (name) => {
12
+ for (const type of Object.values(MetaFileType)) {
13
+ if (isMetaNameType(name, type))
14
+ return `${name.substring(0, name.length - type.length)}`;
15
+ }
16
+ return name.substring(0);
17
+ };
18
+ export const metaBasenameAsync = async (name) => Promise.resolve().then(() => metaBasename(name));
19
+ export const isMetaNameType = (name, type) => name.endsWith(upperFirstLetter(type));
20
+ export const metaNames = (basename, prefix, apiType, funcType, targetType) => {
21
+ const basenameLower = lowerFirstLetter(basename);
22
+ const basenameUpper = upperFirstLetter(basename);
23
+ return {
24
+ basename,
25
+ basenameLower,
26
+ basenameUpper,
27
+ targetType: targetType ?? MetaTargetType.common,
28
+ template: metaRename(basename, MetaFileType.template),
29
+ doc: metaRename(basename, MetaFileType.doc),
30
+ routes: metaRename(basename, MetaFileType.routes),
31
+ api: apiType ?? "",
32
+ func: funcType ?? "",
33
+ store: metaRename(basename, "store"),
34
+ shape: lowerFirstLetter(metaRename(basename, "shape")),
35
+ schema: lowerFirstLetter(metaRename(basename, "schema")),
36
+ annotations: lowerFirstLetter(metaRename(basename, "annotations")),
37
+ functionName: prefix
38
+ ? `${lowerFirstLetter(prefix)}${basenameUpper}`
39
+ : basenameLower,
40
+ };
41
+ };
42
+ // export const processMetaBasenames = async (
43
+ // names: string[],
44
+ // concurrency = 50,
45
+ // ): Promise<string[]> => {
46
+ // const pLimit = (await import("p-limit")).default;
47
+ // const limit = pLimit(concurrency);
48
+ // return Promise.all(
49
+ // names.map((name) => limit(async () => metaBasename(name))),
50
+ // );
51
+ // };
52
+ export const metaNamesAsync = async (basename, prefix, apiType, funcType, targetType) => {
53
+ const [basenameLower, basenameUpper, template, doc, routes, store, shapeRaw, schemaRaw, annotationsRaw, prefixLower, api, func,] = await Promise.all([
54
+ lowerFirstLetterAsync(basename),
55
+ upperFirstLetterAsync(basename),
56
+ metaRenameAsync(basename, MetaFileType.template),
57
+ metaRenameAsync(basename, MetaFileType.doc),
58
+ metaRenameAsync(basename, MetaFileType.routes),
59
+ metaRenameAsync(basename, "store"),
60
+ metaRenameAsync(basename, "shape"),
61
+ metaRenameAsync(basename, "schema"),
62
+ metaRenameAsync(basename, "annotations"),
63
+ Promise.resolve().then(async () => prefix ? lowerFirstLetterAsync(prefix) : null),
64
+ Promise.resolve().then(async () => apiType ? metaRenameAsync(basename, apiType) : ""),
65
+ Promise.resolve().then(async () => funcType ? metaRenameAsync(basename, funcType) : ""),
66
+ ]);
67
+ const [shape, schema, annotations, functionName] = await Promise.all([
68
+ lowerFirstLetterAsync(shapeRaw),
69
+ lowerFirstLetterAsync(schemaRaw),
70
+ lowerFirstLetterAsync(annotationsRaw),
71
+ Promise.resolve().then(() => prefixLower ? `${prefixLower}${basenameUpper}` : basenameLower),
72
+ ]);
73
+ return {
74
+ basename,
75
+ basenameLower,
76
+ basenameUpper,
77
+ targetType: targetType ?? MetaTargetType.common,
78
+ template,
79
+ doc,
80
+ routes,
81
+ api,
82
+ func,
83
+ store,
84
+ shape,
85
+ schema,
86
+ annotations,
87
+ functionName,
88
+ };
89
+ };
90
+ export const metaFrontendNames = (basename, prefix) => metaNames(basename, prefix, "feApi", "feFunction", MetaTargetType.frontend);
91
+ export const metaFrontendNamesAsync = async (basename, prefix) => metaNamesAsync(basename, prefix, "feApi", "feFunction", MetaTargetType.frontend);
92
+ export const metaBackendNames = (basename, prefix) => metaNames(basename, prefix, "beApi", "beFunction", MetaTargetType.backend);
93
+ export const metaBackendNamesAsync = async (basename, prefix) => metaNamesAsync(basename, prefix, "beApi", "beFunction", MetaTargetType.backend);
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@mxpicture/gcp-functions-generator",
3
+ "version": "0.2.0",
4
+ "description": "Tools for google cloud functions",
5
+ "type": "module",
6
+ "author": "MXPicture",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/MXPicture/npm-gcp-functions.git"
11
+ },
12
+ "exports": {
13
+ "./common": "./dist/common/index.js",
14
+ "./generator": "./dist/generator/index.js",
15
+ "./meta": "./dist/meta/index.js",
16
+ "./package.json": "./package.json"
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "engines": {
22
+ "node": ">=22"
23
+ },
24
+ "scripts": {
25
+ "clean": "rm -rf dist .tsbuildinfo tsconfig.tsbuildinfo node_modules",
26
+ "lint": "eslint \"src/**/*.{ts,tsx}\" --ext .ts,.tsx",
27
+ "build": "tsc -b .",
28
+ "test": "vitest run",
29
+ "test:clean": "rm -rf src/4testing/generator-test-*",
30
+ "run:test": "pnpm exec tsx src/scripts/test.mts"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "dependencies": {
36
+ "@mxpicture/gcp-functions-common": "^0.2.0",
37
+ "@mxpicture/gcp-functions-code": "^0.2.0",
38
+ "@mxpicture/gcp-functions-backend": "^0.2.0",
39
+ "@mxpicture/gcp-functions-frontend": "^0.2.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^25.2.0",
43
+ "eslint": "^9.39.2",
44
+ "execa": "^9.6.1",
45
+ "typescript": "^5.9.3",
46
+ "vitest": "^4.0.18"
47
+ }
48
+ }