@postxl/generators 1.11.3 → 1.11.4
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/backend-import/generators/detect-delta/detect-delta-functions.generator.js +15 -2
- package/dist/backend-import/generators/detect-delta/detect-delta-functions.generator.js.map +1 -1
- package/dist/decoders/datamodel-decoder.generator.js +80 -1
- package/dist/decoders/datamodel-decoder.generator.js.map +1 -1
- package/dist/decoders/discriminated-union.decoder.generator.js +76 -9
- package/dist/decoders/discriminated-union.decoder.generator.js.map +1 -1
- package/dist/decoders/model-decoder.generator.js +120 -17
- package/dist/decoders/model-decoder.generator.js.map +1 -1
- package/dist/e2e/generators/docker-sh.generator.js +13 -5
- package/dist/e2e/generators/docker-sh.generator.js.map +1 -1
- package/dist/frontend-core/template/src/pages/dashboard/dashboard.page.tsx +1 -1
- package/package.json +2 -2
|
@@ -310,6 +310,8 @@ export function ${detectDelta._utils.validation.requiredFields.name}<
|
|
|
310
310
|
|
|
311
311
|
/**
|
|
312
312
|
* Validates that the field is a reference to an existing item.
|
|
313
|
+
* If the value is a key (not an ID), it resolves the key to the actual ID and updates the item.
|
|
314
|
+
* This allows importing Excel data where relation fields contain human-readable keys instead of UUIDs.
|
|
313
315
|
*/
|
|
314
316
|
export async function ${detectDelta._utils.validation.referenceField.name}<
|
|
315
317
|
Model extends ${dto.genericModel.name}<ID>,
|
|
@@ -328,16 +330,27 @@ export async function ${detectDelta._utils.validation.referenceField.name}<
|
|
|
328
330
|
item: Partial<Model>
|
|
329
331
|
fieldName: FieldName
|
|
330
332
|
relatedModel: RelatedModelName
|
|
331
|
-
|
|
333
|
+
/**
|
|
334
|
+
* Function to get an existing item by ID or key.
|
|
335
|
+
* Should try ID lookup first, then key lookup.
|
|
336
|
+
* Returns the item if found, null otherwise.
|
|
337
|
+
*/
|
|
338
|
+
getExistingItem: (idOrKey: RelatedID) => Promise<RelatedModel | null>
|
|
332
339
|
}): Promise<${errors.invalidReference.type.name}<RelatedModelName, FieldName, Value> | undefined> {
|
|
333
340
|
const value: Value | undefined | null = item[fieldName] as Value | undefined | null
|
|
334
|
-
if (value === undefined || value === null) {
|
|
341
|
+
if (value === undefined || value === null) {
|
|
335
342
|
return undefined
|
|
336
343
|
}
|
|
337
344
|
const existingItem = await getExistingItem(value)
|
|
338
345
|
if (!existingItem) {
|
|
339
346
|
return { error: '${errors.invalidReference.discriminant}', relatedModel, fieldName, value }
|
|
340
347
|
}
|
|
348
|
+
// If the existing item was found and its ID differs from the provided value,
|
|
349
|
+
// it means the value was a key (not an ID). Replace the key with the actual ID.
|
|
350
|
+
// This ensures the item has the correct ID for database operations.
|
|
351
|
+
if (existingItem.id !== value) {
|
|
352
|
+
(item as Record<string, unknown>)[fieldName] = existingItem.id
|
|
353
|
+
}
|
|
341
354
|
return undefined
|
|
342
355
|
}
|
|
343
356
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-delta-functions.generator.js","sourceRoot":"","sources":["../../../../src/backend-import/generators/detect-delta/detect-delta-functions.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,
|
|
1
|
+
{"version":3,"file":"detect-delta-functions.generator.js","sourceRoot":"","sources":["../../../../src/backend-import/generators/detect-delta/detect-delta-functions.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,41 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.generateDataModelDecoder = generateDataModelDecoder;
|
|
37
37
|
const Generator = __importStar(require("@postxl/generator"));
|
|
38
|
+
/**
|
|
39
|
+
* Checks if a discriminated union has any relation fields (in common fields or any member).
|
|
40
|
+
*/
|
|
41
|
+
function discriminatedUnionHasRelationFields(field) {
|
|
42
|
+
// Check common fields
|
|
43
|
+
for (const f of field.commonFields.values()) {
|
|
44
|
+
if (f.kind === 'relation') {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Check member fields
|
|
49
|
+
for (const member of field.members.values()) {
|
|
50
|
+
for (const f of member.fields.values()) {
|
|
51
|
+
if (f.kind === 'relation') {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Checks if a model needs lookup maps for Excel encoding.
|
|
60
|
+
* This is true if the model has direct relation fields OR discriminated unions with relation fields.
|
|
61
|
+
*/
|
|
62
|
+
function modelNeedsLookupMaps(model) {
|
|
63
|
+
for (const field of model.fields.values()) {
|
|
64
|
+
if (field.kind === 'relation') {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
if (field.kind === 'discriminatedUnion' && discriminatedUnionHasRelationFields(field)) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
38
73
|
/**
|
|
39
74
|
* Generates the data decoder, aggregating all the models.
|
|
40
75
|
*/
|
|
@@ -49,23 +84,40 @@ function generateDataModelDecoder({ context: { decoders, models } }) {
|
|
|
49
84
|
const encoderExcelEntries = [];
|
|
50
85
|
const decoderExcelEntries = [];
|
|
51
86
|
const transformerExcelEntries = [];
|
|
87
|
+
// Build lookup map type entries for all models (map ID to keyField value)
|
|
88
|
+
const lookupMapTypeEntries = [];
|
|
89
|
+
const lookupMapBuilderEntries = [];
|
|
52
90
|
for (const model of models.values()) {
|
|
53
91
|
imports.addType(model.decoder.flattened.encodedType);
|
|
54
92
|
encodedTypeEntries.push(`${model.decoder.dataModelEntry}: ${model.decoder.flattened.encodedType.name}[] | undefined`);
|
|
55
93
|
imports.addType(model.decoder.excel.encodedType);
|
|
56
94
|
encodedExcelTypeEntries.push(`${model.excelName}: ${model.decoder.excel.encodedType.name}[] | undefined`);
|
|
57
95
|
imports.addType(model.types);
|
|
96
|
+
imports.addType(model.types.id);
|
|
58
97
|
decodedTypeEntries.push(`${model.decoder.dataModelEntry}?: ${model.types.name}[]`);
|
|
59
98
|
imports.add(model.decoder.flattened.encoder);
|
|
60
99
|
encoderEntries.push(`${model.decoder.dataModelEntry}: input.${model.decoder.dataModelEntry}?.map(${model.decoder.flattened.encoder.name}) ?? undefined`);
|
|
61
100
|
imports.add(model.decoder.excel.encoder);
|
|
62
|
-
|
|
101
|
+
// Build lookup map type entry (maps ID to keyField value for this model)
|
|
102
|
+
lookupMapTypeEntries.push(`${model.decoder.dataModelEntry}: Map<${model.types.id.name}, string>`);
|
|
103
|
+
// Build lookup map builder entry
|
|
104
|
+
const keyFieldName = model.keyField.name;
|
|
105
|
+
lookupMapBuilderEntries.push(`${model.decoder.dataModelEntry}: new Map((input.${model.decoder.dataModelEntry} ?? []).map(item => [item.id, String(item.${keyFieldName})]))`);
|
|
63
106
|
imports.add(model.decoder.flattened.decoder.zodDecoder);
|
|
64
107
|
decoderEntries.push(`${model.decoder.dataModelEntry}: z.array(${model.decoder.flattened.decoder.zodDecoder.name}).optional()`);
|
|
65
108
|
imports.add(model.decoder.excel.decoder.zodDecoder);
|
|
66
109
|
decoderExcelEntries.push(`${model.excelName}: z.array(${model.decoder.excel.decoder.zodDecoder.name}).optional()`);
|
|
67
110
|
transformerExcelEntries.push(`${model.decoder.dataModelEntry}: v.${model.excelName} ?? []`);
|
|
68
111
|
}
|
|
112
|
+
// Generate encoder entries for Excel - models with relations (direct or via DU) need lookup maps
|
|
113
|
+
for (const model of models.values()) {
|
|
114
|
+
if (modelNeedsLookupMaps(model)) {
|
|
115
|
+
encoderExcelEntries.push(`${model.excelName}: input.${model.decoder.dataModelEntry}?.map(item => ${model.decoder.excel.encoder.name}(item, lookupMaps)) ?? undefined`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
encoderExcelEntries.push(`${model.excelName}: input.${model.decoder.dataModelEntry}?.map(${model.decoder.excel.encoder.name}) ?? undefined`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
69
121
|
return `
|
|
70
122
|
import * as z from 'zod'
|
|
71
123
|
${imports.generate()}
|
|
@@ -84,6 +136,25 @@ export type ${dataModel.decodedType.name} = {
|
|
|
84
136
|
${decodedTypeEntries.join(',\n')}
|
|
85
137
|
}
|
|
86
138
|
|
|
139
|
+
/**
|
|
140
|
+
* Lookup maps for resolving IDs to keyField values during Excel export.
|
|
141
|
+
* Each map contains ID -> keyField value mappings for a specific model.
|
|
142
|
+
* This is used to export human-readable keys instead of UUIDs in relation fields.
|
|
143
|
+
*/
|
|
144
|
+
export type IdToKeyLookupMaps = {
|
|
145
|
+
${lookupMapTypeEntries.join(',\n')}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Builds lookup maps from the DataModel for ID-to-key resolution during export.
|
|
150
|
+
* These maps allow the Excel encoder to output keyField values instead of IDs for relation fields.
|
|
151
|
+
*/
|
|
152
|
+
function buildIdToKeyLookupMaps(input: ${dataModel.decodedType.name}): IdToKeyLookupMaps {
|
|
153
|
+
return {
|
|
154
|
+
${lookupMapBuilderEntries.join(',\n')}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
87
158
|
export function ${dataModel.encoder.name}(input: ${dataModel.decodedType.name}): ${dataModel.encodedType.name} {
|
|
88
159
|
return {
|
|
89
160
|
${encoderEntries.join(',\n')}
|
|
@@ -109,7 +180,15 @@ export type ${excelDataModel.encodedType.name} = {
|
|
|
109
180
|
${encodedExcelTypeEntries.join(',\n')}
|
|
110
181
|
}
|
|
111
182
|
|
|
183
|
+
/**
|
|
184
|
+
* Encodes a DataModel to Excel format, converting relation IDs to human-readable keys.
|
|
185
|
+
* This allows exported Excel files to contain the same format as imported Excel files,
|
|
186
|
+
* making round-trip import/export consistent.
|
|
187
|
+
*/
|
|
112
188
|
export function ${excelDataModel.encoder.name}(input: ${dataModel.decodedType.name}): ${excelDataModel.encodedType.name} {
|
|
189
|
+
// Build lookup maps for ID-to-key resolution
|
|
190
|
+
const lookupMaps = buildIdToKeyLookupMaps(input)
|
|
191
|
+
|
|
113
192
|
return {
|
|
114
193
|
${encoderExcelEntries.join(',\n')}
|
|
115
194
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datamodel-decoder.generator.js","sourceRoot":"","sources":["../../src/decoders/datamodel-decoder.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"datamodel-decoder.generator.js","sourceRoot":"","sources":["../../src/decoders/datamodel-decoder.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,11 +37,33 @@ exports.generateDiscriminatedUnionDecoder = generateDiscriminatedUnionDecoder;
|
|
|
37
37
|
const Generator = __importStar(require("@postxl/generator"));
|
|
38
38
|
const FlattenedFieldHelper = __importStar(require("./excel-field-decoder.helper"));
|
|
39
39
|
const FieldDecoder = __importStar(require("./field-decoder.helper"));
|
|
40
|
+
/**
|
|
41
|
+
* Checks if a discriminated union has any relation fields (in common fields or any member).
|
|
42
|
+
*/
|
|
43
|
+
function hasRelationFields(field) {
|
|
44
|
+
// Check common fields
|
|
45
|
+
for (const f of field.commonFields.values()) {
|
|
46
|
+
if (f.kind === 'relation') {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Check member fields
|
|
51
|
+
for (const member of field.members.values()) {
|
|
52
|
+
for (const f of member.fields.values()) {
|
|
53
|
+
if (f.kind === 'relation') {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
40
60
|
function generateDiscriminatedUnionDecoder({ context, model, discriminatedUnion, }) {
|
|
41
61
|
const imports = Generator.ImportGenerator.from(model.decoder.decoder.zodDecoder.location);
|
|
42
62
|
const params = { context, model, discriminatedUnion, field: discriminatedUnion.field, imports };
|
|
43
63
|
// We cannot inline below definitions, as we need to add the imports before
|
|
44
64
|
const decoder = getDecoder(params);
|
|
65
|
+
const flattenedType = getFlattenedType({ discriminatedUnion });
|
|
66
|
+
const flattenedEncoder = getFlattenedEncoder(params);
|
|
45
67
|
const flattenedDecoder = getFlattenedDecoder(params);
|
|
46
68
|
return /* ts */ `
|
|
47
69
|
import * as z from 'zod'
|
|
@@ -49,9 +71,9 @@ ${imports.generate()}
|
|
|
49
71
|
|
|
50
72
|
${decoder}
|
|
51
73
|
|
|
52
|
-
${
|
|
74
|
+
${flattenedType}
|
|
53
75
|
|
|
54
|
-
${
|
|
76
|
+
${flattenedEncoder}
|
|
55
77
|
|
|
56
78
|
${flattenedDecoder}`;
|
|
57
79
|
}
|
|
@@ -89,32 +111,77 @@ function getFlattenedType({ discriminatedUnion }) {
|
|
|
89
111
|
export type ${discriminatedUnion.flattened.decoder.rawInputType.name} = z.infer<typeof ${discriminatedUnion.flattened.decoder.rawInputValidation.name}>
|
|
90
112
|
`;
|
|
91
113
|
}
|
|
92
|
-
function getFlattenedEncoder({ discriminatedUnion, }) {
|
|
114
|
+
function getFlattenedEncoder({ context, discriminatedUnion, field, imports }) {
|
|
115
|
+
const hasRelations = hasRelationFields(field);
|
|
116
|
+
// If there are relation fields, we need the lookup maps type
|
|
117
|
+
if (hasRelations) {
|
|
118
|
+
imports.addTypeImport({
|
|
119
|
+
from: Generator.toBackendModuleLocation('@decoders/data-model.decoder'),
|
|
120
|
+
items: [Generator.toTypeName('IdToKeyLookupMaps')],
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
const encoderFields = getEncoderFields({ field, context, hasRelations });
|
|
124
|
+
if (hasRelations) {
|
|
125
|
+
return `
|
|
126
|
+
/**
|
|
127
|
+
* Encodes a ${field.type} discriminated union to a flattened object.
|
|
128
|
+
* When lookupMaps is provided, relation IDs are resolved to human-readable keyField values.
|
|
129
|
+
* When lookupMaps is not provided, IDs are output directly.
|
|
130
|
+
*/
|
|
131
|
+
export function ${discriminatedUnion.flattened.encoder.name}(item: ${field.type}, lookupMaps?: IdToKeyLookupMaps) {
|
|
132
|
+
return {
|
|
133
|
+
${encoderFields.join(',\n')}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
`;
|
|
137
|
+
}
|
|
93
138
|
return `
|
|
94
139
|
/**
|
|
95
|
-
* Encodes a ${
|
|
140
|
+
* Encodes a ${field.type} discriminated union to a flattened object, where each
|
|
96
141
|
* nested field is mapped to a top-level field. This allows serialization to a column structure.
|
|
97
142
|
*/
|
|
98
|
-
export function ${discriminatedUnion.flattened.encoder.name}(item: ${
|
|
143
|
+
export function ${discriminatedUnion.flattened.encoder.name}(item: ${field.type}) {
|
|
99
144
|
return {
|
|
100
|
-
${
|
|
145
|
+
${encoderFields.join(',\n')}
|
|
101
146
|
}
|
|
102
147
|
}
|
|
103
148
|
`;
|
|
104
149
|
}
|
|
105
|
-
function getEncoderFields({ field }) {
|
|
150
|
+
function getEncoderFields({ field, context, hasRelations, }) {
|
|
106
151
|
const result = [];
|
|
107
152
|
result.push(`${field.databaseName}: item.type`);
|
|
108
153
|
for (const f of field.commonFields.values()) {
|
|
109
|
-
result.push(
|
|
154
|
+
result.push(getEncoderFieldValue({ f, context, hasRelations, memberType: null }));
|
|
110
155
|
}
|
|
111
156
|
for (const member of field.members.values()) {
|
|
112
157
|
for (const f of member.fields.values()) {
|
|
113
|
-
result.push(
|
|
158
|
+
result.push(getEncoderFieldValue({ f, context, hasRelations, memberType: member.type }));
|
|
114
159
|
}
|
|
115
160
|
}
|
|
116
161
|
return result;
|
|
117
162
|
}
|
|
163
|
+
function getEncoderFieldValue({ f, context, hasRelations, memberType, }) {
|
|
164
|
+
const valueExpr = memberType ? `item.type === '${memberType}' ? item.${f.name} : null` : `item.${f.name}`;
|
|
165
|
+
if (f.kind === 'relation' && hasRelations) {
|
|
166
|
+
const referencedModel = context.models.get(f.referencedModelName);
|
|
167
|
+
const lookupExpr = `lookupMaps?.${referencedModel.decoder.dataModelEntry}.get(item.${f.name})`;
|
|
168
|
+
if (memberType) {
|
|
169
|
+
// Member-specific field: check type first, then resolve ID to key
|
|
170
|
+
if (f.isRequired) {
|
|
171
|
+
return `${f.databaseName}: item.type === '${memberType}' ? (${lookupExpr} ?? item.${f.name}) : null`;
|
|
172
|
+
}
|
|
173
|
+
return `${f.databaseName}: item.type === '${memberType}' ? (item.${f.name} === null ? null : (${lookupExpr} ?? item.${f.name})) : null`;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// Common field: always present
|
|
177
|
+
if (f.isRequired) {
|
|
178
|
+
return `${f.databaseName}: ${lookupExpr} ?? item.${f.name}`;
|
|
179
|
+
}
|
|
180
|
+
return `${f.databaseName}: item.${f.name} === null ? null : (${lookupExpr} ?? item.${f.name})`;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return `${f.databaseName}: ${valueExpr}`;
|
|
184
|
+
}
|
|
118
185
|
function getFlattenedDecoder({ context, model, discriminatedUnion, field, imports }) {
|
|
119
186
|
imports.addTypeImport({ from: context.types.location, items: [field.type] });
|
|
120
187
|
const fieldRawDecoders = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discriminated-union.decoder.generator.js","sourceRoot":"","sources":["../../src/decoders/discriminated-union.decoder.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"discriminated-union.decoder.generator.js","sourceRoot":"","sources":["../../src/decoders/discriminated-union.decoder.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,26 @@ exports.generateModelDecoder = generateModelDecoder;
|
|
|
37
37
|
const Generator = __importStar(require("@postxl/generator"));
|
|
38
38
|
const FlattenedFieldHelper = __importStar(require("./excel-field-decoder.helper"));
|
|
39
39
|
const FieldHelper = __importStar(require("./field-decoder.helper"));
|
|
40
|
+
/**
|
|
41
|
+
* Checks if a discriminated union has any relation fields (in common fields or any member).
|
|
42
|
+
*/
|
|
43
|
+
function discriminatedUnionHasRelationFields(field) {
|
|
44
|
+
// Check common fields
|
|
45
|
+
for (const f of field.commonFields.values()) {
|
|
46
|
+
if (f.kind === 'relation') {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Check member fields
|
|
51
|
+
for (const member of field.members.values()) {
|
|
52
|
+
for (const f of member.fields.values()) {
|
|
53
|
+
if (f.kind === 'relation') {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
40
60
|
function generateModelDecoder({ model, context }) {
|
|
41
61
|
const imports = Generator.ImportGenerator.from(model.decoder.decoder.zodDecoder.location).add(model.types);
|
|
42
62
|
const sharedParams = { model, context, imports };
|
|
@@ -54,6 +74,7 @@ function generateModelDecoder({ model, context }) {
|
|
|
54
74
|
...sharedParams,
|
|
55
75
|
toName: (field) => field.excelName,
|
|
56
76
|
codecDefinition: model.decoder.excel,
|
|
77
|
+
isExcel: true,
|
|
57
78
|
};
|
|
58
79
|
const excelFlattenedType = getFlattenedType(excelFlattenedParams);
|
|
59
80
|
const excelFlattenedEncoder = getFlattenedEncoder(excelFlattenedParams);
|
|
@@ -101,26 +122,86 @@ function getFlattenedType({ model, codecDefinition }) {
|
|
|
101
122
|
*/
|
|
102
123
|
export type ${codecDefinition.decoder.rawInputType.name} = z.infer<typeof ${codecDefinition.decoder.rawInputValidation.name}>`;
|
|
103
124
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Checks if the model needs lookup maps for Excel export (has relation fields or discriminated unions with relations).
|
|
127
|
+
*/
|
|
128
|
+
function checkNeedsLookupMaps(model, isExcel) {
|
|
129
|
+
if (!isExcel) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
107
132
|
for (const field of model.fields.values()) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
break;
|
|
114
|
-
}
|
|
115
|
-
case 'enum':
|
|
116
|
-
fields.push(`"${toName(field)}": item.${field.name}`);
|
|
117
|
-
break;
|
|
118
|
-
default:
|
|
119
|
-
fields.push(`"${toName(field)}": item.${field.name}`);
|
|
120
|
-
break;
|
|
133
|
+
if (field.kind === 'relation') {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
if (field.kind === 'discriminatedUnion' && discriminatedUnionHasRelationFields(field)) {
|
|
137
|
+
return true;
|
|
121
138
|
}
|
|
122
139
|
}
|
|
123
|
-
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Generates field encoding for a discriminated union.
|
|
144
|
+
*/
|
|
145
|
+
function encodeDiscriminatedUnionField(params) {
|
|
146
|
+
const { field, model, imports, isExcel } = params;
|
|
147
|
+
const du = model.decoder.discriminatedUnions.get(field.name);
|
|
148
|
+
imports.add(du.flattened.encoder);
|
|
149
|
+
const hasRelations = isExcel && discriminatedUnionHasRelationFields(field);
|
|
150
|
+
const encoderCall = hasRelations
|
|
151
|
+
? `${du.flattened.encoder.name}(item.${field.name}, lookupMaps)`
|
|
152
|
+
: `${du.flattened.encoder.name}(item.${field.name})`;
|
|
153
|
+
return `...${encoderCall}`;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Generates field encoding for a relation field.
|
|
157
|
+
*/
|
|
158
|
+
function encodeRelationField(params) {
|
|
159
|
+
const { field, toName, context, isExcel } = params;
|
|
160
|
+
if (!isExcel) {
|
|
161
|
+
return `"${toName(field)}": item.${field.name}`;
|
|
162
|
+
}
|
|
163
|
+
// For Excel export, resolve relation IDs to keyField values using lookup maps
|
|
164
|
+
const referencedModel = context.models.get(field.referencedModelName);
|
|
165
|
+
const lookupExpr = `lookupMaps?.${referencedModel.decoder.dataModelEntry}.get(item.${field.name}) ?? item.${field.name}`;
|
|
166
|
+
if (field.isRequired) {
|
|
167
|
+
return `"${toName(field)}": ${lookupExpr}`;
|
|
168
|
+
}
|
|
169
|
+
return `"${toName(field)}": item.${field.name} === null ? null : (${lookupExpr})`;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Generates field encoding for a single field based on its kind.
|
|
173
|
+
*/
|
|
174
|
+
function encodeField(field, params) {
|
|
175
|
+
const { toName, model, imports, context, isExcel } = params;
|
|
176
|
+
switch (field.kind) {
|
|
177
|
+
case 'discriminatedUnion':
|
|
178
|
+
return encodeDiscriminatedUnionField({ field, model, imports, isExcel });
|
|
179
|
+
case 'relation':
|
|
180
|
+
return encodeRelationField({ field, toName, context, isExcel });
|
|
181
|
+
case 'enum':
|
|
182
|
+
default:
|
|
183
|
+
return `"${toName(field)}": item.${field.name}`;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Generates the function signature and JSDoc based on whether lookup maps are needed.
|
|
188
|
+
*/
|
|
189
|
+
function generateEncoderFunction(params) {
|
|
190
|
+
const { needsLookupMaps, model, codecDefinition, inputType, fields } = params;
|
|
191
|
+
if (needsLookupMaps) {
|
|
192
|
+
return `
|
|
193
|
+
/**
|
|
194
|
+
* Encodes a ${model.types.name} object to a flattened Excel object.
|
|
195
|
+
* When lookupMaps is provided, relation IDs are resolved to human-readable keyField values.
|
|
196
|
+
* When lookupMaps is not provided (e.g., single-model export), IDs are output directly.
|
|
197
|
+
* This ensures exported Excel files match the expected import format when used with flattenExcelDataModel.
|
|
198
|
+
*/
|
|
199
|
+
export function ${codecDefinition.encoder.name}(item: ${inputType}, lookupMaps?: IdToKeyLookupMaps) {
|
|
200
|
+
return {
|
|
201
|
+
${fields.join(',\n')}
|
|
202
|
+
}
|
|
203
|
+
}`;
|
|
204
|
+
}
|
|
124
205
|
return `
|
|
125
206
|
/**
|
|
126
207
|
* Encodes a ${model.types.name} object to a flattened object, where each
|
|
@@ -132,6 +213,28 @@ function getFlattenedEncoder(params) {
|
|
|
132
213
|
}
|
|
133
214
|
}`;
|
|
134
215
|
}
|
|
216
|
+
function getFlattenedEncoder(params) {
|
|
217
|
+
const { model, imports, codecDefinition, isExcel } = params;
|
|
218
|
+
const needsLookupMaps = checkNeedsLookupMaps(model, isExcel);
|
|
219
|
+
if (needsLookupMaps) {
|
|
220
|
+
imports.addTypeImport({
|
|
221
|
+
from: Generator.toBackendModuleLocation('@decoders/data-model.decoder'),
|
|
222
|
+
items: [Generator.toTypeName('IdToKeyLookupMaps')],
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
const fields = [];
|
|
226
|
+
for (const field of model.fields.values()) {
|
|
227
|
+
fields.push(encodeField(field, params));
|
|
228
|
+
}
|
|
229
|
+
const inputType = getFlattenedEncoderInputType(params);
|
|
230
|
+
return generateEncoderFunction({
|
|
231
|
+
needsLookupMaps,
|
|
232
|
+
model,
|
|
233
|
+
codecDefinition,
|
|
234
|
+
inputType,
|
|
235
|
+
fields,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
135
238
|
function getFlattenedEncoderInputType({ model, imports }) {
|
|
136
239
|
const omits = [];
|
|
137
240
|
for (const field of model.fields.values()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-decoder.generator.js","sourceRoot":"","sources":["../../src/decoders/model-decoder.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"model-decoder.generator.js","sourceRoot":"","sources":["../../src/decoders/model-decoder.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateDockerSh = generateDockerSh;
|
|
4
4
|
function generateDockerSh({ schema: { projectType, slug } }) {
|
|
5
|
-
const mountPath = projectType === 'workspace' ? '../../' : '${PWD}';
|
|
6
5
|
const workDir = projectType === 'workspace' ? `/pxl/projects/${slug}/e2e` : '/pxl/e2e';
|
|
7
|
-
|
|
6
|
+
const commonScript = /*sh*/ String.raw `#!/bin/bash
|
|
8
7
|
# This script should only be run via 'pnpm docker' in the project root!
|
|
9
8
|
# Define a name for the image
|
|
10
9
|
IMAGE_NAME="e2e-pxl-env"
|
|
@@ -17,9 +16,18 @@ docker build -t $IMAGE_NAME ./e2e/
|
|
|
17
16
|
USER_FLAG=""
|
|
18
17
|
if [[ "$(uname)" = "Linux" ]]; then
|
|
19
18
|
USER_FLAG="-u $(id -u):$(id -g)"
|
|
20
|
-
fi
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
fi`;
|
|
20
|
+
const runScript = projectType === 'workspace'
|
|
21
|
+
? /*sh*/ String.raw `
|
|
22
|
+
# Mount the entire monorepo to preserve pnpm workspace symlinks
|
|
23
|
+
MONOREPO_ROOT="$(cd ../.. && pwd)"
|
|
24
|
+
# Delete the node shims from mounted volume to prevent "Exec format error" on cross-architecture mounts
|
|
25
|
+
docker run -p 3030:3030 $USER_FLAG -v "$MONOREPO_ROOT:/pxl" -w ${workDir} --rm -it $IMAGE_NAME /bin/bash -c "rm -f /pxl/node_modules/.bin/node /pxl/projects/*/node_modules/.bin/node 2>/dev/null; exec /bin/bash"
|
|
26
|
+
`
|
|
27
|
+
: /*sh*/ String.raw `
|
|
28
|
+
# Delete the node shims from mounted volume to prevent "Exec format error" on cross-architecture mounts
|
|
29
|
+
docker run -p 3030:3030 $USER_FLAG -v \${PWD}:/pxl -w ${workDir} --rm -it $IMAGE_NAME /bin/bash -c "rm -f /pxl/node_modules/.bin/node 2>/dev/null; exec /bin/bash"
|
|
23
30
|
`;
|
|
31
|
+
return commonScript + runScript;
|
|
24
32
|
}
|
|
25
33
|
//# sourceMappingURL=docker-sh.generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-sh.generator.js","sourceRoot":"","sources":["../../../src/e2e/generators/docker-sh.generator.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"docker-sh.generator.js","sourceRoot":"","sources":["../../../src/e2e/generators/docker-sh.generator.ts"],"names":[],"mappings":";;AAEA,4CAgCC;AAhCD,SAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAiB;IAC/E,MAAM,OAAO,GAAG,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,iBAAiB,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAA;IAEtF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;GAarC,CAAA;IAED,MAAM,SAAS,GACb,WAAW,KAAK,WAAW;QACzB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA;;;;iEAIwC,OAAO;CACvE;QACK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA;;wDAE+B,OAAO;CAC9D,CAAA;IAEC,OAAO,YAAY,GAAG,SAAS,CAAA;AACjC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@postxl/generators",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.4",
|
|
4
4
|
"description": "Code generators for PXL - generates backend, frontend, Prisma schemas, and more",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"@faker-js/faker": "9.4.0",
|
|
45
45
|
"@prisma/prisma-schema-wasm": "7.2.0-4.0c8ef2ce45c83248ab3df073180d5eda9e8be7a3",
|
|
46
46
|
"exceljs": "^4.4.0",
|
|
47
|
-
"@postxl/schema": "^1.3.1",
|
|
48
47
|
"@postxl/generator": "^1.3.3",
|
|
48
|
+
"@postxl/schema": "^1.3.1",
|
|
49
49
|
"@postxl/ui-components": "^1.3.5",
|
|
50
50
|
"@postxl/utils": "^1.3.1"
|
|
51
51
|
},
|