@powerhousedao/vetra 4.1.0-dev.85 → 4.1.0-dev.86
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/dist/processors/codegen/__tests__/codegen-processor-e2e.test.js +37 -0
- package/dist/processors/codegen/document-handlers/document-codegen-manager.d.ts.map +1 -1
- package/dist/processors/codegen/document-handlers/document-codegen-manager.js +5 -3
- package/dist/processors/codegen/document-handlers/generators/app-generator.js +2 -2
- package/dist/processors/codegen/document-handlers/generators/document-editor-generator.js +2 -2
- package/dist/processors/codegen/document-handlers/generators/document-model-generator.js +4 -4
- package/dist/processors/codegen/document-handlers/generators/subgraph-generator.js +2 -2
- package/dist/processors/codegen/logger.js +4 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -14
|
@@ -611,5 +611,42 @@ describe("CodegenProcessor E2E Tests", () => {
|
|
|
611
611
|
expect(generateEditor).not.toHaveBeenCalled();
|
|
612
612
|
expect(generateManifest).not.toHaveBeenCalled();
|
|
613
613
|
});
|
|
614
|
+
it("should debounce generate calls for same strand", async () => {
|
|
615
|
+
const { generateManifest } = await import("@powerhousedao/codegen");
|
|
616
|
+
const firstState = {
|
|
617
|
+
name: "Test Package",
|
|
618
|
+
category: "utility",
|
|
619
|
+
description: "A test package",
|
|
620
|
+
author: {
|
|
621
|
+
name: "Test Author",
|
|
622
|
+
website: "https://example.com",
|
|
623
|
+
},
|
|
624
|
+
};
|
|
625
|
+
const secondState = {
|
|
626
|
+
...firstState,
|
|
627
|
+
name: "Test Package 2",
|
|
628
|
+
};
|
|
629
|
+
const firstStrand = {
|
|
630
|
+
documentId: "test-doc-1",
|
|
631
|
+
documentType: "powerhouse/package",
|
|
632
|
+
state: firstState,
|
|
633
|
+
};
|
|
634
|
+
const secondStrand = {
|
|
635
|
+
...firstStrand,
|
|
636
|
+
state: secondState,
|
|
637
|
+
};
|
|
638
|
+
await processor.onStrands([firstStrand]);
|
|
639
|
+
await processor.onStrands([secondStrand]);
|
|
640
|
+
await vi.runAllTimersAsync();
|
|
641
|
+
expect(generateManifest).toHaveBeenCalledExactlyOnceWith({
|
|
642
|
+
name: "Test Package 2",
|
|
643
|
+
category: "utility",
|
|
644
|
+
description: "A test package",
|
|
645
|
+
publisher: {
|
|
646
|
+
name: "Test Author",
|
|
647
|
+
url: "https://example.com",
|
|
648
|
+
},
|
|
649
|
+
}, mockConfig.CURRENT_WORKING_DIR);
|
|
650
|
+
});
|
|
614
651
|
});
|
|
615
652
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-codegen-manager.d.ts","sourceRoot":"","sources":["../../../../processors/codegen/document-handlers/document-codegen-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAIhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIzC;;;GAGG;AACH,qBAAa,sBAAsB;IAO/B,OAAO,CAAC,MAAM;IANhB,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,kBAAkB,CAAqB;gBAGrC,MAAM,EAAE,MAAM,EACtB,eAAe,UAAQ;IAKzB;;OAEG;IACH,iBAAiB,CACf,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,KAAK,eAAe,GACtD,IAAI;IAWP;;OAEG;IACH,0BAA0B,CACxB,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,KAAK,eAAe,GACtD,IAAI;IAkBP;;;OAGG;IACI,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAItE;;OAEG;IACH,0BAA0B,IAAI,MAAM,EAAE;IAItC;;OAEG;IACH,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAItD;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"document-codegen-manager.d.ts","sourceRoot":"","sources":["../../../../processors/codegen/document-handlers/document-codegen-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAIhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIzC;;;GAGG;AACH,qBAAa,sBAAsB;IAO/B,OAAO,CAAC,MAAM;IANhB,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,kBAAkB,CAAqB;gBAGrC,MAAM,EAAE,MAAM,EACtB,eAAe,UAAQ;IAKzB;;OAEG;IACH,iBAAiB,CACf,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,KAAK,eAAe,GACtD,IAAI;IAWP;;OAEG;IACH,0BAA0B,CACxB,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,KAAK,eAAe,GACtD,IAAI;IAkBP;;;OAGG;IACI,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAItE;;OAEG;IACH,0BAA0B,IAAI,MAAM,EAAE;IAItC;;OAEG;IACH,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAItD;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsGxE;;OAEG;YACW,oBAAoB;IA8BlC;;OAEG;YACW,aAAa;IA0B3B;;OAEG;IACH,eAAe,IAAI,IAAI;IAKvB;;OAEG;IACH,QAAQ,IAAI;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,EAAE,CAAA;KAAE;IAOjE;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACH,uBAAuB,IAAI,OAAO;CAGnC"}
|
|
@@ -37,7 +37,7 @@ export class DocumentCodegenManager {
|
|
|
37
37
|
}
|
|
38
38
|
this.generators.set(documentType, generator);
|
|
39
39
|
}
|
|
40
|
-
logger.
|
|
40
|
+
logger.debug(`✅ Registered multi-type generator for document types: ${supportedTypes.join(", ")}`);
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
43
|
* Get a generator instance for the given document type
|
|
@@ -91,6 +91,7 @@ export class DocumentCodegenManager {
|
|
|
91
91
|
clearTimeout(existingTimer);
|
|
92
92
|
}
|
|
93
93
|
// Set up debounce timer for batch interactive processing
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
94
95
|
const debounceTimer = setTimeout(async () => {
|
|
95
96
|
try {
|
|
96
97
|
await this.interactiveManager.processQueueWithConfirmation(async (queuedStrands) => {
|
|
@@ -118,12 +119,13 @@ export class DocumentCodegenManager {
|
|
|
118
119
|
clearTimeout(existingTimer);
|
|
119
120
|
}
|
|
120
121
|
// Set up new debounced generation (no interactive confirmation)
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
121
123
|
const debounceTimer = setTimeout(async () => {
|
|
122
124
|
try {
|
|
123
125
|
logger.debug(`🔄 Routing document type "${documentType}" to generator (debounced)`);
|
|
124
126
|
// Direct generation, no interactive confirmation
|
|
125
127
|
await generator.generate(strand);
|
|
126
|
-
logger.
|
|
128
|
+
logger.debug(`✅ Successfully generated code for document type: ${documentType}`);
|
|
127
129
|
}
|
|
128
130
|
catch (error) {
|
|
129
131
|
logger.error(`❌ Error generating code for document type "${documentType}":`, error);
|
|
@@ -169,7 +171,7 @@ export class DocumentCodegenManager {
|
|
|
169
171
|
try {
|
|
170
172
|
logger.debug(`🔄 Generating code for document type: ${documentType}`);
|
|
171
173
|
await generator.generate(strand);
|
|
172
|
-
logger.
|
|
174
|
+
logger.debug(`✅ Successfully generated code for document type: ${documentType}`);
|
|
173
175
|
}
|
|
174
176
|
catch (error) {
|
|
175
177
|
logger.error(`❌ Error generating code for document type "${documentType}":`, error);
|
|
@@ -50,7 +50,7 @@ export class AppGenerator extends BaseDocumentGen {
|
|
|
50
50
|
logger.info(`✅ Drive editor generation completed successfully for app: ${state.name}`);
|
|
51
51
|
// Update the manifest with the new app
|
|
52
52
|
try {
|
|
53
|
-
logger.
|
|
53
|
+
logger.debug(`🔄 Updating manifest with app: ${state.name} (ID: ${appId})`);
|
|
54
54
|
generateManifest({
|
|
55
55
|
apps: [
|
|
56
56
|
{
|
|
@@ -60,7 +60,7 @@ export class AppGenerator extends BaseDocumentGen {
|
|
|
60
60
|
},
|
|
61
61
|
],
|
|
62
62
|
}, this.config.CURRENT_WORKING_DIR);
|
|
63
|
-
logger.
|
|
63
|
+
logger.debug(`✅ Manifest updated successfully for app: ${state.name}`);
|
|
64
64
|
}
|
|
65
65
|
catch (manifestError) {
|
|
66
66
|
logger.error(`⚠️ Failed to update manifest for app ${state.name}:`, manifestError);
|
|
@@ -49,7 +49,7 @@ export class DocumentEditorGenerator extends BaseDocumentGen {
|
|
|
49
49
|
logger.info(`✅ Editor generation completed successfully for: ${state.name}`);
|
|
50
50
|
// Update the manifest with the new editor
|
|
51
51
|
try {
|
|
52
|
-
logger.
|
|
52
|
+
logger.debug(`🔄 Updating manifest with editor: ${state.name} (ID: ${editorId})`);
|
|
53
53
|
generateManifest({
|
|
54
54
|
editors: [
|
|
55
55
|
{
|
|
@@ -59,7 +59,7 @@ export class DocumentEditorGenerator extends BaseDocumentGen {
|
|
|
59
59
|
},
|
|
60
60
|
],
|
|
61
61
|
}, this.config.CURRENT_WORKING_DIR);
|
|
62
|
-
logger.
|
|
62
|
+
logger.debug(`✅ Manifest updated successfully for editor: ${state.name}`);
|
|
63
63
|
}
|
|
64
64
|
catch (manifestError) {
|
|
65
65
|
logger.error(`⚠️ Failed to update manifest for editor ${state.name}:`, manifestError);
|
|
@@ -25,7 +25,7 @@ export class DocumentModelGenerator extends BaseDocumentGen {
|
|
|
25
25
|
const errorList = validationResult.errors
|
|
26
26
|
.map((error) => ` - ${error}`)
|
|
27
27
|
.join("\n");
|
|
28
|
-
logger.info(`⚠️
|
|
28
|
+
logger.info(`⚠️ Skipped code generation for '${state.name || strand.documentId}' due to validation errors:\n${errorList}`);
|
|
29
29
|
return false;
|
|
30
30
|
}
|
|
31
31
|
return true;
|
|
@@ -33,7 +33,7 @@ export class DocumentModelGenerator extends BaseDocumentGen {
|
|
|
33
33
|
async generate(strand) {
|
|
34
34
|
const state = strand.state;
|
|
35
35
|
// Validation is already done in shouldProcess, so we can proceed directly
|
|
36
|
-
logger.
|
|
36
|
+
logger.debug(`🔄 Starting code generation for document model: ${state.name}`);
|
|
37
37
|
try {
|
|
38
38
|
await generateFromDocument(state, this.config.PH_CONFIG, {
|
|
39
39
|
verbose: false,
|
|
@@ -42,7 +42,7 @@ export class DocumentModelGenerator extends BaseDocumentGen {
|
|
|
42
42
|
logger.info(`✅ Code generation completed successfully for: ${state.name}`);
|
|
43
43
|
// Update the manifest with the new document model
|
|
44
44
|
try {
|
|
45
|
-
logger.
|
|
45
|
+
logger.debug(`🔄 Updating manifest with document model: ${state.name} (ID: ${state.id})`);
|
|
46
46
|
generateManifest({
|
|
47
47
|
documentModels: [
|
|
48
48
|
{
|
|
@@ -51,7 +51,7 @@ export class DocumentModelGenerator extends BaseDocumentGen {
|
|
|
51
51
|
},
|
|
52
52
|
],
|
|
53
53
|
}, this.config.CURRENT_WORKING_DIR);
|
|
54
|
-
logger.
|
|
54
|
+
logger.debug(`✅ Manifest updated successfully for document model: ${state.name}`);
|
|
55
55
|
}
|
|
56
56
|
catch (manifestError) {
|
|
57
57
|
logger.error(`⚠️ Failed to update manifest for document model ${state.name}:`, manifestError);
|
|
@@ -43,7 +43,7 @@ export class SubgraphGenerator extends BaseDocumentGen {
|
|
|
43
43
|
logger.info(`✅ Subgraph generation completed successfully for: ${state.name}`);
|
|
44
44
|
// Update the manifest with the new subgraph
|
|
45
45
|
try {
|
|
46
|
-
logger.
|
|
46
|
+
logger.debug(`🔄 Updating manifest with subgraph: ${state.name} (ID: ${subgraphId})`);
|
|
47
47
|
generateManifest({
|
|
48
48
|
subgraphs: [
|
|
49
49
|
{
|
|
@@ -53,7 +53,7 @@ export class SubgraphGenerator extends BaseDocumentGen {
|
|
|
53
53
|
},
|
|
54
54
|
],
|
|
55
55
|
}, this.config.CURRENT_WORKING_DIR);
|
|
56
|
-
logger.
|
|
56
|
+
logger.debug(`✅ Manifest updated successfully for subgraph: ${state.name}`);
|
|
57
57
|
}
|
|
58
58
|
catch (manifestError) {
|
|
59
59
|
logger.error(`⚠️ Failed to update manifest for subgraph ${state.name}:`, manifestError);
|
|
@@ -3,8 +3,8 @@ import { childLogger } from "document-drive";
|
|
|
3
3
|
// Create empty childLogger and manually prepend colored tag
|
|
4
4
|
const baseLogger = childLogger([]); // No automatic tags
|
|
5
5
|
export const logger = {
|
|
6
|
-
debug: (...args) => baseLogger.debug(cyan("[
|
|
7
|
-
info: (...args) => baseLogger.info(cyan("[
|
|
8
|
-
warn: (...args) => baseLogger.warn(cyan("[
|
|
9
|
-
error: (...args) => baseLogger.error(cyan("[
|
|
6
|
+
debug: (...args) => baseLogger.debug(cyan("[Vetra]"), ...args.map((arg) => typeof arg === "string" ? cyan(arg) : arg)),
|
|
7
|
+
info: (...args) => baseLogger.info(cyan("[Vetra]"), ...args.map((arg) => typeof arg === "string" ? cyan(arg) : arg)),
|
|
8
|
+
warn: (...args) => baseLogger.warn(cyan("[Vetra]"), ...args.map((arg) => typeof arg === "string" ? cyan(arg) : arg)),
|
|
9
|
+
error: (...args) => baseLogger.error(cyan("[Vetra]"), ...args.map((arg) => typeof arg === "string" ? cyan(arg) : arg)),
|
|
10
10
|
};
|