@rvoh/dream 2.5.1 → 2.5.3
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/cjs/src/Dream.js +0 -9
- package/dist/cjs/src/cli/index.js +38 -10
- package/dist/cjs/src/cli/logger/DreamCliLogger.js +107 -6
- package/dist/cjs/src/db/helpers/syncDbTypesFiles.js +2 -2
- package/dist/cjs/src/decorators/field/Encrypted.js +2 -1
- package/dist/cjs/src/dream/QueryDriver/Postgres.js +2 -2
- package/dist/cjs/src/dream/QueryDriver/helpers/kysely/runMigration.js +2 -2
- package/dist/cjs/src/dream/QueryDriver/helpers/pg/dropDb.js +2 -2
- package/dist/cjs/src/helpers/db/columnAllowsNull.js +3 -0
- package/dist/cjs/src/helpers/db/normalizeDataForDb.js +2 -1
- package/dist/cjs/src/helpers/db/types/isDatabaseArrayColumn.js +2 -1
- package/dist/cjs/src/helpers/db/types/isDatetimeOrDatetimeArrayColumn.js +2 -1
- package/dist/cjs/src/helpers/db/types/isJsonColumn.js +2 -1
- package/dist/cjs/src/ops/index.js +2 -1
- package/dist/esm/src/Dream.js +0 -9
- package/dist/esm/src/cli/index.js +38 -10
- package/dist/esm/src/cli/logger/DreamCliLogger.js +107 -6
- package/dist/esm/src/db/helpers/syncDbTypesFiles.js +2 -2
- package/dist/esm/src/decorators/field/Encrypted.js +2 -1
- package/dist/esm/src/dream/QueryDriver/Postgres.js +2 -2
- package/dist/esm/src/dream/QueryDriver/helpers/kysely/runMigration.js +2 -2
- package/dist/esm/src/dream/QueryDriver/helpers/pg/dropDb.js +2 -2
- package/dist/esm/src/helpers/db/columnAllowsNull.js +3 -0
- package/dist/esm/src/helpers/db/normalizeDataForDb.js +2 -1
- package/dist/esm/src/helpers/db/types/isDatabaseArrayColumn.js +2 -1
- package/dist/esm/src/helpers/db/types/isDatetimeOrDatetimeArrayColumn.js +2 -1
- package/dist/esm/src/helpers/db/types/isJsonColumn.js +2 -1
- package/dist/esm/src/ops/index.js +2 -1
- package/dist/types/src/Dream.d.ts +0 -6
- package/dist/types/src/cli/logger/DreamCliLogger.d.ts +6 -1
- package/dist/types/src/helpers/db/columnAllowsNull.d.ts +2 -0
- package/dist/types/src/serializer/builders/DreamSerializerBuilder.d.ts +2 -2
- package/dist/types/src/types/serializer.d.ts +4 -4
- package/dist/types/src/types/serializer.ts +4 -14
- package/docs/classes/db.DreamMigrationHelpers.html +9 -9
- package/docs/classes/db.KyselyQueryDriver.html +32 -32
- package/docs/classes/db.PostgresQueryDriver.html +33 -33
- package/docs/classes/db.QueryDriverBase.html +31 -31
- package/docs/classes/errors.CheckConstraintViolation.html +3 -3
- package/docs/classes/errors.ColumnOverflow.html +3 -3
- package/docs/classes/errors.CreateOrFindByFailedToCreateAndFind.html +3 -3
- package/docs/classes/errors.DataIncompatibleWithDatabaseField.html +3 -3
- package/docs/classes/errors.DataTypeColumnTypeMismatch.html +3 -3
- package/docs/classes/errors.GlobalNameNotSet.html +3 -3
- package/docs/classes/errors.InvalidCalendarDate.html +2 -2
- package/docs/classes/errors.InvalidClockTime.html +2 -2
- package/docs/classes/errors.InvalidClockTimeTz.html +2 -2
- package/docs/classes/errors.InvalidDateTime.html +2 -2
- package/docs/classes/errors.MissingSerializersDefinition.html +3 -3
- package/docs/classes/errors.NonLoadedAssociation.html +3 -3
- package/docs/classes/errors.NotNullViolation.html +3 -3
- package/docs/classes/errors.RecordNotFound.html +3 -3
- package/docs/classes/errors.ValidationError.html +3 -3
- package/docs/classes/index.CalendarDate.html +33 -33
- package/docs/classes/index.ClockTime.html +32 -32
- package/docs/classes/index.ClockTimeTz.html +35 -35
- package/docs/classes/index.DateTime.html +86 -86
- package/docs/classes/index.Decorators.html +19 -19
- package/docs/classes/index.Dream.html +118 -118
- package/docs/classes/index.DreamApp.html +5 -5
- package/docs/classes/index.DreamTransaction.html +2 -2
- package/docs/classes/index.Env.html +2 -2
- package/docs/classes/index.Query.html +56 -56
- package/docs/classes/system.CliFileWriter.html +4 -4
- package/docs/classes/system.DreamBin.html +2 -2
- package/docs/classes/system.DreamCLI.html +6 -6
- package/docs/classes/system.DreamImporter.html +2 -2
- package/docs/classes/system.DreamLogos.html +2 -2
- package/docs/classes/system.DreamSerializerBuilder.html +13 -13
- package/docs/classes/system.ObjectSerializerBuilder.html +8 -8
- package/docs/classes/system.PathHelpers.html +3 -3
- package/docs/classes/utils.Encrypt.html +2 -2
- package/docs/classes/utils.Range.html +2 -2
- package/docs/functions/db.closeAllDbConnections.html +1 -1
- package/docs/functions/db.dreamDbConnections.html +1 -1
- package/docs/functions/db.untypedDb.html +1 -1
- package/docs/functions/db.validateColumn.html +1 -1
- package/docs/functions/db.validateTable.html +1 -1
- package/docs/functions/errors.pgErrorType.html +1 -1
- package/docs/functions/index.DreamSerializer.html +1 -1
- package/docs/functions/index.ObjectSerializer.html +1 -1
- package/docs/functions/index.ReplicaSafe.html +1 -1
- package/docs/functions/index.STI.html +1 -1
- package/docs/functions/index.SoftDelete.html +1 -1
- package/docs/functions/utils.camelize.html +1 -1
- package/docs/functions/utils.capitalize.html +1 -1
- package/docs/functions/utils.cloneDeepSafe.html +1 -1
- package/docs/functions/utils.compact.html +1 -1
- package/docs/functions/utils.groupBy.html +1 -1
- package/docs/functions/utils.hyphenize.html +1 -1
- package/docs/functions/utils.intersection.html +1 -1
- package/docs/functions/utils.isEmpty.html +1 -1
- package/docs/functions/utils.normalizeUnicode.html +1 -1
- package/docs/functions/utils.pascalize.html +1 -1
- package/docs/functions/utils.percent.html +1 -1
- package/docs/functions/utils.range.html +1 -1
- package/docs/functions/utils.round.html +1 -1
- package/docs/functions/utils.sanitizeString.html +1 -1
- package/docs/functions/utils.snakeify.html +1 -1
- package/docs/functions/utils.sort.html +1 -1
- package/docs/functions/utils.sortBy.html +1 -1
- package/docs/functions/utils.sortObjectByKey.html +1 -1
- package/docs/functions/utils.sortObjectByValue.html +1 -1
- package/docs/functions/utils.uncapitalize.html +1 -1
- package/docs/functions/utils.uniq.html +1 -1
- package/docs/interfaces/openapi.OpenapiDescription.html +2 -2
- package/docs/interfaces/openapi.OpenapiSchemaProperties.html +1 -1
- package/docs/interfaces/openapi.OpenapiSchemaPropertiesShorthand.html +1 -1
- package/docs/interfaces/openapi.OpenapiTypeFieldObject.html +1 -1
- package/docs/interfaces/types.BelongsToStatement.html +2 -2
- package/docs/interfaces/types.DecoratorContext.html +2 -2
- package/docs/interfaces/types.DreamAppInitOptions.html +2 -2
- package/docs/interfaces/types.DreamAppOpts.html +2 -2
- package/docs/interfaces/types.DurationObject.html +2 -2
- package/docs/interfaces/types.EncryptOptions.html +2 -2
- package/docs/interfaces/types.InternalAnyTypedSerializerRendersMany.html +2 -2
- package/docs/interfaces/types.InternalAnyTypedSerializerRendersOne.html +2 -2
- package/docs/interfaces/types.SerializerRendererOpts.html +2 -2
- package/docs/types/openapi.CommonOpenapiSchemaObjectFields.html +1 -1
- package/docs/types/openapi.OpenapiAllTypes.html +1 -1
- package/docs/types/openapi.OpenapiFormats.html +1 -1
- package/docs/types/openapi.OpenapiNumberFormats.html +1 -1
- package/docs/types/openapi.OpenapiPrimitiveBaseTypes.html +1 -1
- package/docs/types/openapi.OpenapiPrimitiveTypes.html +1 -1
- package/docs/types/openapi.OpenapiSchemaArray.html +1 -1
- package/docs/types/openapi.OpenapiSchemaArrayShorthand.html +1 -1
- package/docs/types/openapi.OpenapiSchemaBase.html +1 -1
- package/docs/types/openapi.OpenapiSchemaBody.html +1 -1
- package/docs/types/openapi.OpenapiSchemaBodyShorthand.html +1 -1
- package/docs/types/openapi.OpenapiSchemaCommonFields.html +1 -1
- package/docs/types/openapi.OpenapiSchemaExpressionAllOf.html +2 -2
- package/docs/types/openapi.OpenapiSchemaExpressionAnyOf.html +2 -2
- package/docs/types/openapi.OpenapiSchemaExpressionOneOf.html +2 -2
- package/docs/types/openapi.OpenapiSchemaExpressionRef.html +2 -2
- package/docs/types/openapi.OpenapiSchemaExpressionRefSchemaShorthand.html +2 -2
- package/docs/types/openapi.OpenapiSchemaInteger.html +1 -1
- package/docs/types/openapi.OpenapiSchemaNull.html +2 -2
- package/docs/types/openapi.OpenapiSchemaNumber.html +1 -1
- package/docs/types/openapi.OpenapiSchemaObject.html +1 -1
- package/docs/types/openapi.OpenapiSchemaObjectAllOf.html +1 -1
- package/docs/types/openapi.OpenapiSchemaObjectAllOfShorthand.html +1 -1
- package/docs/types/openapi.OpenapiSchemaObjectAnyOf.html +1 -1
- package/docs/types/openapi.OpenapiSchemaObjectAnyOfShorthand.html +1 -1
- package/docs/types/openapi.OpenapiSchemaObjectBase.html +1 -1
- package/docs/types/openapi.OpenapiSchemaObjectBaseShorthand.html +1 -1
- package/docs/types/openapi.OpenapiSchemaObjectOneOf.html +1 -1
- package/docs/types/openapi.OpenapiSchemaObjectOneOfShorthand.html +1 -1
- package/docs/types/openapi.OpenapiSchemaObjectShorthand.html +1 -1
- package/docs/types/openapi.OpenapiSchemaPrimitiveGeneric.html +1 -1
- package/docs/types/openapi.OpenapiSchemaShorthandExpressionAllOf.html +2 -2
- package/docs/types/openapi.OpenapiSchemaShorthandExpressionAnyOf.html +2 -2
- package/docs/types/openapi.OpenapiSchemaShorthandExpressionOneOf.html +2 -2
- package/docs/types/openapi.OpenapiSchemaShorthandExpressionSerializableRef.html +2 -2
- package/docs/types/openapi.OpenapiSchemaShorthandExpressionSerializerRef.html +2 -2
- package/docs/types/openapi.OpenapiSchemaShorthandPrimitiveGeneric.html +1 -1
- package/docs/types/openapi.OpenapiSchemaString.html +1 -1
- package/docs/types/openapi.OpenapiShorthandAllTypes.html +1 -1
- package/docs/types/openapi.OpenapiShorthandPrimitiveBaseTypes.html +1 -1
- package/docs/types/openapi.OpenapiShorthandPrimitiveTypes.html +1 -1
- package/docs/types/openapi.OpenapiTypeField.html +1 -1
- package/docs/types/system.DreamAppAllowedPackageManagersEnum.html +1 -1
- package/docs/types/types.CalendarDateDurationUnit.html +1 -1
- package/docs/types/types.CalendarDateObject.html +1 -1
- package/docs/types/types.Camelized.html +1 -1
- package/docs/types/types.ClockTimeObject.html +1 -1
- package/docs/types/types.DbConnectionType.html +1 -1
- package/docs/types/types.DbTypes.html +1 -1
- package/docs/types/types.DreamAssociationMetadata.html +1 -1
- package/docs/types/types.DreamAttributes.html +1 -1
- package/docs/types/types.DreamClassAssociationAndStatement.html +1 -1
- package/docs/types/types.DreamClassColumn.html +1 -1
- package/docs/types/types.DreamColumn.html +1 -1
- package/docs/types/types.DreamColumnNames.html +1 -1
- package/docs/types/types.DreamLogLevel.html +1 -1
- package/docs/types/types.DreamLogger.html +2 -2
- package/docs/types/types.DreamModelSerializerType.html +1 -1
- package/docs/types/types.DreamOrViewModelClassSerializerKey.html +1 -1
- package/docs/types/types.DreamOrViewModelSerializerKey.html +1 -1
- package/docs/types/types.DreamParamSafeAttributes.html +1 -1
- package/docs/types/types.DreamParamSafeColumnNames.html +1 -1
- package/docs/types/types.DreamSerializable.html +1 -1
- package/docs/types/types.DreamSerializableArray.html +1 -1
- package/docs/types/types.DreamSerializerKey.html +1 -1
- package/docs/types/types.DreamSerializers.html +1 -1
- package/docs/types/types.DreamVirtualColumns.html +1 -1
- package/docs/types/types.DurationUnit.html +1 -1
- package/docs/types/types.EncryptAlgorithm.html +1 -1
- package/docs/types/types.HasManyStatement.html +1 -1
- package/docs/types/types.HasOneStatement.html +1 -1
- package/docs/types/types.Hyphenized.html +1 -1
- package/docs/types/types.Pascalized.html +1 -1
- package/docs/types/types.PrimaryKeyType.html +1 -1
- package/docs/types/types.RoundingPrecision.html +1 -1
- package/docs/types/types.SerializerCasing.html +1 -1
- package/docs/types/types.SimpleObjectSerializerType.html +1 -1
- package/docs/types/types.Snakeified.html +1 -1
- package/docs/types/types.StrictInterface.html +1 -1
- package/docs/types/types.UpdateableAssociationProperties.html +1 -1
- package/docs/types/types.UpdateableProperties.html +1 -1
- package/docs/types/types.ValidationType.html +1 -1
- package/docs/types/types.ViewModel.html +2 -2
- package/docs/types/types.ViewModelClass.html +1 -1
- package/docs/types/types.WeekdayName.html +1 -1
- package/docs/types/types.WhereStatementForDream.html +1 -1
- package/docs/types/types.WhereStatementForDreamClass.html +1 -1
- package/docs/variables/index.DreamConst.html +1 -1
- package/docs/variables/index.ops.html +1 -1
- package/docs/variables/openapi.openapiPrimitiveTypes.html +1 -1
- package/docs/variables/openapi.openapiShorthandPrimitiveTypes.html +1 -1
- package/docs/variables/system.DreamAppAllowedPackageManagersEnumValues.html +1 -1
- package/docs/variables/system.primaryKeyTypes.html +1 -1
- package/package.json +6 -8
|
@@ -1,25 +1,126 @@
|
|
|
1
|
+
import c from 'yoctocolors';
|
|
1
2
|
import DreamCliLoggableText from './loggable/DreamCliLoggableText.js';
|
|
3
|
+
const SPINNER_FRAMES = ['✺', '✹', '✸', '✷', '✶', '✵', '✴', '✵', '✶', '✷', '✸', '✹'];
|
|
4
|
+
const EYE_FRAMES = ['─', '◡', '◯', '◉', '●', '◉', '◯', '◡'];
|
|
5
|
+
const SPINNER_INTERVAL_MS = 200;
|
|
6
|
+
function formatElapsed(ms) {
|
|
7
|
+
if (ms < 1000)
|
|
8
|
+
return `${ms}ms`;
|
|
9
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
10
|
+
}
|
|
2
11
|
export default class DreamCliLogger {
|
|
12
|
+
spinner = null;
|
|
3
13
|
log(text, { logPrefix, logPrefixColor, logPrefixBgColor } = {}) {
|
|
4
14
|
const loggable = new DreamCliLoggableText(text, {
|
|
5
15
|
logPrefix,
|
|
6
|
-
logPrefixColor: logPrefixColor || '
|
|
16
|
+
logPrefixColor: logPrefixColor || 'greenBright',
|
|
7
17
|
logPrefixBgColor,
|
|
8
18
|
});
|
|
9
19
|
loggable.render();
|
|
10
20
|
}
|
|
11
21
|
async logProgress(text, cb, { logPrefix = '✺ ┌', logPrefixColor, logPrefixBgColor } = {}) {
|
|
12
|
-
this.
|
|
22
|
+
this.logStartProgress(text, { logPrefix, logPrefixColor, logPrefixBgColor });
|
|
13
23
|
await cb();
|
|
14
24
|
this.logEndProgress();
|
|
15
25
|
}
|
|
16
|
-
logStartProgress(text, {
|
|
17
|
-
|
|
26
|
+
logStartProgress(text, { logPrefixColor, logPrefixBgColor } = {}) {
|
|
27
|
+
if (!process.stdout.isTTY) {
|
|
28
|
+
this.log(text, { logPrefix: '✺ ┌', logPrefixColor: logPrefixColor || 'greenBright', logPrefixBgColor });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.startTopSpinner(text);
|
|
32
|
+
}
|
|
33
|
+
startTopSpinner(text) {
|
|
34
|
+
const renderFrame = (frameIndex) => {
|
|
35
|
+
const star = SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length];
|
|
36
|
+
process.stdout.write(`${this.escapeSequence('clearLine')}${c.yellow(`${star} ┌`)} ${c.yellow(text)}`);
|
|
37
|
+
};
|
|
38
|
+
renderFrame(0);
|
|
39
|
+
const interval = setInterval(() => {
|
|
40
|
+
if (this.spinner && !this.spinner.committed) {
|
|
41
|
+
this.spinner.frameIndex++;
|
|
42
|
+
renderFrame(this.spinner.frameIndex);
|
|
43
|
+
}
|
|
44
|
+
}, SPINNER_INTERVAL_MS);
|
|
45
|
+
this.spinner = {
|
|
46
|
+
actionText: text,
|
|
47
|
+
startTime: Date.now(),
|
|
48
|
+
frameIndex: 0,
|
|
49
|
+
interval,
|
|
50
|
+
committed: false,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
startBottomSpinner() {
|
|
54
|
+
if (!process.stdout.isTTY || !this.spinner)
|
|
55
|
+
return;
|
|
56
|
+
const renderFrame = (frameIndex) => {
|
|
57
|
+
const eye = EYE_FRAMES[frameIndex % EYE_FRAMES.length];
|
|
58
|
+
process.stdout.write(`${this.escapeSequence('clearLine')}${c.yellow(eye)} ${c.yellow(`└ ${this.spinner.actionText}`)}`);
|
|
59
|
+
};
|
|
60
|
+
this.spinner.frameIndex = 0;
|
|
61
|
+
renderFrame(0);
|
|
62
|
+
this.spinner.interval = setInterval(() => {
|
|
63
|
+
if (this.spinner) {
|
|
64
|
+
this.spinner.frameIndex++;
|
|
65
|
+
renderFrame(this.spinner.frameIndex);
|
|
66
|
+
}
|
|
67
|
+
}, SPINNER_INTERVAL_MS);
|
|
18
68
|
}
|
|
19
69
|
logContinueProgress(text, { logPrefix = ' ├', logPrefixColor, logPrefixBgColor } = {}) {
|
|
20
|
-
this.
|
|
70
|
+
if (this.spinner && !this.spinner.committed) {
|
|
71
|
+
clearInterval(this.spinner.interval);
|
|
72
|
+
// Overwrite the yellow animated header with green past-tense text before marking
|
|
73
|
+
// the spinner as committed
|
|
74
|
+
process.stdout.write(`${this.escapeSequence('clearLine')}${c.greenBright('✺ ┌')} ${c.greenBright(this.spinner.actionText)}\n`);
|
|
75
|
+
this.spinner.committed = true;
|
|
76
|
+
this.log(text, { logPrefix, logPrefixColor, logPrefixBgColor });
|
|
77
|
+
this.startBottomSpinner();
|
|
78
|
+
}
|
|
79
|
+
else if (this.spinner?.committed) {
|
|
80
|
+
// Clear the bottom running... spinner, log sub-line, then re-show it
|
|
81
|
+
clearInterval(this.spinner.interval);
|
|
82
|
+
this.clearLine();
|
|
83
|
+
this.log(text, { logPrefix, logPrefixColor, logPrefixBgColor });
|
|
84
|
+
this.startBottomSpinner();
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.log(text, { logPrefix, logPrefixColor, logPrefixBgColor });
|
|
88
|
+
}
|
|
21
89
|
}
|
|
22
90
|
logEndProgress(text = 'complete', { logPrefix = ' └', logPrefixColor, logPrefixBgColor } = {}) {
|
|
23
|
-
this.
|
|
91
|
+
if (!this.spinner) {
|
|
92
|
+
this.log(text, { logPrefix, logPrefixColor, logPrefixBgColor });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const spinner = this.spinner;
|
|
96
|
+
this.spinner = null;
|
|
97
|
+
clearInterval(spinner.interval);
|
|
98
|
+
const elapsed = Date.now() - spinner.startTime;
|
|
99
|
+
const elapsedStr = formatElapsed(elapsed);
|
|
100
|
+
if (!spinner.committed) {
|
|
101
|
+
// No sub-lines: overwrite the spinner in-place with the green completed header
|
|
102
|
+
process.stdout.write(`${this.escapeSequence('clearLine')}${c.greenBright('✺ ┌')} ${c.greenBright(spinner.actionText)}\n`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Has sub-lines: clear the bottom running... spinner line
|
|
106
|
+
if (process.stdout.isTTY)
|
|
107
|
+
this.clearLine();
|
|
108
|
+
}
|
|
109
|
+
this.log(c.greenBright(`done in ${elapsedStr}\n`), {
|
|
110
|
+
logPrefix,
|
|
111
|
+
logPrefixColor: logPrefixColor || 'greenBright',
|
|
112
|
+
logPrefixBgColor,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
clearLine() {
|
|
116
|
+
process.stdout.write(this.escapeSequence('clearLine'));
|
|
117
|
+
}
|
|
118
|
+
escapeSequence(sequence) {
|
|
119
|
+
switch (sequence) {
|
|
120
|
+
case 'clearLine':
|
|
121
|
+
return `\r\x1b[2K`;
|
|
122
|
+
default:
|
|
123
|
+
throw new Error(`unexpected sequence: ${sequence}`);
|
|
124
|
+
}
|
|
24
125
|
}
|
|
25
126
|
}
|
|
@@ -28,8 +28,8 @@ export default async function syncDbTypesFiles(connectionName) {
|
|
|
28
28
|
const kyselyCodegenCmd = `kysely-codegen ${dialect} ${url} ${includePattern} ${excludePattern} ${outfile}`;
|
|
29
29
|
await sspawn(kyselyCodegenCmd, {
|
|
30
30
|
onStdout: message => {
|
|
31
|
-
DreamCLI.logger.logContinueProgress(colorize(`[db]`, { color: '
|
|
32
|
-
logPrefixColor: '
|
|
31
|
+
DreamCLI.logger.logContinueProgress(colorize(`[db]`, { color: 'greenBright' }) + ' ' + message, {
|
|
32
|
+
logPrefixColor: 'greenBright',
|
|
33
33
|
});
|
|
34
34
|
},
|
|
35
35
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import InternalEncrypt from '../../encrypt/InternalEncrypt.js';
|
|
2
2
|
import DoNotSetEncryptedFieldsDirectly from '../../errors/DoNotSetEncryptedFieldsDirectly.js';
|
|
3
|
+
import columnAllowsNull from '../../helpers/db/columnAllowsNull.js';
|
|
3
4
|
import pascalize from '../../helpers/pascalize.js';
|
|
4
5
|
export default function Encrypted(encryptedColumnName) {
|
|
5
6
|
return function (_, context) {
|
|
@@ -29,7 +30,7 @@ export default function Encrypted(encryptedColumnName) {
|
|
|
29
30
|
;
|
|
30
31
|
dreamClass['virtualAttributes'].push({
|
|
31
32
|
property: key,
|
|
32
|
-
type: 'string',
|
|
33
|
+
type: columnAllowsNull(dreamClass, encryptedKey) ? ['string', 'null'] : 'string',
|
|
33
34
|
});
|
|
34
35
|
if (!Object.getOwnPropertyDescriptor(dreamClass, 'explicitUnsafeParamColumns')) {
|
|
35
36
|
// This pattern allows `explicitUnsafeParamColumns` on a base STI class and on
|
|
@@ -157,13 +157,13 @@ export default class PostgresQueryDriver extends KyselyQueryDriver {
|
|
|
157
157
|
const client = await loadPgClient({ useSystemDb: true, connectionName });
|
|
158
158
|
if (EnvInternal.boolean('DREAM_CORE_DEVELOPMENT')) {
|
|
159
159
|
const replicaTestWorkerDatabaseName = `replica_test_${dbConf.name}`;
|
|
160
|
-
DreamCLI.logger.logContinueProgress(`creating fake replica test database ${replicaTestWorkerDatabaseName}...`, { logPrefix: ' ├ [db]', logPrefixColor: '
|
|
160
|
+
DreamCLI.logger.logContinueProgress(`creating fake replica test database ${replicaTestWorkerDatabaseName}...`, { logPrefix: ' ├ [db]', logPrefixColor: 'greenBright' });
|
|
161
161
|
await client.query(`DROP DATABASE IF EXISTS ${replicaTestWorkerDatabaseName};`);
|
|
162
162
|
await client.query(`CREATE DATABASE ${replicaTestWorkerDatabaseName} TEMPLATE ${dbConf.name};`);
|
|
163
163
|
}
|
|
164
164
|
for (let i = 2; i <= parallelTests; i++) {
|
|
165
165
|
const workerDatabaseName = `${dbConf.name}_${i}`;
|
|
166
|
-
DreamCLI.logger.logContinueProgress(`creating duplicate test database ${workerDatabaseName} for concurrent tests...`, { logPrefix: ' ├ [db]', logPrefixColor: '
|
|
166
|
+
DreamCLI.logger.logContinueProgress(`creating duplicate test database ${workerDatabaseName} for concurrent tests...`, { logPrefix: ' ├ [db]', logPrefixColor: 'greenBright' });
|
|
167
167
|
await client.query(`DROP DATABASE IF EXISTS ${workerDatabaseName};`);
|
|
168
168
|
await client.query(`CREATE DATABASE ${workerDatabaseName} TEMPLATE ${dbConf.name};`);
|
|
169
169
|
}
|
|
@@ -88,8 +88,8 @@ function migratedActionPastTense(mode) {
|
|
|
88
88
|
function logResults(results, mode) {
|
|
89
89
|
results?.forEach(it => {
|
|
90
90
|
if (it.status === 'Success') {
|
|
91
|
-
DreamCLI.logger.logContinueProgress(colorize(`[db]`, { color: '
|
|
92
|
-
` migration "${it.migrationName}" was ${migratedActionPastTense(mode)} successfully`, { logPrefixColor: '
|
|
91
|
+
DreamCLI.logger.logContinueProgress(colorize(`[db]`, { color: 'greenBright' }) +
|
|
92
|
+
` migration "${it.migrationName}" was ${migratedActionPastTense(mode)} successfully`, { logPrefixColor: 'greenBright' });
|
|
93
93
|
}
|
|
94
94
|
else if (it.status === 'Error') {
|
|
95
95
|
DreamCLI.logger.logContinueProgress(JSON.stringify(it, null, 2));
|
|
@@ -22,14 +22,14 @@ async function maybeDropDuplicateDatabases(client, dbName) {
|
|
|
22
22
|
return;
|
|
23
23
|
if (EnvInternal.boolean('DREAM_CORE_DEVELOPMENT')) {
|
|
24
24
|
const replicaTestWorkerDatabaseName = `replica_test_${dbName}`;
|
|
25
|
-
DreamCLI.logger.logContinueProgress(`dropping fake replica test database ${replicaTestWorkerDatabaseName}`, { logPrefix: ' ├ [db]', logPrefixColor: '
|
|
25
|
+
DreamCLI.logger.logContinueProgress(`dropping fake replica test database ${replicaTestWorkerDatabaseName}`, { logPrefix: ' ├ [db]', logPrefixColor: 'greenBright' });
|
|
26
26
|
await client.query(`DROP DATABASE IF EXISTS ${replicaTestWorkerDatabaseName};`);
|
|
27
27
|
}
|
|
28
28
|
for (let i = 2; i <= parallelTests; i++) {
|
|
29
29
|
const workerDatabaseName = `${dbName}_${i}`;
|
|
30
30
|
DreamCLI.logger.logContinueProgress(`dropping duplicate test database ${workerDatabaseName}`, {
|
|
31
31
|
logPrefix: ' ├ [db]',
|
|
32
|
-
logPrefixColor: '
|
|
32
|
+
logPrefixColor: 'greenBright',
|
|
33
33
|
});
|
|
34
34
|
await client.query(`DROP DATABASE IF EXISTS ${workerDatabaseName};`);
|
|
35
35
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import cachedTypeForAttribute from './cachedTypeForAttribute.js';
|
|
1
2
|
import DataTypeColumnTypeMismatch from '../../errors/db/DataTypeColumnTypeMismatch.js';
|
|
2
3
|
import BaseClockTime from '../../utils/datetime/BaseClockTime.js';
|
|
3
4
|
import CalendarDate from '../../utils/datetime/CalendarDate.js';
|
|
@@ -7,7 +8,7 @@ import { DateTime } from '../../utils/datetime/DateTime.js';
|
|
|
7
8
|
import normalizeUnicode from '../normalizeUnicode.js';
|
|
8
9
|
import { DATE_OR_DATE_ARRAY_COLUMN_CHECK_REGEXP, DATETIME_OR_DATETIME_ARRAY_COLUMN_CHECK_REGEXP, STRING_OR_STRING_ARRAY_COLUMN_CHECK_REGEXP, TIME_WITH_TIMEZONE_COLUMN_CHECK_REGEXP, TIME_WITHOUT_TIMEZONE_COLUMN_CHECK_REGEXP, } from './types/helpers.js';
|
|
9
10
|
export function normalizeDataForDb({ val, dreamClass, column, }) {
|
|
10
|
-
const columnType = dreamClass
|
|
11
|
+
const columnType = cachedTypeForAttribute(dreamClass, column);
|
|
11
12
|
if (val instanceof DateTime || DATETIME_OR_DATETIME_ARRAY_COLUMN_CHECK_REGEXP.test(columnType)) {
|
|
12
13
|
return dateTimeOrDateToSql(DateTime, val);
|
|
13
14
|
//
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
+
import cachedTypeForAttribute from '../cachedTypeForAttribute.js';
|
|
1
2
|
import { DATETIME_OR_DATETIME_ARRAY_COLUMN_CHECK_REGEXP } from './helpers.js';
|
|
2
3
|
export default function isDatetimeOrDatetimeArrayColumn(dreamClass, column) {
|
|
3
|
-
return DATETIME_OR_DATETIME_ARRAY_COLUMN_CHECK_REGEXP.test(dreamClass
|
|
4
|
+
return DATETIME_OR_DATETIME_ARRAY_COLUMN_CHECK_REGEXP.test(cachedTypeForAttribute(dreamClass, column));
|
|
4
5
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import cachedTypeForAttribute from '../cachedTypeForAttribute.js';
|
|
1
2
|
export default function isJsonColumn(dreamClass, column) {
|
|
2
|
-
return ['json', 'jsonb'].includes(dreamClass
|
|
3
|
+
return ['json', 'jsonb'].includes(cachedTypeForAttribute(dreamClass, column));
|
|
3
4
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { sql } from 'kysely';
|
|
2
2
|
import AnyRequiresArrayColumn from '../errors/ops/AnyRequiresArrayColumn.js';
|
|
3
|
+
import cachedTypeForAttribute from '../helpers/db/cachedTypeForAttribute.js';
|
|
3
4
|
import isDatabaseArrayColumn from '../helpers/db/types/isDatabaseArrayColumn.js';
|
|
4
5
|
import CurriedOpsStatement from './curried-ops-statement.js';
|
|
5
6
|
import OpsStatement from './ops-statement.js';
|
|
@@ -10,7 +11,7 @@ const ops = {
|
|
|
10
11
|
const column = fieldName.replace(/^.*\./, '');
|
|
11
12
|
if (!isDatabaseArrayColumn(dreamClass, column))
|
|
12
13
|
throw new AnyRequiresArrayColumn(dreamClass, column);
|
|
13
|
-
const castType = dreamClass
|
|
14
|
+
const castType = cachedTypeForAttribute(dreamClass, column);
|
|
14
15
|
return new OpsStatement('@>', sql `ARRAY[${sql.join([value])}]::${sql.raw(castType)}`);
|
|
15
16
|
}),
|
|
16
17
|
like: (like) => new OpsStatement('like', like),
|
|
@@ -2061,12 +2061,6 @@ export default class Dream {
|
|
|
2061
2061
|
* ```
|
|
2062
2062
|
*/
|
|
2063
2063
|
getAttributes<I extends Dream, DB extends I['DB']>(this: I): Selectable<DB[I['table']]>;
|
|
2064
|
-
/**
|
|
2065
|
-
* @internal
|
|
2066
|
-
*
|
|
2067
|
-
* Returns the db type stored within the database
|
|
2068
|
-
*/
|
|
2069
|
-
private static cachedTypeFor;
|
|
2070
2064
|
/**
|
|
2071
2065
|
* Returns the attributes that have changed since
|
|
2072
2066
|
* being persisted to the database, with the values
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { DreamCliLoggerLogOpts } from '../../types/logger.js';
|
|
2
2
|
export default class DreamCliLogger {
|
|
3
|
+
private spinner;
|
|
3
4
|
log(text: string, { logPrefix, logPrefixColor, logPrefixBgColor }?: DreamCliLoggerLogOpts): void;
|
|
4
5
|
logProgress(text: string, cb: () => void | Promise<void>, { logPrefix, logPrefixColor, logPrefixBgColor }?: DreamCliLoggerLogOpts): Promise<void>;
|
|
5
|
-
logStartProgress(text: string, {
|
|
6
|
+
logStartProgress(text: string, { logPrefixColor, logPrefixBgColor }?: DreamCliLoggerLogOpts): void;
|
|
7
|
+
private startTopSpinner;
|
|
8
|
+
private startBottomSpinner;
|
|
6
9
|
logContinueProgress(text: string, { logPrefix, logPrefixColor, logPrefixBgColor }?: DreamCliLoggerLogOpts): void;
|
|
7
10
|
logEndProgress(text?: string, { logPrefix, logPrefixColor, logPrefixBgColor }?: DreamCliLoggerLogOpts): void;
|
|
11
|
+
private clearLine;
|
|
12
|
+
private escapeSequence;
|
|
8
13
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import Dream from '../../Dream.js';
|
|
2
|
+
export default function columnAllowsNull<T extends typeof Dream, DB extends InstanceType<T>['DB'], TableName extends keyof DB = InstanceType<T>['table'] & keyof DB, Table extends DB[keyof DB] = DB[TableName]>(dreamClass: T, attribute: keyof Table): boolean;
|
|
@@ -38,7 +38,7 @@ export default class DreamSerializerBuilder<DataTypeForOpenapi extends typeof Dr
|
|
|
38
38
|
attribute(name: NonJsonDreamColumnNames<DataType> & keyof DataType & 'type', options?: AutomaticSerializerAttributeOptionsForType): DreamSerializerBuilder<DataTypeForOpenapi, MaybeNullDataType, PassthroughDataType, DataType>;
|
|
39
39
|
attribute(name: DreamVirtualColumns<DataType>[number], options?: SerializerAttributeOptionsForVirtualColumn): DreamSerializerBuilder<DataTypeForOpenapi, MaybeNullDataType, PassthroughDataType, DataType>;
|
|
40
40
|
attribute<MaybeAttributeName extends NonJsonDreamColumnNames<DataType> | (keyof DataType & string), AttributeName extends MaybeAttributeName extends NonJsonDreamColumnNames<DataType> ? never : Exclude<keyof DataType, keyof Dream> & string>(name: AttributeName, options: NonAutomaticSerializerAttributeOptionsWithPossibleDecimalRenderOption): DreamSerializerBuilder<DataTypeForOpenapi, MaybeNullDataType, PassthroughDataType, DataType>;
|
|
41
|
-
attribute<AttributeName extends NonJsonDreamColumnNames<DataType> & keyof DataType & string>(name: AttributeName, options?: AutomaticSerializerAttributeOptions
|
|
41
|
+
attribute<AttributeName extends NonJsonDreamColumnNames<DataType> & keyof DataType & string>(name: AttributeName, options?: AutomaticSerializerAttributeOptions): DreamSerializerBuilder<DataTypeForOpenapi, MaybeNullDataType, PassthroughDataType, DataType>;
|
|
42
42
|
/**
|
|
43
43
|
* Includes an attribute from a nested object in the serialized output.
|
|
44
44
|
*
|
|
@@ -67,7 +67,7 @@ export default class DreamSerializerBuilder<DataTypeForOpenapi extends typeof Dr
|
|
|
67
67
|
*
|
|
68
68
|
* See: {@link https://your-docs-url.com/docs/serializers/attributes | Serializer Attributes Documentation}
|
|
69
69
|
*/
|
|
70
|
-
delegatedAttribute<ProvidedModelType = undefined, ProvidedTargetName extends ProvidedModelType extends undefined ? undefined : Exclude<keyof ProvidedModelType, keyof Dream> = ProvidedModelType extends undefined ? undefined : Exclude<keyof ProvidedModelType, keyof Dream>, ActualDataType extends ProvidedModelType extends undefined ? DataType : ProvidedModelType = ProvidedModelType extends undefined ? DataType : ProvidedModelType, TargetName extends ProvidedTargetName extends undefined ? Exclude<keyof ActualDataType, keyof Dream> : ProvidedTargetName & keyof ActualDataType = ProvidedTargetName extends undefined ? Exclude<keyof ActualDataType, keyof Dream> : ProvidedTargetName & keyof ActualDataType, AssociatedModelType = Exclude<ActualDataType[TargetName], null>, TargetAttributeName extends AssociatedModelType extends object ? Exclude<keyof AssociatedModelType, keyof Dream> & string : never = AssociatedModelType extends object ? Exclude<keyof AssociatedModelType, keyof Dream> & string : never>(targetName: TargetName, name: TargetAttributeName, options?: AssociatedModelType extends Dream ? TargetAttributeName extends NonJsonDreamColumnNames<AssociatedModelType> & keyof AssociatedModelType & 'type' ? AutomaticSerializerAttributeOptionsForType : TargetAttributeName extends DreamVirtualColumns<AssociatedModelType>[number] ? SerializerAttributeOptionsForVirtualColumn : TargetAttributeName extends AssociatedModelType & keyof AssociatedModelType & string ? AutomaticSerializerAttributeOptions
|
|
70
|
+
delegatedAttribute<ProvidedModelType = undefined, ProvidedTargetName extends ProvidedModelType extends undefined ? undefined : Exclude<keyof ProvidedModelType, keyof Dream> = ProvidedModelType extends undefined ? undefined : Exclude<keyof ProvidedModelType, keyof Dream>, ActualDataType extends ProvidedModelType extends undefined ? DataType : ProvidedModelType = ProvidedModelType extends undefined ? DataType : ProvidedModelType, TargetName extends ProvidedTargetName extends undefined ? Exclude<keyof ActualDataType, keyof Dream> : ProvidedTargetName & keyof ActualDataType = ProvidedTargetName extends undefined ? Exclude<keyof ActualDataType, keyof Dream> : ProvidedTargetName & keyof ActualDataType, AssociatedModelType = Exclude<ActualDataType[TargetName], null>, TargetAttributeName extends AssociatedModelType extends object ? Exclude<keyof AssociatedModelType, keyof Dream> & string : never = AssociatedModelType extends object ? Exclude<keyof AssociatedModelType, keyof Dream> & string : never>(targetName: TargetName, name: TargetAttributeName, options?: AssociatedModelType extends Dream ? TargetAttributeName extends NonJsonDreamColumnNames<AssociatedModelType> & keyof AssociatedModelType & 'type' ? AutomaticSerializerAttributeOptionsForType : TargetAttributeName extends DreamVirtualColumns<AssociatedModelType>[number] ? SerializerAttributeOptionsForVirtualColumn : TargetAttributeName extends AssociatedModelType & keyof AssociatedModelType & string ? AutomaticSerializerAttributeOptions | NonAutomaticSerializerAttributeOptionsWithPossibleDecimalRenderOption : NonAutomaticSerializerAttributeOptionsWithPossibleDecimalRenderOption : NonAutomaticSerializerAttributeOptionsWithPossibleDecimalRenderOption): this;
|
|
71
71
|
/**
|
|
72
72
|
* Includes a computed value in the serialized output.
|
|
73
73
|
*
|
|
@@ -2,8 +2,8 @@ import Dream from '../Dream.js';
|
|
|
2
2
|
import { RoundingPrecision } from '../helpers/round.js';
|
|
3
3
|
import DreamSerializerBuilder from '../serializer/builders/DreamSerializerBuilder.js';
|
|
4
4
|
import ObjectSerializerBuilder from '../serializer/builders/ObjectSerializerBuilder.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { DreamSerializable, DreamSerializableArray, ViewModelClass } from './dream.js';
|
|
6
|
+
import { OpenapiDescription, OpenapiSchemaBodyShorthand, OpenapiShorthandPrimitiveTypes } from './openapi.js';
|
|
7
7
|
export type SerializerCasing = 'camel' | 'snake';
|
|
8
8
|
export type DreamsOrSerializersOrViewModels = DreamSerializable | DreamSerializableArray;
|
|
9
9
|
export interface InternalAnyTypedSerializerAttribute {
|
|
@@ -45,11 +45,11 @@ export interface InternalAnyTypedSerializerRendersMany<DataType, AttributeName e
|
|
|
45
45
|
name: AttributeName;
|
|
46
46
|
options: InternalAnyRendersOneOrManyOpts;
|
|
47
47
|
}
|
|
48
|
-
export type AutomaticSerializerAttributeOptions
|
|
48
|
+
export type AutomaticSerializerAttributeOptions = {
|
|
49
49
|
as?: string;
|
|
50
50
|
default?: any;
|
|
51
51
|
openapi?: OpenapiDescription;
|
|
52
|
-
precision?:
|
|
52
|
+
precision?: RoundingPrecision;
|
|
53
53
|
required?: false;
|
|
54
54
|
};
|
|
55
55
|
export type AutomaticSerializerAttributeOptionsForType = {
|
|
@@ -2,13 +2,8 @@ import Dream from '../Dream.js'
|
|
|
2
2
|
import { RoundingPrecision } from '../helpers/round.js'
|
|
3
3
|
import DreamSerializerBuilder from '../serializer/builders/DreamSerializerBuilder.js'
|
|
4
4
|
import ObjectSerializerBuilder from '../serializer/builders/ObjectSerializerBuilder.js'
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
DecimalOpenapiTypesIncludingDbTypes,
|
|
8
|
-
OpenapiDescription,
|
|
9
|
-
OpenapiSchemaBodyShorthand,
|
|
10
|
-
OpenapiShorthandPrimitiveTypes,
|
|
11
|
-
} from './openapi.js'
|
|
5
|
+
import { DreamSerializable, DreamSerializableArray, ViewModelClass } from './dream.js'
|
|
6
|
+
import { OpenapiDescription, OpenapiSchemaBodyShorthand, OpenapiShorthandPrimitiveTypes } from './openapi.js'
|
|
12
7
|
|
|
13
8
|
export type SerializerCasing = 'camel' | 'snake'
|
|
14
9
|
export type DreamsOrSerializersOrViewModels = DreamSerializable | DreamSerializableArray
|
|
@@ -62,16 +57,11 @@ export interface InternalAnyTypedSerializerRendersMany<
|
|
|
62
57
|
options: InternalAnyRendersOneOrManyOpts
|
|
63
58
|
}
|
|
64
59
|
|
|
65
|
-
export type AutomaticSerializerAttributeOptions
|
|
66
|
-
DreamInstance extends Dream,
|
|
67
|
-
AttributeName extends keyof DreamInstance & string,
|
|
68
|
-
> = {
|
|
60
|
+
export type AutomaticSerializerAttributeOptions = {
|
|
69
61
|
as?: string
|
|
70
62
|
default?: any
|
|
71
63
|
openapi?: OpenapiDescription
|
|
72
|
-
precision?:
|
|
73
|
-
? RoundingPrecision
|
|
74
|
-
: never
|
|
64
|
+
precision?: RoundingPrecision
|
|
75
65
|
required?: false
|
|
76
66
|
}
|
|
77
67
|
|