@rvoh/psychic 2.2.1-alpha.1 → 2.2.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.
@@ -63,6 +63,7 @@ function processAttributes(columnsWithTypes, modelConfig, fullyQualifiedModelNam
63
63
  dateAttributeIncluded: false,
64
64
  datetimeAttributeIncluded: false,
65
65
  uuidAttributeIncluded: false,
66
+ uuidAttributes: [],
66
67
  uuidArrayAttributes: [],
67
68
  dreamImports: [],
68
69
  };
@@ -153,7 +154,7 @@ function processEnumAttribute({ attributeName, isArray, enumValues, dotNotationV
153
154
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable},`);
154
155
  if (attributeName !== 'type') {
155
156
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${jsonify(originalEnumValue)},`);
156
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${jsonify(updatedEnumValue)},`);
157
+ attributeData.attributeUpdateKeyValues.push({ attributeName, value: jsonify(updatedEnumValue) });
157
158
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(originalEnumValue)})`);
158
159
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(updatedEnumValue)})`);
159
160
  }
@@ -164,7 +165,7 @@ function processStringAttribute({ attributeName, isArray, dotNotationVariable, f
164
165
  const originalStringValue = isArray ? [rawOriginalStringValue] : rawOriginalStringValue;
165
166
  const updatedStringValue = isArray ? [rawUpdatedStringValue] : rawUpdatedStringValue;
166
167
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${jsonify(originalStringValue)},`);
167
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${jsonify(updatedStringValue)},`);
168
+ attributeData.attributeUpdateKeyValues.push({ attributeName, value: jsonify(updatedStringValue) });
168
169
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable},`);
169
170
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(originalStringValue)})`);
170
171
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(updatedStringValue)})`);
@@ -175,7 +176,7 @@ function processNumericAttribute({ attributeName, attributeType, isArray, dotNot
175
176
  const originalValue = isArray ? [rawOriginalValue] : rawOriginalValue;
176
177
  const updatedValue = isArray ? [rawUpdatedValue] : rawUpdatedValue;
177
178
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${jsonify(originalValue)},`);
178
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${jsonify(updatedValue)},`);
179
+ attributeData.attributeUpdateKeyValues.push({ attributeName, value: jsonify(updatedValue) });
179
180
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable},`);
180
181
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(originalValue)})`);
181
182
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(updatedValue)})`);
@@ -184,7 +185,10 @@ function processDateAttribute({ attributeName, isArray, dotNotationVariable, att
184
185
  attributeData.dreamImports.push('CalendarDate');
185
186
  attributeData.dateAttributeIncluded = true;
186
187
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${isArray ? '[today.toISO()]' : 'today.toISO()'},`);
187
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${isArray ? '[yesterday.toISO()]' : 'yesterday.toISO()'},`);
188
+ attributeData.attributeUpdateKeyValues.push({
189
+ attributeName,
190
+ value: `${isArray ? '[yesterday.toISO()]' : 'yesterday.toISO()'}`,
191
+ });
188
192
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable}${isArray ? '.map(date => date.toISO())' : '.toISO()'},`);
189
193
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}${isArray ? '[0]' : ''}).toEqualCalendarDate(today)`);
190
194
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}${isArray ? '[0]' : ''}).toEqualCalendarDate(yesterday)`);
@@ -193,13 +197,17 @@ function processDateTimeAttribute({ attributeName, isArray, dotNotationVariable,
193
197
  attributeData.dreamImports.push('DateTime');
194
198
  attributeData.datetimeAttributeIncluded = true;
195
199
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${isArray ? '[now.toISO()]' : 'now.toISO()'},`);
196
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${isArray ? '[lastHour.toISO()]' : 'lastHour.toISO()'},`);
200
+ attributeData.attributeUpdateKeyValues.push({
201
+ attributeName,
202
+ value: `${isArray ? '[lastHour.toISO()]' : 'lastHour.toISO()'}`,
203
+ });
197
204
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable}${isArray ? '.map(datetime => datetime.toISO())' : '.toISO()'},`);
198
205
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}${isArray ? '[0]' : ''}).toEqualDateTime(now)`);
199
206
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}${isArray ? '[0]' : ''}).toEqualDateTime(lastHour)`);
200
207
  }
201
208
  function processUuidAttribute({ attributeName, isArray, dotNotationVariable, attributeData, }) {
202
209
  attributeData.uuidAttributeIncluded = true;
210
+ attributeData.uuidAttributes.push(attributeName);
203
211
  if (isArray) {
204
212
  attributeData.uuidArrayAttributes.push(attributeName);
205
213
  }
@@ -208,7 +216,7 @@ function processUuidAttribute({ attributeName, isArray, dotNotationVariable, att
208
216
  const uuidValue = attributeName;
209
217
  const newUuidValue = newUuidVariableName;
210
218
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${uuidValue},`);
211
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${newUuidValue},`);
219
+ attributeData.attributeUpdateKeyValues.push({ attributeName, value: newUuidValue });
212
220
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable},`);
213
221
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}).toEqual(${attributeName})`);
214
222
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}).toEqual(${newUuidVariableName})`);
@@ -336,13 +344,7 @@ function generateCreateActionSpec(options) {
336
344
  return '';
337
345
  const { path, pathParams, modelConfig, fullyQualifiedModelName, forAdmin, singular, attributeData } = options;
338
346
  const subjectFunctionName = `create${modelConfig.modelClassName}`;
339
- const uuidAttributeNames = attributeData.attributeCreationKeyValues
340
- .map(kv => {
341
- const match = kv.match(/^(\w+):\s*\1,?$/);
342
- return match?.[1];
343
- })
344
- .filter((name) => Boolean(name));
345
- const uuidSetup = uuidAttributeNames
347
+ const uuidSetup = attributeData.uuidAttributes
346
348
  .map(attrName => {
347
349
  const isArray = attributeData.uuidArrayAttributes.includes(attrName);
348
350
  return isArray ? `const ${attrName} = [randomUUID()]` : `const ${attrName} = randomUUID()`;
@@ -393,17 +395,7 @@ function generateUpdateActionSpec(options) {
393
395
  return '';
394
396
  const { path, pathParams, modelConfig, fullyQualifiedModelName, singular, forAdmin, attributeData } = options;
395
397
  const subjectFunctionName = `update${modelConfig.modelClassName}`;
396
- const uuidAttributeNames = attributeData.attributeUpdateKeyValues
397
- .filter(kv => {
398
- const match = kv.match(/^(\w+):\s*new([A-Z]\w+),?$/);
399
- return match && match[1] && camelize(match[1]) === camelize(match[2]);
400
- })
401
- .map(kv => {
402
- const match = kv.match(/^(\w+):/);
403
- return match?.[1];
404
- })
405
- .filter(Boolean);
406
- const uuidSetup = uuidAttributeNames
398
+ const uuidSetup = attributeData.uuidAttributes
407
399
  .map(attrName => {
408
400
  const isArray = attributeData.uuidArrayAttributes.includes(attrName);
409
401
  return isArray
@@ -461,15 +453,13 @@ function generateUpdateActionSpec(options) {
461
453
  ${attributeData.attributeUpdateKeyValues.length
462
454
  ? attributeData.attributeUpdateKeyValues
463
455
  .map(kv => {
464
- const match = kv.match(/^(\w+):\s*new([A-Z]\w+),?$/);
465
- if (match && match[1]) {
466
- const attrName = match[1];
467
- const isArray = attributeData.uuidArrayAttributes.includes(attrName);
468
- return isArray
469
- ? kv.replace(/\bnew[A-Z]\w+\b/g, '[randomUUID()]')
470
- : kv.replace(/\bnew[A-Z]\w+\b/g, 'randomUUID()');
471
- }
472
- return kv;
456
+ const isUuid = attributeData.uuidAttributes.includes(kv.attributeName);
457
+ const value = isUuid
458
+ ? attributeData.uuidArrayAttributes.includes(kv.attributeName)
459
+ ? '[randomUUID()]'
460
+ : 'randomUUID()'
461
+ : kv.value;
462
+ return `${kv.attributeName}: ${value},`;
473
463
  })
474
464
  .join('\n ')
475
465
  : ''}
@@ -487,7 +477,7 @@ function generateUpdateActionSpec(options) {
487
477
  ${modelConfig.simpleCreationCommand}
488
478
 
489
479
  await ${subjectFunctionName}(${singular ? '' : `${modelConfig.modelVariableName}, `}{
490
- ${attributeData.attributeUpdateKeyValues.length ? attributeData.attributeUpdateKeyValues.join('\n ') : ''}
480
+ ${attributeData.attributeUpdateKeyValues.length ? attributeData.attributeUpdateKeyValues.map(kv => `${kv.attributeName}: ${kv.value},`).join('\n ') : ''}
491
481
  }, 204)
492
482
 
493
483
  await ${modelConfig.modelVariableName}.reload()
@@ -63,6 +63,7 @@ function processAttributes(columnsWithTypes, modelConfig, fullyQualifiedModelNam
63
63
  dateAttributeIncluded: false,
64
64
  datetimeAttributeIncluded: false,
65
65
  uuidAttributeIncluded: false,
66
+ uuidAttributes: [],
66
67
  uuidArrayAttributes: [],
67
68
  dreamImports: [],
68
69
  };
@@ -153,7 +154,7 @@ function processEnumAttribute({ attributeName, isArray, enumValues, dotNotationV
153
154
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable},`);
154
155
  if (attributeName !== 'type') {
155
156
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${jsonify(originalEnumValue)},`);
156
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${jsonify(updatedEnumValue)},`);
157
+ attributeData.attributeUpdateKeyValues.push({ attributeName, value: jsonify(updatedEnumValue) });
157
158
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(originalEnumValue)})`);
158
159
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(updatedEnumValue)})`);
159
160
  }
@@ -164,7 +165,7 @@ function processStringAttribute({ attributeName, isArray, dotNotationVariable, f
164
165
  const originalStringValue = isArray ? [rawOriginalStringValue] : rawOriginalStringValue;
165
166
  const updatedStringValue = isArray ? [rawUpdatedStringValue] : rawUpdatedStringValue;
166
167
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${jsonify(originalStringValue)},`);
167
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${jsonify(updatedStringValue)},`);
168
+ attributeData.attributeUpdateKeyValues.push({ attributeName, value: jsonify(updatedStringValue) });
168
169
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable},`);
169
170
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(originalStringValue)})`);
170
171
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(updatedStringValue)})`);
@@ -175,7 +176,7 @@ function processNumericAttribute({ attributeName, attributeType, isArray, dotNot
175
176
  const originalValue = isArray ? [rawOriginalValue] : rawOriginalValue;
176
177
  const updatedValue = isArray ? [rawUpdatedValue] : rawUpdatedValue;
177
178
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${jsonify(originalValue)},`);
178
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${jsonify(updatedValue)},`);
179
+ attributeData.attributeUpdateKeyValues.push({ attributeName, value: jsonify(updatedValue) });
179
180
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable},`);
180
181
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(originalValue)})`);
181
182
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}).toEqual(${jsonify(updatedValue)})`);
@@ -184,7 +185,10 @@ function processDateAttribute({ attributeName, isArray, dotNotationVariable, att
184
185
  attributeData.dreamImports.push('CalendarDate');
185
186
  attributeData.dateAttributeIncluded = true;
186
187
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${isArray ? '[today.toISO()]' : 'today.toISO()'},`);
187
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${isArray ? '[yesterday.toISO()]' : 'yesterday.toISO()'},`);
188
+ attributeData.attributeUpdateKeyValues.push({
189
+ attributeName,
190
+ value: `${isArray ? '[yesterday.toISO()]' : 'yesterday.toISO()'}`,
191
+ });
188
192
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable}${isArray ? '.map(date => date.toISO())' : '.toISO()'},`);
189
193
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}${isArray ? '[0]' : ''}).toEqualCalendarDate(today)`);
190
194
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}${isArray ? '[0]' : ''}).toEqualCalendarDate(yesterday)`);
@@ -193,13 +197,17 @@ function processDateTimeAttribute({ attributeName, isArray, dotNotationVariable,
193
197
  attributeData.dreamImports.push('DateTime');
194
198
  attributeData.datetimeAttributeIncluded = true;
195
199
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${isArray ? '[now.toISO()]' : 'now.toISO()'},`);
196
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${isArray ? '[lastHour.toISO()]' : 'lastHour.toISO()'},`);
200
+ attributeData.attributeUpdateKeyValues.push({
201
+ attributeName,
202
+ value: `${isArray ? '[lastHour.toISO()]' : 'lastHour.toISO()'}`,
203
+ });
197
204
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable}${isArray ? '.map(datetime => datetime.toISO())' : '.toISO()'},`);
198
205
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}${isArray ? '[0]' : ''}).toEqualDateTime(now)`);
199
206
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}${isArray ? '[0]' : ''}).toEqualDateTime(lastHour)`);
200
207
  }
201
208
  function processUuidAttribute({ attributeName, isArray, dotNotationVariable, attributeData, }) {
202
209
  attributeData.uuidAttributeIncluded = true;
210
+ attributeData.uuidAttributes.push(attributeName);
203
211
  if (isArray) {
204
212
  attributeData.uuidArrayAttributes.push(attributeName);
205
213
  }
@@ -208,7 +216,7 @@ function processUuidAttribute({ attributeName, isArray, dotNotationVariable, att
208
216
  const uuidValue = attributeName;
209
217
  const newUuidValue = newUuidVariableName;
210
218
  attributeData.attributeCreationKeyValues.push(`${attributeName}: ${uuidValue},`);
211
- attributeData.attributeUpdateKeyValues.push(`${attributeName}: ${newUuidValue},`);
219
+ attributeData.attributeUpdateKeyValues.push({ attributeName, value: newUuidValue });
212
220
  attributeData.comparableOriginalAttributeKeyValues.push(`${attributeName}: ${dotNotationVariable},`);
213
221
  attributeData.expectEqualOriginalValue.push(`expect(${dotNotationVariable}).toEqual(${attributeName})`);
214
222
  attributeData.expectEqualUpdatedValue.push(`expect(${dotNotationVariable}).toEqual(${newUuidVariableName})`);
@@ -336,13 +344,7 @@ function generateCreateActionSpec(options) {
336
344
  return '';
337
345
  const { path, pathParams, modelConfig, fullyQualifiedModelName, forAdmin, singular, attributeData } = options;
338
346
  const subjectFunctionName = `create${modelConfig.modelClassName}`;
339
- const uuidAttributeNames = attributeData.attributeCreationKeyValues
340
- .map(kv => {
341
- const match = kv.match(/^(\w+):\s*\1,?$/);
342
- return match?.[1];
343
- })
344
- .filter((name) => Boolean(name));
345
- const uuidSetup = uuidAttributeNames
347
+ const uuidSetup = attributeData.uuidAttributes
346
348
  .map(attrName => {
347
349
  const isArray = attributeData.uuidArrayAttributes.includes(attrName);
348
350
  return isArray ? `const ${attrName} = [randomUUID()]` : `const ${attrName} = randomUUID()`;
@@ -393,17 +395,7 @@ function generateUpdateActionSpec(options) {
393
395
  return '';
394
396
  const { path, pathParams, modelConfig, fullyQualifiedModelName, singular, forAdmin, attributeData } = options;
395
397
  const subjectFunctionName = `update${modelConfig.modelClassName}`;
396
- const uuidAttributeNames = attributeData.attributeUpdateKeyValues
397
- .filter(kv => {
398
- const match = kv.match(/^(\w+):\s*new([A-Z]\w+),?$/);
399
- return match && match[1] && camelize(match[1]) === camelize(match[2]);
400
- })
401
- .map(kv => {
402
- const match = kv.match(/^(\w+):/);
403
- return match?.[1];
404
- })
405
- .filter(Boolean);
406
- const uuidSetup = uuidAttributeNames
398
+ const uuidSetup = attributeData.uuidAttributes
407
399
  .map(attrName => {
408
400
  const isArray = attributeData.uuidArrayAttributes.includes(attrName);
409
401
  return isArray
@@ -461,15 +453,13 @@ function generateUpdateActionSpec(options) {
461
453
  ${attributeData.attributeUpdateKeyValues.length
462
454
  ? attributeData.attributeUpdateKeyValues
463
455
  .map(kv => {
464
- const match = kv.match(/^(\w+):\s*new([A-Z]\w+),?$/);
465
- if (match && match[1]) {
466
- const attrName = match[1];
467
- const isArray = attributeData.uuidArrayAttributes.includes(attrName);
468
- return isArray
469
- ? kv.replace(/\bnew[A-Z]\w+\b/g, '[randomUUID()]')
470
- : kv.replace(/\bnew[A-Z]\w+\b/g, 'randomUUID()');
471
- }
472
- return kv;
456
+ const isUuid = attributeData.uuidAttributes.includes(kv.attributeName);
457
+ const value = isUuid
458
+ ? attributeData.uuidArrayAttributes.includes(kv.attributeName)
459
+ ? '[randomUUID()]'
460
+ : 'randomUUID()'
461
+ : kv.value;
462
+ return `${kv.attributeName}: ${value},`;
473
463
  })
474
464
  .join('\n ')
475
465
  : ''}
@@ -487,7 +477,7 @@ function generateUpdateActionSpec(options) {
487
477
  ${modelConfig.simpleCreationCommand}
488
478
 
489
479
  await ${subjectFunctionName}(${singular ? '' : `${modelConfig.modelVariableName}, `}{
490
- ${attributeData.attributeUpdateKeyValues.length ? attributeData.attributeUpdateKeyValues.join('\n ') : ''}
480
+ ${attributeData.attributeUpdateKeyValues.length ? attributeData.attributeUpdateKeyValues.map(kv => `${kv.attributeName}: ${kv.value},`).join('\n ') : ''}
491
481
  }, 204)
492
482
 
493
483
  await ${modelConfig.modelVariableName}.reload()
@@ -1,5 +1,5 @@
1
1
  export default class PackageManager {
2
- static get packageManager(): "yarn" | "npm" | "pnpm";
2
+ static get packageManager(): "pnpm" | "yarn" | "npm";
3
3
  static add(dependencyOrDependencies: string | string[], { dev }?: {
4
4
  dev?: boolean;
5
5
  }): string;
@@ -156,7 +156,7 @@ export default class PsychicApp {
156
156
  private _sanitizeResponseJson;
157
157
  get sanitizeResponseJson(): boolean;
158
158
  private _packageManager;
159
- get packageManager(): "yarn" | "npm" | "pnpm";
159
+ get packageManager(): "pnpm" | "yarn" | "npm";
160
160
  private _importExtension;
161
161
  get importExtension(): "none" | ".js" | ".ts";
162
162
  private _routesCb;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "type": "module",
3
3
  "name": "@rvoh/psychic",
4
4
  "description": "Typescript web framework",
5
- "version": "2.2.1-alpha.1",
5
+ "version": "2.2.1",
6
6
  "author": "RVOHealth",
7
7
  "repository": {
8
8
  "type": "git",
@@ -79,7 +79,7 @@
79
79
  "yoctocolors": "^2.1.1"
80
80
  },
81
81
  "peerDependencies": {
82
- "@rvoh/dream": "^2.0.3",
82
+ "@rvoh/dream": "^2.1.4",
83
83
  "@types/express": "^5.0.1",
84
84
  "commander": "^12.1.0",
85
85
  "express": "^5.2.1",
@@ -88,7 +88,7 @@
88
88
  "devDependencies": {
89
89
  "@eslint/js": "^9.39.1",
90
90
  "@jest-mock/express": "^3.0.0",
91
- "@rvoh/dream": "^2.0.3",
91
+ "@rvoh/dream": "^2.1.4",
92
92
  "@rvoh/dream-spec-helpers": "^2.0.0",
93
93
  "@rvoh/psychic-spec-helpers": "^2.0.0",
94
94
  "@types/body-parser": "^1.19.6",