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.
Files changed (213) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/__tests__/e2e/cli.e2e.test.ts +3 -3
  3. package/__tests__/e2e/helpers.ts +1 -1
  4. package/__tests__/effectHelpers.ts +45 -0
  5. package/__tests__/mergeSchema.test.ts +2 -2
  6. package/dist/commands/claim.d.ts +6 -0
  7. package/dist/commands/claim.d.ts.map +1 -0
  8. package/dist/commands/claim.js +22 -0
  9. package/dist/commands/claim.js.map +1 -0
  10. package/dist/commands/explorer.d.ts +6 -0
  11. package/dist/commands/explorer.d.ts.map +1 -0
  12. package/dist/commands/explorer.js +13 -0
  13. package/dist/commands/explorer.js.map +1 -0
  14. package/dist/commands/info.d.ts +3 -0
  15. package/dist/commands/info.d.ts.map +1 -0
  16. package/dist/commands/info.js +24 -0
  17. package/dist/commands/info.js.map +1 -0
  18. package/dist/commands/init.d.ts +5 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +39 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/initWithoutFiles.d.ts +6 -0
  23. package/dist/commands/initWithoutFiles.d.ts.map +1 -0
  24. package/dist/commands/initWithoutFiles.js +64 -0
  25. package/dist/commands/initWithoutFiles.js.map +1 -0
  26. package/dist/commands/login.d.ts +9 -0
  27. package/dist/commands/login.d.ts.map +1 -0
  28. package/dist/commands/login.js +52 -0
  29. package/dist/commands/login.js.map +1 -0
  30. package/dist/commands/logout.d.ts +4 -0
  31. package/dist/commands/logout.d.ts.map +1 -0
  32. package/dist/commands/logout.js +21 -0
  33. package/dist/commands/logout.js.map +1 -0
  34. package/dist/commands/pull.d.ts +6 -0
  35. package/dist/commands/pull.d.ts.map +1 -0
  36. package/dist/commands/pull.js +16 -0
  37. package/dist/commands/pull.js.map +1 -0
  38. package/dist/commands/push.d.ts +6 -0
  39. package/dist/commands/push.d.ts.map +1 -0
  40. package/dist/commands/push.js +20 -0
  41. package/dist/commands/push.js.map +1 -0
  42. package/dist/commands/query.d.ts +7 -0
  43. package/dist/commands/query.d.ts.map +1 -0
  44. package/dist/commands/query.js +52 -0
  45. package/dist/commands/query.js.map +1 -0
  46. package/dist/context/authToken.d.ts +30 -0
  47. package/dist/context/authToken.d.ts.map +1 -0
  48. package/dist/context/authToken.js +86 -0
  49. package/dist/context/authToken.js.map +1 -0
  50. package/dist/context/currentApp.d.ts +37 -0
  51. package/dist/context/currentApp.d.ts.map +1 -0
  52. package/dist/context/currentApp.js +204 -0
  53. package/dist/context/currentApp.js.map +1 -0
  54. package/dist/context/globalOpts.d.ts +11 -0
  55. package/dist/context/globalOpts.d.ts.map +1 -0
  56. package/dist/context/globalOpts.js +13 -0
  57. package/dist/context/globalOpts.js.map +1 -0
  58. package/dist/context/platformApi.d.ts +19 -0
  59. package/dist/context/platformApi.d.ts.map +1 -0
  60. package/dist/context/platformApi.js +24 -0
  61. package/dist/context/platformApi.js.map +1 -0
  62. package/dist/context/projectInfo.d.ts +29 -0
  63. package/dist/context/projectInfo.d.ts.map +1 -0
  64. package/dist/context/projectInfo.js +149 -0
  65. package/dist/context/projectInfo.js.map +1 -0
  66. package/dist/errors.d.ts +10 -0
  67. package/dist/errors.d.ts.map +1 -0
  68. package/dist/errors.js +6 -0
  69. package/dist/errors.js.map +1 -0
  70. package/dist/index.d.ts +41 -7
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +169 -1781
  73. package/dist/index.js.map +1 -1
  74. package/dist/layer.d.ts +23 -0
  75. package/dist/layer.d.ts.map +1 -0
  76. package/dist/layer.js +68 -0
  77. package/dist/layer.js.map +1 -0
  78. package/dist/lib/createApp.d.ts +12 -0
  79. package/dist/lib/createApp.d.ts.map +1 -0
  80. package/dist/lib/createApp.js +15 -0
  81. package/dist/lib/createApp.js.map +1 -0
  82. package/dist/lib/handleEnv.d.ts +7 -0
  83. package/dist/lib/handleEnv.d.ts.map +1 -0
  84. package/dist/lib/handleEnv.js +91 -0
  85. package/dist/lib/handleEnv.js.map +1 -0
  86. package/dist/lib/http.d.ts +32 -0
  87. package/dist/lib/http.d.ts.map +1 -0
  88. package/dist/lib/http.js +67 -0
  89. package/dist/lib/http.js.map +1 -0
  90. package/dist/lib/login.d.ts +13 -0
  91. package/dist/lib/login.d.ts.map +1 -0
  92. package/dist/lib/login.js +39 -0
  93. package/dist/lib/login.js.map +1 -0
  94. package/dist/lib/pullPerms.d.ts +7 -0
  95. package/dist/lib/pullPerms.d.ts.map +1 -0
  96. package/dist/lib/pullPerms.js +41 -0
  97. package/dist/lib/pullPerms.js.map +1 -0
  98. package/dist/lib/pullSchema.d.ts +12 -0
  99. package/dist/lib/pullSchema.d.ts.map +1 -0
  100. package/dist/lib/pullSchema.js +62 -0
  101. package/dist/lib/pullSchema.js.map +1 -0
  102. package/dist/lib/pushPerms.d.ts +13 -0
  103. package/dist/lib/pushPerms.d.ts.map +1 -0
  104. package/dist/lib/pushPerms.js +54 -0
  105. package/dist/lib/pushPerms.js.map +1 -0
  106. package/dist/lib/pushSchema.d.ts +53 -0
  107. package/dist/lib/pushSchema.d.ts.map +1 -0
  108. package/dist/lib/pushSchema.js +160 -0
  109. package/dist/lib/pushSchema.js.map +1 -0
  110. package/dist/lib/ui.d.ts +16 -0
  111. package/dist/lib/ui.d.ts.map +1 -0
  112. package/dist/lib/ui.js +22 -0
  113. package/dist/lib/ui.js.map +1 -0
  114. package/dist/logging.d.ts +4 -0
  115. package/dist/logging.d.ts.map +1 -0
  116. package/dist/logging.js +17 -0
  117. package/dist/logging.js.map +1 -0
  118. package/dist/old.d.ts +14 -0
  119. package/dist/old.d.ts.map +1 -0
  120. package/dist/old.js +417 -0
  121. package/dist/old.js.map +1 -0
  122. package/dist/program.d.ts +3 -0
  123. package/dist/program.d.ts.map +1 -0
  124. package/dist/program.js +3 -0
  125. package/dist/program.js.map +1 -0
  126. package/dist/renderSchemaPlan.d.ts +3 -3
  127. package/dist/renderSchemaPlan.d.ts.map +1 -1
  128. package/dist/renderSchemaPlan.js +2 -14
  129. package/dist/renderSchemaPlan.js.map +1 -1
  130. package/dist/ui/index.d.ts +4 -3
  131. package/dist/ui/index.d.ts.map +1 -1
  132. package/dist/ui/index.js +2 -2
  133. package/dist/ui/index.js.map +1 -1
  134. package/dist/ui/lib.js +1 -0
  135. package/dist/ui/lib.js.map +1 -1
  136. package/dist/util/findConfigCandidates.d.ts +1 -1
  137. package/dist/util/findConfigCandidates.d.ts.map +1 -1
  138. package/dist/util/findConfigCandidates.js +1 -3
  139. package/dist/util/findConfigCandidates.js.map +1 -1
  140. package/dist/util/fs.d.ts +1 -1
  141. package/dist/util/fs.d.ts.map +1 -1
  142. package/dist/util/fs.js.map +1 -1
  143. package/dist/util/getAuthPaths.d.ts.map +1 -1
  144. package/dist/util/getAuthPaths.js.map +1 -1
  145. package/dist/util/isHeadlessEnvironment.d.ts +3 -1
  146. package/dist/util/isHeadlessEnvironment.d.ts.map +1 -1
  147. package/dist/util/isHeadlessEnvironment.js.map +1 -1
  148. package/dist/util/loadConfig.d.ts +1 -1
  149. package/dist/util/loadConfig.d.ts.map +1 -1
  150. package/dist/util/loadConfig.js +2 -2
  151. package/dist/util/loadConfig.js.map +1 -1
  152. package/dist/util/mergeSchema.d.ts +9 -1
  153. package/dist/util/mergeSchema.d.ts.map +1 -1
  154. package/dist/util/mergeSchema.js +4 -0
  155. package/dist/util/mergeSchema.js.map +1 -1
  156. package/dist/util/renamePrompt.d.ts +2 -1
  157. package/dist/util/renamePrompt.d.ts.map +1 -1
  158. package/dist/util/renamePrompt.js +1 -1
  159. package/dist/util/renamePrompt.js.map +1 -1
  160. package/package.json +17 -7
  161. package/src/commands/claim.ts +31 -0
  162. package/src/commands/explorer.ts +21 -0
  163. package/src/commands/info.ts +34 -0
  164. package/src/commands/init.ts +58 -0
  165. package/src/commands/initWithoutFiles.ts +107 -0
  166. package/src/commands/login.ts +76 -0
  167. package/src/commands/logout.ts +23 -0
  168. package/src/commands/pull.ts +23 -0
  169. package/src/commands/push.ts +25 -0
  170. package/src/commands/query.ts +61 -0
  171. package/src/context/authToken.ts +149 -0
  172. package/src/context/currentApp.ts +277 -0
  173. package/src/context/globalOpts.ts +22 -0
  174. package/src/context/platformApi.ts +35 -0
  175. package/src/context/projectInfo.ts +215 -0
  176. package/src/errors.ts +7 -0
  177. package/src/index.ts +428 -0
  178. package/src/layer.ts +155 -0
  179. package/src/lib/createApp.ts +28 -0
  180. package/src/lib/handleEnv.ts +115 -0
  181. package/src/lib/http.ts +148 -0
  182. package/src/lib/login.ts +54 -0
  183. package/src/lib/pullPerms.ts +50 -0
  184. package/src/lib/pullSchema.ts +95 -0
  185. package/src/lib/pushPerms.ts +80 -0
  186. package/src/lib/pushSchema.ts +240 -0
  187. package/src/lib/ui.ts +36 -0
  188. package/src/logging.ts +32 -0
  189. package/src/old.js +495 -0
  190. package/src/program.ts +3 -0
  191. package/src/renderSchemaPlan.ts +6 -18
  192. package/src/ui/index.ts +4 -3
  193. package/src/util/findConfigCandidates.ts +1 -2
  194. package/src/util/fs.ts +1 -1
  195. package/src/util/getAuthPaths.ts +1 -0
  196. package/src/util/isHeadlessEnvironment.ts +1 -1
  197. package/src/util/loadConfig.ts +3 -6
  198. package/src/util/{mergeSchema.js → mergeSchema.ts} +26 -16
  199. package/src/util/renamePrompt.ts +2 -1
  200. package/tsconfig.build.json +20 -0
  201. package/tsconfig.json +15 -5
  202. package/vitest.config.ts +2 -1
  203. package/dist/util/packageManager.d.ts +0 -3
  204. package/dist/util/packageManager.d.ts.map +0 -1
  205. package/dist/util/packageManager.js +0 -70
  206. package/dist/util/packageManager.js.map +0 -1
  207. package/dist/util/promptOk.d.ts +0 -4
  208. package/dist/util/promptOk.d.ts.map +0 -1
  209. package/dist/util/promptOk.js +0 -18
  210. package/dist/util/promptOk.js.map +0 -1
  211. package/src/index.js +0 -2333
  212. package/src/util/packageManager.js +0 -78
  213. 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
+ );