instant-cli 0.22.177 → 0.22.178
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/.turbo/turbo-build.log +2 -2
- package/__tests__/e2e/cli.e2e.test.ts +3 -3
- package/__tests__/e2e/helpers.ts +1 -1
- package/__tests__/effectHelpers.ts +45 -0
- package/__tests__/mergeSchema.test.ts +2 -2
- package/dist/commands/claim.d.ts +6 -0
- package/dist/commands/claim.d.ts.map +1 -0
- package/dist/commands/claim.js +22 -0
- package/dist/commands/claim.js.map +1 -0
- package/dist/commands/explorer.d.ts +6 -0
- package/dist/commands/explorer.d.ts.map +1 -0
- package/dist/commands/explorer.js +13 -0
- package/dist/commands/explorer.js.map +1 -0
- package/dist/commands/info.d.ts +3 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +24 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +39 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/initWithoutFiles.d.ts +6 -0
- package/dist/commands/initWithoutFiles.d.ts.map +1 -0
- package/dist/commands/initWithoutFiles.js +64 -0
- package/dist/commands/initWithoutFiles.js.map +1 -0
- package/dist/commands/login.d.ts +9 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +52 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +4 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +21 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/pull.d.ts +6 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +16 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +6 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +20 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/query.d.ts +7 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +52 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/context/authToken.d.ts +30 -0
- package/dist/context/authToken.d.ts.map +1 -0
- package/dist/context/authToken.js +86 -0
- package/dist/context/authToken.js.map +1 -0
- package/dist/context/currentApp.d.ts +37 -0
- package/dist/context/currentApp.d.ts.map +1 -0
- package/dist/context/currentApp.js +204 -0
- package/dist/context/currentApp.js.map +1 -0
- package/dist/context/globalOpts.d.ts +11 -0
- package/dist/context/globalOpts.d.ts.map +1 -0
- package/dist/context/globalOpts.js +13 -0
- package/dist/context/globalOpts.js.map +1 -0
- package/dist/context/platformApi.d.ts +19 -0
- package/dist/context/platformApi.d.ts.map +1 -0
- package/dist/context/platformApi.js +24 -0
- package/dist/context/platformApi.js.map +1 -0
- package/dist/context/projectInfo.d.ts +29 -0
- package/dist/context/projectInfo.d.ts.map +1 -0
- package/dist/context/projectInfo.js +149 -0
- package/dist/context/projectInfo.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +6 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +41 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +169 -1781
- package/dist/index.js.map +1 -1
- package/dist/layer.d.ts +23 -0
- package/dist/layer.d.ts.map +1 -0
- package/dist/layer.js +68 -0
- package/dist/layer.js.map +1 -0
- package/dist/lib/createApp.d.ts +12 -0
- package/dist/lib/createApp.d.ts.map +1 -0
- package/dist/lib/createApp.js +15 -0
- package/dist/lib/createApp.js.map +1 -0
- package/dist/lib/handleEnv.d.ts +7 -0
- package/dist/lib/handleEnv.d.ts.map +1 -0
- package/dist/lib/handleEnv.js +91 -0
- package/dist/lib/handleEnv.js.map +1 -0
- package/dist/lib/http.d.ts +32 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +67 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/login.d.ts +13 -0
- package/dist/lib/login.d.ts.map +1 -0
- package/dist/lib/login.js +39 -0
- package/dist/lib/login.js.map +1 -0
- package/dist/lib/pullPerms.d.ts +7 -0
- package/dist/lib/pullPerms.d.ts.map +1 -0
- package/dist/lib/pullPerms.js +41 -0
- package/dist/lib/pullPerms.js.map +1 -0
- package/dist/lib/pullSchema.d.ts +12 -0
- package/dist/lib/pullSchema.d.ts.map +1 -0
- package/dist/lib/pullSchema.js +62 -0
- package/dist/lib/pullSchema.js.map +1 -0
- package/dist/lib/pushPerms.d.ts +13 -0
- package/dist/lib/pushPerms.d.ts.map +1 -0
- package/dist/lib/pushPerms.js +54 -0
- package/dist/lib/pushPerms.js.map +1 -0
- package/dist/lib/pushSchema.d.ts +53 -0
- package/dist/lib/pushSchema.d.ts.map +1 -0
- package/dist/lib/pushSchema.js +160 -0
- package/dist/lib/pushSchema.js.map +1 -0
- package/dist/lib/ui.d.ts +16 -0
- package/dist/lib/ui.d.ts.map +1 -0
- package/dist/lib/ui.js +22 -0
- package/dist/lib/ui.js.map +1 -0
- package/dist/logging.d.ts +4 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +17 -0
- package/dist/logging.js.map +1 -0
- package/dist/old.d.ts +14 -0
- package/dist/old.d.ts.map +1 -0
- package/dist/old.js +417 -0
- package/dist/old.js.map +1 -0
- package/dist/program.d.ts +3 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +3 -0
- package/dist/program.js.map +1 -0
- package/dist/renderSchemaPlan.d.ts +3 -3
- package/dist/renderSchemaPlan.d.ts.map +1 -1
- package/dist/renderSchemaPlan.js +2 -14
- package/dist/renderSchemaPlan.js.map +1 -1
- package/dist/ui/index.d.ts +4 -3
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +2 -2
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/lib.js +1 -0
- package/dist/ui/lib.js.map +1 -1
- package/dist/util/findConfigCandidates.d.ts +1 -1
- package/dist/util/findConfigCandidates.d.ts.map +1 -1
- package/dist/util/findConfigCandidates.js +1 -3
- package/dist/util/findConfigCandidates.js.map +1 -1
- package/dist/util/fs.d.ts +1 -1
- package/dist/util/fs.d.ts.map +1 -1
- package/dist/util/fs.js.map +1 -1
- package/dist/util/getAuthPaths.d.ts.map +1 -1
- package/dist/util/getAuthPaths.js.map +1 -1
- package/dist/util/isHeadlessEnvironment.d.ts +3 -1
- package/dist/util/isHeadlessEnvironment.d.ts.map +1 -1
- package/dist/util/isHeadlessEnvironment.js.map +1 -1
- package/dist/util/loadConfig.d.ts +1 -1
- package/dist/util/loadConfig.d.ts.map +1 -1
- package/dist/util/loadConfig.js +2 -2
- package/dist/util/loadConfig.js.map +1 -1
- package/dist/util/mergeSchema.d.ts +9 -1
- package/dist/util/mergeSchema.d.ts.map +1 -1
- package/dist/util/mergeSchema.js +4 -0
- package/dist/util/mergeSchema.js.map +1 -1
- package/dist/util/renamePrompt.d.ts +2 -1
- package/dist/util/renamePrompt.d.ts.map +1 -1
- package/dist/util/renamePrompt.js +1 -1
- package/dist/util/renamePrompt.js.map +1 -1
- package/package.json +17 -7
- package/src/commands/claim.ts +31 -0
- package/src/commands/explorer.ts +21 -0
- package/src/commands/info.ts +34 -0
- package/src/commands/init.ts +58 -0
- package/src/commands/initWithoutFiles.ts +107 -0
- package/src/commands/login.ts +76 -0
- package/src/commands/logout.ts +23 -0
- package/src/commands/pull.ts +23 -0
- package/src/commands/push.ts +25 -0
- package/src/commands/query.ts +61 -0
- package/src/context/authToken.ts +149 -0
- package/src/context/currentApp.ts +277 -0
- package/src/context/globalOpts.ts +22 -0
- package/src/context/platformApi.ts +35 -0
- package/src/context/projectInfo.ts +215 -0
- package/src/errors.ts +7 -0
- package/src/index.ts +428 -0
- package/src/layer.ts +155 -0
- package/src/lib/createApp.ts +28 -0
- package/src/lib/handleEnv.ts +115 -0
- package/src/lib/http.ts +148 -0
- package/src/lib/login.ts +54 -0
- package/src/lib/pullPerms.ts +50 -0
- package/src/lib/pullSchema.ts +95 -0
- package/src/lib/pushPerms.ts +80 -0
- package/src/lib/pushSchema.ts +240 -0
- package/src/lib/ui.ts +36 -0
- package/src/logging.ts +32 -0
- package/src/old.js +495 -0
- package/src/program.ts +3 -0
- package/src/renderSchemaPlan.ts +6 -18
- package/src/ui/index.ts +4 -3
- package/src/util/findConfigCandidates.ts +1 -2
- package/src/util/fs.ts +1 -1
- package/src/util/getAuthPaths.ts +1 -0
- package/src/util/isHeadlessEnvironment.ts +1 -1
- package/src/util/loadConfig.ts +3 -6
- package/src/util/{mergeSchema.js → mergeSchema.ts} +26 -16
- package/src/util/renamePrompt.ts +2 -1
- package/tsconfig.build.json +20 -0
- package/tsconfig.json +15 -5
- package/vitest.config.ts +2 -1
- package/dist/util/packageManager.d.ts +0 -3
- package/dist/util/packageManager.d.ts.map +0 -1
- package/dist/util/packageManager.js +0 -70
- package/dist/util/packageManager.js.map +0 -1
- package/dist/util/promptOk.d.ts +0 -4
- package/dist/util/promptOk.d.ts.map +0 -1
- package/dist/util/promptOk.js +0 -18
- package/dist/util/promptOk.js.map +0 -1
- package/src/index.js +0 -2333
- package/src/util/packageManager.js +0 -78
- package/src/util/promptOk.ts +0 -26
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import {
|
|
2
|
+
HttpClient,
|
|
3
|
+
HttpClientRequest,
|
|
4
|
+
HttpClientResponse,
|
|
5
|
+
} from '@effect/platform';
|
|
6
|
+
import {
|
|
7
|
+
apiSchemaToInstantSchemaDef,
|
|
8
|
+
buildAutoRenameSelector,
|
|
9
|
+
collectSystemCatalogIdentNames,
|
|
10
|
+
convertTxSteps,
|
|
11
|
+
diffSchemas,
|
|
12
|
+
SchemaValidationError as PlatformSchemaError,
|
|
13
|
+
validateSchema,
|
|
14
|
+
} from '@instantdb/platform';
|
|
15
|
+
import chalk from 'chalk';
|
|
16
|
+
import { Data, Effect, Schema } from 'effect';
|
|
17
|
+
import { CurrentApp } from '../context/currentApp.ts';
|
|
18
|
+
import {
|
|
19
|
+
readLocalSchemaFile,
|
|
20
|
+
resolveRenames,
|
|
21
|
+
waitForIndexingJobsToFinish,
|
|
22
|
+
} from '../old.js';
|
|
23
|
+
import { InstantHttpAuthed, withCommand } from './http.ts';
|
|
24
|
+
|
|
25
|
+
import boxen from 'boxen';
|
|
26
|
+
import { GlobalOpts } from '../context/globalOpts.ts';
|
|
27
|
+
import { pushDef } from '../index.ts';
|
|
28
|
+
import type { OptsFromCommand } from '../index.ts';
|
|
29
|
+
import { groupSteps, renderSchemaPlan } from '../renderSchemaPlan.ts';
|
|
30
|
+
import type { SuperMigrationTx } from '../renderSchemaPlan.ts';
|
|
31
|
+
import { promptOk } from './ui.ts';
|
|
32
|
+
import { AuthToken } from '../context/authToken.ts';
|
|
33
|
+
|
|
34
|
+
const FetchSchemaResponse = Schema.Struct({
|
|
35
|
+
schema: Schema.Struct({
|
|
36
|
+
refs: Schema.Any,
|
|
37
|
+
blobs: Schema.Any,
|
|
38
|
+
}),
|
|
39
|
+
attrs: Schema.Array(Schema.Any).pipe(Schema.mutable),
|
|
40
|
+
'app-title': Schema.String,
|
|
41
|
+
}).pipe(Schema.mutable);
|
|
42
|
+
|
|
43
|
+
export class ReadSchemaFileError extends Schema.TaggedError<ReadSchemaFileError>(
|
|
44
|
+
'ReadSchemaFileError',
|
|
45
|
+
)('ReadSchemaFileError', {
|
|
46
|
+
message: Schema.String,
|
|
47
|
+
cause: Schema.Any.pipe(Schema.optional),
|
|
48
|
+
}) {}
|
|
49
|
+
|
|
50
|
+
export class SchemaDiffError extends Schema.TaggedError<SchemaDiffError>(
|
|
51
|
+
'SchemaDiffError',
|
|
52
|
+
)('SchemaDiffError', {
|
|
53
|
+
message: Schema.String,
|
|
54
|
+
}) {}
|
|
55
|
+
|
|
56
|
+
export class GetSchemaError extends Schema.TaggedError<GetSchemaError>(
|
|
57
|
+
'GetSchemaError',
|
|
58
|
+
)('GetSchemaError', {
|
|
59
|
+
message: Schema.String,
|
|
60
|
+
}) {}
|
|
61
|
+
|
|
62
|
+
export class SchemaValidationError extends Schema.TaggedError<SchemaValidationError>(
|
|
63
|
+
'SchemaValidationError',
|
|
64
|
+
)('SchemaValidationError', {
|
|
65
|
+
message: Schema.String,
|
|
66
|
+
}) {}
|
|
67
|
+
|
|
68
|
+
export const pushSchema = (
|
|
69
|
+
rename?: OptsFromCommand<typeof pushDef>['rename'],
|
|
70
|
+
) =>
|
|
71
|
+
Effect.gen(function* () {
|
|
72
|
+
const localSchemaFile = yield* Effect.tryPromise({
|
|
73
|
+
try: readLocalSchemaFile,
|
|
74
|
+
catch: (e) =>
|
|
75
|
+
e instanceof Error
|
|
76
|
+
? ReadSchemaFileError.make({ message: e.message })
|
|
77
|
+
: ReadSchemaFileError.make({ message: String(e) }),
|
|
78
|
+
});
|
|
79
|
+
if (!localSchemaFile || !localSchemaFile?.schema) {
|
|
80
|
+
return yield* ReadSchemaFileError.make({
|
|
81
|
+
message: `We couldn't find your ${chalk.yellow('`instant.schema.ts`')} file. Make sure it's in the root directory. (Hint: You can use an INSTANT_SCHEMA_FILE_PATH environment variable to specify it.)`,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (localSchemaFile.schema?.constructor?.name !== 'InstantSchemaDef') {
|
|
85
|
+
return yield* SchemaValidationError.make({
|
|
86
|
+
message: `We couldn't find your schema export.\nIn your ${chalk.yellow('`instant.schema.ts`')} file, make sure you ${chalk.green('`export default schema`')}`,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const http = yield* InstantHttpAuthed;
|
|
91
|
+
const { appId } = yield* CurrentApp;
|
|
92
|
+
const res = yield* http
|
|
93
|
+
.pipe(withCommand('push'))
|
|
94
|
+
.get(`/dash/apps/${appId}/schema/pull`)
|
|
95
|
+
.pipe(
|
|
96
|
+
Effect.andThen(HttpClientResponse.schemaBodyJson(FetchSchemaResponse)),
|
|
97
|
+
Effect.mapError((e) => GetSchemaError.make({ message: e.message })),
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
const currentAttrs = res['attrs'];
|
|
101
|
+
const currentApiSchema = res['schema'];
|
|
102
|
+
const oldSchema = apiSchemaToInstantSchemaDef(currentApiSchema, {
|
|
103
|
+
disableTypeInference: true,
|
|
104
|
+
});
|
|
105
|
+
const systemCatalogIdentNames =
|
|
106
|
+
collectSystemCatalogIdentNames(currentAttrs);
|
|
107
|
+
|
|
108
|
+
yield* Effect.tryPromise({
|
|
109
|
+
try: async () =>
|
|
110
|
+
validateSchema(localSchemaFile.schema, systemCatalogIdentNames),
|
|
111
|
+
catch: (e) => {
|
|
112
|
+
if (e instanceof PlatformSchemaError) {
|
|
113
|
+
return SchemaValidationError.make({
|
|
114
|
+
message: 'Invalid Schema: ' + e.message,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return SchemaValidationError.make({
|
|
118
|
+
message: 'Failed to validate schema' + e,
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
const renames = rename && Array.isArray(rename) ? rename : [];
|
|
123
|
+
const globalOpts = yield* GlobalOpts;
|
|
124
|
+
const autoRenameSelector = buildAutoRenameSelector(renames as any);
|
|
125
|
+
const renameSelector = globalOpts.yes
|
|
126
|
+
? autoRenameSelector
|
|
127
|
+
: async (created: any, promptData: any, extraInfo: any) => {
|
|
128
|
+
const autoResolved = await autoRenameSelector(
|
|
129
|
+
created,
|
|
130
|
+
promptData,
|
|
131
|
+
extraInfo,
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
// If the user provided an explicit --rename match, skip the prompt.
|
|
135
|
+
if (autoResolved !== created) {
|
|
136
|
+
return autoResolved;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return resolveRenames(created, promptData, extraInfo);
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const diffResult = yield* Effect.tryPromise(() =>
|
|
143
|
+
diffSchemas(
|
|
144
|
+
oldSchema,
|
|
145
|
+
localSchemaFile.schema,
|
|
146
|
+
renameSelector,
|
|
147
|
+
systemCatalogIdentNames,
|
|
148
|
+
),
|
|
149
|
+
).pipe(
|
|
150
|
+
Effect.mapError((e) => {
|
|
151
|
+
if (e.cause instanceof Error) {
|
|
152
|
+
return SchemaDiffError.make({ message: e.cause.message });
|
|
153
|
+
}
|
|
154
|
+
return SchemaDiffError.make({ message: e.message });
|
|
155
|
+
}),
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
const txSteps = convertTxSteps(diffResult, currentAttrs);
|
|
159
|
+
if (txSteps.length === 0) {
|
|
160
|
+
yield* Effect.log(chalk.bgGray('No schema changes to apply!'));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const groupedSteps = groupSteps(diffResult);
|
|
165
|
+
yield* confirmSchemaChanges(groupedSteps, currentAttrs);
|
|
166
|
+
|
|
167
|
+
const pushRes = yield* http
|
|
168
|
+
.pipe(
|
|
169
|
+
HttpClient.mapRequestInputEffect(
|
|
170
|
+
HttpClientRequest.bodyJson({
|
|
171
|
+
steps: txSteps,
|
|
172
|
+
}),
|
|
173
|
+
),
|
|
174
|
+
)
|
|
175
|
+
.post(`/dash/apps/${appId}/schema/steps/apply`)
|
|
176
|
+
.pipe(Effect.flatMap(HttpClientResponse.schemaBodyJson(Schema.Any)));
|
|
177
|
+
|
|
178
|
+
yield* Effect.log(chalk.green('Schema updated!'));
|
|
179
|
+
|
|
180
|
+
const authToken = yield* (yield* AuthToken).getAuthToken;
|
|
181
|
+
|
|
182
|
+
if (pushRes?.['indexing-jobs']) {
|
|
183
|
+
// TODO: rewrite in effect
|
|
184
|
+
yield* Effect.tryPromise({
|
|
185
|
+
try: () =>
|
|
186
|
+
waitForIndexingJobsToFinish(
|
|
187
|
+
appId,
|
|
188
|
+
pushRes?.['indexing-jobs'] || [],
|
|
189
|
+
authToken,
|
|
190
|
+
),
|
|
191
|
+
catch: (e: any) =>
|
|
192
|
+
WaitForJobsError.make({
|
|
193
|
+
message:
|
|
194
|
+
e?.message || 'Error waiting for schema push jobs to finish',
|
|
195
|
+
}),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
export class WaitForJobsError extends Schema.TaggedError<WaitForJobsError>(
|
|
201
|
+
'WaitForJobsError',
|
|
202
|
+
)('WaitForJobsError', {
|
|
203
|
+
message: Schema.String,
|
|
204
|
+
}) {}
|
|
205
|
+
|
|
206
|
+
export class CancelSchemaError extends Data.TaggedError('CancelSchemaError')<{
|
|
207
|
+
message: string;
|
|
208
|
+
}> {}
|
|
209
|
+
|
|
210
|
+
const confirmSchemaChanges = (steps: SuperMigrationTx[], currentAttrs: any[]) =>
|
|
211
|
+
Effect.gen(function* () {
|
|
212
|
+
const lines = renderSchemaPlan(steps, currentAttrs);
|
|
213
|
+
const globalOpts = yield* GlobalOpts;
|
|
214
|
+
if (globalOpts.yes) {
|
|
215
|
+
console.log('Applying schema changes...');
|
|
216
|
+
console.log(lines.join('\n'));
|
|
217
|
+
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const wantsToPush = yield* promptOk({
|
|
221
|
+
promptText: 'Push these changes?',
|
|
222
|
+
yesText: 'Push',
|
|
223
|
+
noText: 'Cancel',
|
|
224
|
+
modifyOutput: (output) => {
|
|
225
|
+
let both = lines.join('\n') + '\n\n' + output;
|
|
226
|
+
return boxen(both, {
|
|
227
|
+
dimBorder: true,
|
|
228
|
+
padding: {
|
|
229
|
+
left: 1,
|
|
230
|
+
right: 1,
|
|
231
|
+
},
|
|
232
|
+
});
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
if (!wantsToPush) {
|
|
236
|
+
return yield* new CancelSchemaError({
|
|
237
|
+
message: 'Schema Migration Cancelled',
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
});
|
package/src/lib/ui.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Data, Effect } from 'effect';
|
|
2
|
+
import { GlobalOpts } from '../context/globalOpts.ts';
|
|
3
|
+
import { Prompt, renderUnwrap } from '../ui/lib.ts';
|
|
4
|
+
import { UI } from '../ui/index.ts';
|
|
5
|
+
|
|
6
|
+
export class UIError extends Data.TaggedError('UIError')<{
|
|
7
|
+
message: string;
|
|
8
|
+
cause?: unknown;
|
|
9
|
+
}> {}
|
|
10
|
+
|
|
11
|
+
export const promptOk = Effect.fn('promptOk')(function* (
|
|
12
|
+
props: UI.ConfirmationProps,
|
|
13
|
+
defaultValue: boolean = true,
|
|
14
|
+
) {
|
|
15
|
+
const opts = yield* GlobalOpts;
|
|
16
|
+
if (opts.yes) {
|
|
17
|
+
return defaultValue;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const ok = yield* Effect.tryPromise(() =>
|
|
21
|
+
renderUnwrap(
|
|
22
|
+
new UI.Confirmation({
|
|
23
|
+
...props,
|
|
24
|
+
defaultValue,
|
|
25
|
+
}),
|
|
26
|
+
),
|
|
27
|
+
).pipe(Effect.orElseSucceed(() => defaultValue));
|
|
28
|
+
|
|
29
|
+
return ok;
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export const runUIEffect = <P>(prompt: Prompt<P>) =>
|
|
33
|
+
Effect.tryPromise({
|
|
34
|
+
try: () => renderUnwrap(prompt),
|
|
35
|
+
catch: (error) => new UIError({ message: 'UI Error', cause: error }),
|
|
36
|
+
});
|
package/src/logging.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { HashMap, Logger, Match, Option } from 'effect';
|
|
3
|
+
|
|
4
|
+
export function warn(firstArg: string, ...rest: any[]) {
|
|
5
|
+
console.warn(chalk.yellow('[warning]') + ' ' + firstArg, ...rest);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function error(firstArg: string, ...rest: any[]) {
|
|
9
|
+
console.error(chalk.red('[error]') + ' ' + firstArg, ...rest);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const simpleLogger = Logger.make(({ logLevel, message, annotations }) => {
|
|
13
|
+
const isSilent = HashMap.get(annotations, 'silent').pipe(Option.getOrNull);
|
|
14
|
+
if (isSilent) return;
|
|
15
|
+
const formattedMessage = Array.isArray(message) ? message.join(' ') : message;
|
|
16
|
+
Match.value(logLevel).pipe(
|
|
17
|
+
Match.tag('Info', () => console.log(formattedMessage)),
|
|
18
|
+
Match.tag('Warning', () => console.warn(formattedMessage)),
|
|
19
|
+
Match.tag('Error', () =>
|
|
20
|
+
console.error(chalk.red('[error]') + ' ' + formattedMessage),
|
|
21
|
+
),
|
|
22
|
+
Match.tag('Debug', () => console.debug(formattedMessage)),
|
|
23
|
+
Match.tag('Fatal', () =>
|
|
24
|
+
console.error(chalk.red('[error]') + ' ' + formattedMessage),
|
|
25
|
+
),
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export const SimpleLogLayer = Logger.replace(
|
|
30
|
+
Logger.defaultLogger,
|
|
31
|
+
simpleLogger,
|
|
32
|
+
);
|