@powerhousedao/codegen 6.0.0-dev.34 → 6.0.0-dev.36
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/src/codegen/__tests__/generate-doc-model.test.js +170 -164
- package/dist/src/codegen/__tests__/generate-doc-model.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/vitest.config.d.ts.map +1 -1
- package/dist/vitest.config.js +1 -0
- package/dist/vitest.config.js.map +1 -1
- package/package.json +12 -9
- package/dist/src/codegen/__tests__/generate-versioned-document-model.test.d.ts +0 -2
- package/dist/src/codegen/__tests__/generate-versioned-document-model.test.d.ts.map +0 -1
- package/dist/src/codegen/__tests__/generate-versioned-document-model.test.js +0 -159
- package/dist/src/codegen/__tests__/generate-versioned-document-model.test.js.map +0 -1
|
@@ -1,179 +1,185 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { $ } from "bun";
|
|
2
|
+
import { describe, expect, test } from "bun:test";
|
|
3
|
+
import { cp, readdir } from "node:fs/promises";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { Project, ts } from "ts-morph";
|
|
3
6
|
import { generateDocumentModel } from "../generate.js";
|
|
4
7
|
import { loadDocumentModel } from "../utils.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
testOutDirPath = getTestOutDirPath(context.task.name, outDirName);
|
|
20
|
-
await copyAllFiles(dataDir, testOutDirPath);
|
|
21
|
-
documentModelsDirName = path.join(testOutDirPath, "document-models");
|
|
22
|
-
process.chdir(testOutDirPath);
|
|
23
|
-
}
|
|
24
|
-
beforeEach(async (context) => {
|
|
25
|
-
await setupTest(context);
|
|
26
|
-
});
|
|
27
|
-
beforeAll(async () => {
|
|
28
|
-
await resetDirForTest(outDirName);
|
|
29
|
-
});
|
|
30
|
-
afterAll(async () => {
|
|
31
|
-
await purgeDirAfterTest(outDirName);
|
|
32
|
-
});
|
|
33
|
-
const generate = async () => {
|
|
34
|
-
const billingStatementDocumentModel = await loadDocumentModel(path.join(documentModelsSrcPath, "billing-statement", "billing-statement.json"));
|
|
8
|
+
const testsDir = import.meta.dirname;
|
|
9
|
+
const testOutputDir = path.join(testsDir, ".test-output");
|
|
10
|
+
function getDocumentModelJsonFilePath(basePath, dirName) {
|
|
11
|
+
return path.join(basePath, dirName, `${dirName}.json`);
|
|
12
|
+
}
|
|
13
|
+
async function loadDocumentModelsInDir(documentModelsInDir, testOutDir, useVersioning = true) {
|
|
14
|
+
const documentModelsOutDir = path.join(testOutDir, "document-models");
|
|
15
|
+
const documentModelDirs = (await readdir(documentModelsInDir, {
|
|
16
|
+
withFileTypes: true,
|
|
17
|
+
}))
|
|
18
|
+
.filter((value) => value.isDirectory())
|
|
19
|
+
.map((value) => value.name);
|
|
20
|
+
const documentModelStates = await Promise.all(documentModelDirs.map(async (dirName) => await loadDocumentModel(getDocumentModelJsonFilePath(documentModelsInDir, dirName))));
|
|
21
|
+
for (const documentModelState of documentModelStates) {
|
|
35
22
|
await generateDocumentModel({
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
skipFormat: true,
|
|
23
|
+
documentModelState,
|
|
24
|
+
dir: documentModelsOutDir,
|
|
25
|
+
useTsMorph: true,
|
|
26
|
+
useVersioning,
|
|
27
|
+
specifiedPackageName: "test",
|
|
42
28
|
});
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
it("should generate a document model", {
|
|
54
|
-
timeout: 100000,
|
|
55
|
-
}, async (context) => {
|
|
56
|
-
await setupTest(context);
|
|
57
|
-
await generate();
|
|
58
|
-
await compile(testOutDirPath);
|
|
59
|
-
await runGeneratedTests(testOutDirPath);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function runDocumentModelTests(args) {
|
|
32
|
+
const { inDirName, specDirName, testsDataDir, testOutputParentDir, useVersioning = true, } = args;
|
|
33
|
+
const dataDir = path.join(testsDataDir, inDirName);
|
|
34
|
+
const documentModelsInDir = path.join(testsDataDir, specDirName);
|
|
35
|
+
const outDir = path.join(testOutputParentDir, `${inDirName}-${specDirName}`);
|
|
36
|
+
await cp(dataDir, outDir, {
|
|
37
|
+
recursive: true,
|
|
38
|
+
force: true,
|
|
60
39
|
});
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
40
|
+
await loadDocumentModelsInDir(documentModelsInDir, outDir, useVersioning);
|
|
41
|
+
await $ `bun run --cwd ${outDir} tsc`;
|
|
42
|
+
await $ `bun run --cwd ${outDir} vitest --run --silent passed-only`;
|
|
43
|
+
return outDir;
|
|
44
|
+
}
|
|
45
|
+
async function checkFileContents(outDir) {
|
|
46
|
+
const project = new Project({
|
|
47
|
+
tsConfigFilePath: path.join(outDir, "tsconfig.json"),
|
|
48
|
+
skipAddingFilesFromTsConfig: true,
|
|
49
|
+
skipFileDependencyResolution: true,
|
|
50
|
+
skipLoadingLibFiles: true,
|
|
69
51
|
});
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
52
|
+
project.addSourceFilesAtPaths(path.join(outDir, "document-models/**/*"));
|
|
53
|
+
const documentModelsFile = project.getSourceFileOrThrow("document-models.ts");
|
|
54
|
+
const documentModelsArray = documentModelsFile
|
|
55
|
+
.getVariableStatementOrThrow("documentModels")
|
|
56
|
+
.getDescendantsOfKind(ts.SyntaxKind.ArrayLiteralExpression)
|
|
57
|
+
.at(0);
|
|
58
|
+
const elements = documentModelsArray
|
|
59
|
+
.getElements()
|
|
60
|
+
.map((e) => e.getText())
|
|
61
|
+
.join(" ");
|
|
62
|
+
expect(elements).toContain("BillingStatement");
|
|
63
|
+
expect(elements).toContain("TestDoc");
|
|
64
|
+
const billingStatementErrorFile = await Bun.file(path.join(outDir, "document-models", "billing-statement", "gen", "general", "error.ts")).text();
|
|
65
|
+
expect(billingStatementErrorFile).toContain("export type ErrorCode");
|
|
66
|
+
expect(billingStatementErrorFile).toContain(`"InvalidStatusTransition"`);
|
|
67
|
+
expect(billingStatementErrorFile).toContain("export class InvalidStatusTransition extends Error implements ReducerError");
|
|
68
|
+
expect(billingStatementErrorFile).toContain(`errorCode = "InvalidStatusTransition" as ErrorCode`);
|
|
69
|
+
const lineItemsErrorFile = await Bun.file(path.join(outDir, "document-models", "billing-statement", "gen", "line-items", "error.ts")).text();
|
|
70
|
+
expect(lineItemsErrorFile).toContain("export type ErrorCode =");
|
|
71
|
+
expect(lineItemsErrorFile).toContain(`"DuplicateLineItem"`);
|
|
72
|
+
expect(lineItemsErrorFile).toContain(`"InvalidStatusTransition"`);
|
|
73
|
+
expect(lineItemsErrorFile).toContain("export class DuplicateLineItem extends Error implements ReducerError");
|
|
74
|
+
expect(lineItemsErrorFile).toContain("export class InvalidStatusTransition extends Error implements ReducerError");
|
|
75
|
+
const errorCodeMatches = lineItemsErrorFile.match(/"InvalidStatusTransition"/g);
|
|
76
|
+
expect(errorCodeMatches?.length).toBe(3);
|
|
77
|
+
}
|
|
78
|
+
describe("generate doc model", () => {
|
|
79
|
+
const parentOutDirName = "generate-doc-model";
|
|
80
|
+
const testOutputParentDir = path.join(testOutputDir, parentOutDirName);
|
|
81
|
+
const testsDataDir = path.join(testsDir, "data");
|
|
82
|
+
const useVersioning = false;
|
|
83
|
+
test("generate document models", async () => {
|
|
84
|
+
const outDir = await runDocumentModelTests({
|
|
85
|
+
inDirName: "document-models-test-project",
|
|
86
|
+
specDirName: "document-models",
|
|
87
|
+
testOutputParentDir,
|
|
88
|
+
testsDataDir,
|
|
89
|
+
useVersioning,
|
|
90
|
+
});
|
|
91
|
+
await checkFileContents(outDir);
|
|
86
92
|
});
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
expect(documentModelsContent).toContain(`import { BillingStatement } from "./billing-statement/module.js";`);
|
|
97
|
-
expect(documentModelsContent).toContain(`import { TestDoc } from "./test-doc/module.js";`);
|
|
98
|
-
expect(documentModelsContent).toContain("export const documentModels: DocumentModelModule<any>[] = [");
|
|
99
|
-
expect(documentModelsContent).toContain("BillingStatement");
|
|
100
|
-
expect(documentModelsContent).toContain("TestDoc");
|
|
101
|
-
expect(documentModelsContent).toContain("]");
|
|
93
|
+
test("generate document models in existing project", async () => {
|
|
94
|
+
const outDir = await runDocumentModelTests({
|
|
95
|
+
inDirName: "document-models-test-project-with-existing-document-models",
|
|
96
|
+
specDirName: "document-models",
|
|
97
|
+
testOutputParentDir,
|
|
98
|
+
testsDataDir,
|
|
99
|
+
useVersioning,
|
|
100
|
+
});
|
|
101
|
+
await checkFileContents(outDir);
|
|
102
102
|
});
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
103
|
+
});
|
|
104
|
+
describe("versioned document models", () => {
|
|
105
|
+
const parentOutDirName = "versioned-document-models";
|
|
106
|
+
const testOutputParentDir = path.join(testOutputDir, parentOutDirName);
|
|
107
|
+
const testsDataDir = path.join(testsDir, "data", "versioned-document-models");
|
|
108
|
+
describe("v1", () => {
|
|
109
|
+
test("should generate new document models as v1", async () => {
|
|
110
|
+
await runDocumentModelTests({
|
|
111
|
+
inDirName: "empty-project",
|
|
112
|
+
specDirName: "spec-version-1",
|
|
113
|
+
testOutputParentDir,
|
|
114
|
+
testsDataDir,
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
test("should persist existing reducers, tests, utils, and custom files when generating for the same spec version", async () => {
|
|
118
|
+
await runDocumentModelTests({
|
|
119
|
+
inDirName: "project-with-existing-document-models-at-spec-1",
|
|
120
|
+
specDirName: "spec-version-1-with-more-operations",
|
|
121
|
+
testOutputParentDir,
|
|
122
|
+
testsDataDir,
|
|
123
|
+
});
|
|
118
124
|
});
|
|
119
|
-
// expect .out/document-model/test-doc/src/reducers/base-operations.ts to contain setTestIdOperation, setTestNameOperation, setTestDescriptionOperation and setTestValueOperation
|
|
120
|
-
const baseOperationsPath = path.join(documentModelsDirName, "test-doc", "src", "reducers", "base-operations.ts");
|
|
121
|
-
const baseOperationsContent = await readFile(baseOperationsPath, "utf-8");
|
|
122
|
-
expect(baseOperationsContent).toContain("setTestIdOperation");
|
|
123
|
-
expect(baseOperationsContent).toContain("setTestNameOperation");
|
|
124
|
-
expect(baseOperationsContent).toContain("setTestDescriptionOperation");
|
|
125
|
-
expect(baseOperationsContent).toContain("setTestValueOperation");
|
|
126
125
|
});
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
126
|
+
describe("v2", () => {
|
|
127
|
+
test("should handle generating document models as v2", async () => {
|
|
128
|
+
const testOutDir = await runDocumentModelTests({
|
|
129
|
+
inDirName: "empty-project",
|
|
130
|
+
specDirName: "spec-version-2",
|
|
131
|
+
testOutputParentDir,
|
|
132
|
+
testsDataDir,
|
|
133
|
+
});
|
|
134
|
+
const v1ModulePath = path.join(testOutDir, "document-models", "test-doc", "v1", "module.ts");
|
|
135
|
+
const v2ModulePath = path.join(testOutDir, "document-models", "test-doc", "v2", "module.ts");
|
|
136
|
+
const v1ModuleContent = await Bun.file(v1ModulePath).text();
|
|
137
|
+
const v2ModuleContent = await Bun.file(v2ModulePath).text();
|
|
138
|
+
expect(v1ModuleContent).toContain("version: 1,");
|
|
139
|
+
expect(v2ModuleContent).toContain("version: 2,");
|
|
140
|
+
});
|
|
141
|
+
test("should persist existing reducers, tests, utils, and custom files when generating a new spec version", async () => {
|
|
142
|
+
await runDocumentModelTests({
|
|
143
|
+
inDirName: "project-with-existing-document-models-at-spec-1",
|
|
144
|
+
specDirName: "spec-version-2",
|
|
145
|
+
testOutputParentDir,
|
|
146
|
+
testsDataDir,
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
test("should throw a typescript error in upgrades when new state does not match old state", () => {
|
|
150
|
+
expect(async () => await runDocumentModelTests({
|
|
151
|
+
inDirName: "project-with-existing-document-models-at-spec-1",
|
|
152
|
+
specDirName: "spec-version-2-with-state-changes",
|
|
153
|
+
testOutputParentDir,
|
|
154
|
+
testsDataDir,
|
|
155
|
+
})).toThrow();
|
|
156
|
+
});
|
|
151
157
|
});
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
158
|
+
describe("v3", () => {
|
|
159
|
+
test("should handle generating document models as v3", async () => {
|
|
160
|
+
await runDocumentModelTests({
|
|
161
|
+
inDirName: "empty-project",
|
|
162
|
+
specDirName: "spec-version-3",
|
|
163
|
+
testOutputParentDir,
|
|
164
|
+
testsDataDir,
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
test("should persist existing reducers, tests, utils, and custom files when generating a new spec version", async () => {
|
|
168
|
+
await runDocumentModelTests({
|
|
169
|
+
inDirName: "project-with-existing-document-models-at-spec-2",
|
|
170
|
+
specDirName: "spec-version-3",
|
|
171
|
+
testOutputParentDir,
|
|
172
|
+
testsDataDir,
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
test("should throw a typescript error in upgrades when new state does not match old state", () => {
|
|
176
|
+
expect(async () => await runDocumentModelTests({
|
|
177
|
+
inDirName: "project-with-existing-document-models-at-spec-2",
|
|
178
|
+
specDirName: "spec-version-3-with-state-changes",
|
|
179
|
+
testOutputParentDir,
|
|
180
|
+
testsDataDir,
|
|
181
|
+
})).toThrow();
|
|
163
182
|
});
|
|
164
|
-
// Check that error codes are generated from error names
|
|
165
|
-
const testOperationsErrorPath = path.join(documentModelsDirName, "test-empty-codes", "gen", "test-operations", "error.ts");
|
|
166
|
-
const testOperationsErrorContent = await readFile(testOperationsErrorPath, "utf-8");
|
|
167
|
-
// Check that error codes are generated from names in PascalCase when empty
|
|
168
|
-
expect(testOperationsErrorContent).toContain("export type ErrorCode =");
|
|
169
|
-
expect(testOperationsErrorContent).toContain(`"InvalidValue"`);
|
|
170
|
-
expect(testOperationsErrorContent).toContain(`"EmptyValue"`);
|
|
171
|
-
// Check that error classes are generated
|
|
172
|
-
expect(testOperationsErrorContent).toContain("export class InvalidValue extends Error implements ReducerError");
|
|
173
|
-
expect(testOperationsErrorContent).toContain("export class EmptyValue extends Error implements ReducerError");
|
|
174
|
-
// Verify error code constants are set properly in PascalCase
|
|
175
|
-
expect(testOperationsErrorContent).toContain(`errorCode = "InvalidValue" as ErrorCode`);
|
|
176
|
-
expect(testOperationsErrorContent).toContain(`errorCode = "EmptyValue" as ErrorCode`);
|
|
177
183
|
});
|
|
178
184
|
});
|
|
179
185
|
//# sourceMappingURL=generate-doc-model.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-doc-model.test.js","sourceRoot":"","sources":["../../../../src/codegen/__tests__/generate-doc-model.test.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"generate-doc-model.test.js","sourceRoot":"","sources":["../../../../src/codegen/__tests__/generate-doc-model.test.ts"],"names":[],"mappings":"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"}
|