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,52 @@
|
|
|
1
|
+
import { Effect, Layer } from 'effect';
|
|
2
|
+
import JSON5 from 'json5';
|
|
3
|
+
import { queryDef } from "../index.js";
|
|
4
|
+
import { CurrentApp } from "../context/currentApp.js";
|
|
5
|
+
import { BadArgsError } from "../errors.js";
|
|
6
|
+
import { InstantHttpAuthed, withCommand } from "../lib/http.js";
|
|
7
|
+
import { HttpBody } from '@effect/platform';
|
|
8
|
+
import { WithAppLayer } from "../layer.js";
|
|
9
|
+
export const queryCmd = (arg, opts) => Effect.gen(function* () {
|
|
10
|
+
const { appId } = yield* CurrentApp;
|
|
11
|
+
const contexts = [
|
|
12
|
+
opts.admin,
|
|
13
|
+
opts.asEmail,
|
|
14
|
+
opts.asGuest,
|
|
15
|
+
opts.asToken,
|
|
16
|
+
].filter(Boolean);
|
|
17
|
+
if (contexts.length > 1) {
|
|
18
|
+
return yield* BadArgsError.make({
|
|
19
|
+
message: 'Please specify exactly one context: --admin, --as-email <email>, --as-guest, or --as-token <token>',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const query = yield* Effect.try({
|
|
23
|
+
try: () => JSON5.parse(arg),
|
|
24
|
+
catch: (e) => BadArgsError.make({
|
|
25
|
+
message: String(e),
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
const headers = { 'app-id': appId };
|
|
29
|
+
if (opts.asEmail) {
|
|
30
|
+
headers['as-email'] = opts.asEmail;
|
|
31
|
+
}
|
|
32
|
+
else if (opts.asGuest) {
|
|
33
|
+
headers['as-guest'] = 'true';
|
|
34
|
+
}
|
|
35
|
+
else if (opts.asToken) {
|
|
36
|
+
headers['as-token'] = opts.asToken;
|
|
37
|
+
}
|
|
38
|
+
const http = (yield* InstantHttpAuthed).pipe(withCommand('query'));
|
|
39
|
+
const response = yield* http.post('/admin/query', {
|
|
40
|
+
headers,
|
|
41
|
+
body: HttpBody.unsafeJson({
|
|
42
|
+
query,
|
|
43
|
+
'inference?': true,
|
|
44
|
+
}),
|
|
45
|
+
});
|
|
46
|
+
const body = yield* response.json;
|
|
47
|
+
yield* Effect.log(JSON.stringify(body, null, 2));
|
|
48
|
+
}).pipe(Effect.provide(WithAppLayer({
|
|
49
|
+
coerce: false,
|
|
50
|
+
appId: opts.app,
|
|
51
|
+
}).pipe(Layer.annotateLogs('silent', true))));
|
|
52
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,IAAsC,EAAE,EAAE,CAC9E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IACpC,MAAM,QAAQ,GAAG;QACf,IAAI,CAAC,KAAK;QACV,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,OAAO;KACb,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC9B,OAAO,EACL,oGAAoG;SACvG,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAC9B,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,YAAY,CAAC,IAAI,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;SACnB,CAAC;KACL,CAAC,CAAC;IAEH,MAAM,OAAO,GAA2B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC5D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACrC,CAAC;SAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IAC/B,CAAC;SAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;QAChD,OAAO;QACP,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC;YACxB,KAAK;YACL,YAAY,EAAE,IAAI;SACnB,CAAC;KACH,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IAClC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CACZ,YAAY,CAAC;IACX,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,IAAI,CAAC,GAAG;CAChB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAC5C,CACF,CAAC","sourcesContent":["import { Effect, Layer } from 'effect';\nimport JSON5 from 'json5';\nimport { queryDef } from '../index.ts';\nimport type { OptsFromCommand } from '../index.ts';\nimport { CurrentApp } from '../context/currentApp.ts';\nimport { BadArgsError } from '../errors.ts';\nimport { InstantHttpAuthed, withCommand } from '../lib/http.ts';\nimport { HttpBody } from '@effect/platform';\nimport { WithAppLayer } from '../layer.ts';\n\nexport const queryCmd = (arg: string, opts: OptsFromCommand<typeof queryDef>) =>\n Effect.gen(function* () {\n const { appId } = yield* CurrentApp;\n const contexts = [\n opts.admin,\n opts.asEmail,\n opts.asGuest,\n opts.asToken,\n ].filter(Boolean);\n if (contexts.length > 1) {\n return yield* BadArgsError.make({\n message:\n 'Please specify exactly one context: --admin, --as-email <email>, --as-guest, or --as-token <token>',\n });\n }\n\n const query = yield* Effect.try({\n try: () => JSON5.parse(arg),\n catch: (e) =>\n BadArgsError.make({\n message: String(e),\n }),\n });\n\n const headers: Record<string, string> = { 'app-id': appId };\n if (opts.asEmail) {\n headers['as-email'] = opts.asEmail;\n } else if (opts.asGuest) {\n headers['as-guest'] = 'true';\n } else if (opts.asToken) {\n headers['as-token'] = opts.asToken;\n }\n\n const http = (yield* InstantHttpAuthed).pipe(withCommand('query'));\n const response = yield* http.post('/admin/query', {\n headers,\n body: HttpBody.unsafeJson({\n query,\n 'inference?': true,\n }),\n });\n const body = yield* response.json;\n yield* Effect.log(JSON.stringify(body, null, 2));\n }).pipe(\n Effect.provide(\n WithAppLayer({\n coerce: false,\n appId: opts.app,\n }).pipe(Layer.annotateLogs('silent', true)),\n ),\n );\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { FileSystem } from '@effect/platform';
|
|
2
|
+
import { Context, Effect, Layer, Schema } from 'effect';
|
|
3
|
+
type AuthTokenSource = 'admin' | 'env' | 'opt' | 'file';
|
|
4
|
+
declare const AuthToken_base: Context.TagClass<AuthToken, "instant-cli/new/context/authToken", {
|
|
5
|
+
getAuthToken: Effect.Effect<string>;
|
|
6
|
+
getSource: Effect.Effect<AuthTokenSource>;
|
|
7
|
+
setAuthToken: (authToken: string, source?: AuthTokenSource) => Effect.Effect<void>;
|
|
8
|
+
}>;
|
|
9
|
+
export declare class AuthToken extends AuthToken_base {
|
|
10
|
+
}
|
|
11
|
+
declare const NotAuthedError_base: Schema.TaggedErrorClass<NotAuthedError, "NotAuthedError", {
|
|
12
|
+
readonly _tag: Schema.tag<"NotAuthedError">;
|
|
13
|
+
} & {
|
|
14
|
+
message: typeof Schema.String;
|
|
15
|
+
}>;
|
|
16
|
+
export declare class NotAuthedError extends NotAuthedError_base {
|
|
17
|
+
}
|
|
18
|
+
export declare const authTokenGetEffect: (allowAdminToken?: boolean) => Effect.Effect<{
|
|
19
|
+
authToken: string;
|
|
20
|
+
source: "env" | "opt" | "file";
|
|
21
|
+
} | {
|
|
22
|
+
authToken: string;
|
|
23
|
+
source: "admin";
|
|
24
|
+
}, import("effect/ConfigError").ConfigError | NotAuthedError, FileSystem.FileSystem>;
|
|
25
|
+
export declare const AuthTokenLive: ({ coerce, allowAdminToken, }: {
|
|
26
|
+
coerce: boolean;
|
|
27
|
+
allowAdminToken: boolean;
|
|
28
|
+
}) => Layer.Layer<AuthToken, import("effect/Cause").UnknownException | import("../lib/http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("effect/ParseResult").ParseError | import("@effect/platform/HttpClientError").ResponseError | import("@effect/platform/Error").PlatformError | import("effect/ConfigError").ConfigError | NotAuthedError, import("./globalOpts.ts").GlobalOpts | import("../lib/http.ts").InstantHttp | FileSystem.FileSystem>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=authToken.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authToken.d.ts","sourceRoot":"","sources":["../../src/context/authToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAU,OAAO,EAAE,MAAM,EAAE,KAAK,EAAe,MAAM,EAAE,MAAM,QAAQ,CAAC;AAM7E,KAAK,eAAe,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;;kBAUtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;eACxB,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;kBAC3B,CACZ,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,eAAe,KACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;AAR5B,qBAAa,SAAU,SAAQ,cAU5B;CAAG;;;;;;AAEN,qBAAa,cAAe,SAAQ,mBAIlC;CAAG;AAEL,eAAO,MAAM,kBAAkB,GAAI,kBAAiB,OAAc;;YAMzC,KAAK,GAAG,KAAK,GAAG,MAAM;;;YAwBpB,OAAO;oFAoB9B,CAAC;AAEL,eAAO,MAAM,aAAa,GAAI,8BAG3B;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;CAC1B,2gBAgDE,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { FileSystem } from '@effect/platform';
|
|
2
|
+
import { Config, Context, Effect, Layer, Option, Ref, Schema } from 'effect';
|
|
3
|
+
import envPaths from 'env-paths';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { loginCommand } from "../commands/login.js";
|
|
6
|
+
import { program } from "../program.js";
|
|
7
|
+
export class AuthToken extends Context.Tag('instant-cli/new/context/authToken')() {
|
|
8
|
+
}
|
|
9
|
+
export class NotAuthedError extends Schema.TaggedError('NotAuthedError')('NotAuthedError', {
|
|
10
|
+
message: Schema.String,
|
|
11
|
+
}) {
|
|
12
|
+
}
|
|
13
|
+
export const authTokenGetEffect = (allowAdminToken = true) => Effect.gen(function* () {
|
|
14
|
+
const options = program.opts();
|
|
15
|
+
if (typeof options.token === 'string') {
|
|
16
|
+
return {
|
|
17
|
+
authToken: options.token,
|
|
18
|
+
source: 'opt',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const env = yield* Config.string('INSTANT_CLI_AUTH_TOKEN').pipe(Config.option, Config.map(Option.getOrNull));
|
|
22
|
+
if (env) {
|
|
23
|
+
return {
|
|
24
|
+
authToken: env,
|
|
25
|
+
source: 'env',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const secondaryEnv = yield* Config.string('INSTANT_APP_ADMIN_TOKEN').pipe(Config.orElse(() => Config.string('INSTANT_ADMIN_TOKEN')), Config.option, Config.map(Option.getOrNull));
|
|
29
|
+
if (secondaryEnv && allowAdminToken) {
|
|
30
|
+
return {
|
|
31
|
+
authToken: secondaryEnv,
|
|
32
|
+
source: 'admin',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const authPaths = yield* getAuthPaths;
|
|
36
|
+
const fs = yield* FileSystem.FileSystem;
|
|
37
|
+
const file = yield* fs
|
|
38
|
+
.readFileString(authPaths.authConfigFilePath, 'utf8')
|
|
39
|
+
.pipe(
|
|
40
|
+
// will usually fail if file not found, return null instead
|
|
41
|
+
Effect.orElseSucceed(() => null));
|
|
42
|
+
if (file) {
|
|
43
|
+
return {
|
|
44
|
+
authToken: file,
|
|
45
|
+
source: 'file',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return yield* NotAuthedError.make({ message: 'You are not logged in' });
|
|
49
|
+
});
|
|
50
|
+
export const AuthTokenLive = ({ coerce, allowAdminToken = true, }) => Layer.effect(AuthToken, authTokenGetEffect(allowAdminToken).pipe(Effect.flatMap((tokenResult) => Effect.gen(function* () {
|
|
51
|
+
const authStateRef = yield* Ref.make(tokenResult);
|
|
52
|
+
return {
|
|
53
|
+
getAuthToken: Ref.get(authStateRef).pipe(Effect.map((authState) => authState.authToken)),
|
|
54
|
+
getSource: Ref.get(authStateRef).pipe(Effect.map((authState) => authState.source)),
|
|
55
|
+
setAuthToken: (authToken, source) => Ref.update(authStateRef, (authState) => ({
|
|
56
|
+
...authState,
|
|
57
|
+
authToken,
|
|
58
|
+
source: source ?? authState.source,
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
})), Effect.catchTag('NotAuthedError', (e) => Effect.gen(function* () {
|
|
62
|
+
if (coerce) {
|
|
63
|
+
const loginResult = yield* loginCommand({});
|
|
64
|
+
const authStateRef = yield* Ref.make(loginResult);
|
|
65
|
+
return {
|
|
66
|
+
getAuthToken: Ref.get(authStateRef).pipe(Effect.map((authState) => authState.authToken)),
|
|
67
|
+
getSource: Ref.get(authStateRef).pipe(Effect.map((authState) => authState.source)),
|
|
68
|
+
setAuthToken: (authToken, source) => Ref.update(authStateRef, (authState) => ({
|
|
69
|
+
...authState,
|
|
70
|
+
authToken,
|
|
71
|
+
source: source ?? authState.source,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return yield* e;
|
|
77
|
+
}
|
|
78
|
+
}))));
|
|
79
|
+
const getAuthPaths = Effect.gen(function* () {
|
|
80
|
+
const dev = yield* Config.boolean('INSTANT_CLI_DEV').pipe(Config.withDefault(false));
|
|
81
|
+
const key = `instantdb-${dev ? 'dev' : 'prod'}`;
|
|
82
|
+
const { config: appConfigDirPath } = envPaths(key);
|
|
83
|
+
const authConfigFilePath = join(appConfigDirPath, 'a');
|
|
84
|
+
return { authConfigFilePath, appConfigDirPath };
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=authToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authToken.js","sourceRoot":"","sources":["../../src/context/authToken.ts"],"names":[],"mappings":"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","sourcesContent":["import { FileSystem } from '@effect/platform';\nimport { Config, Context, Effect, Layer, Option, Ref, Schema } from 'effect';\nimport envPaths from 'env-paths';\nimport { join } from 'path';\nimport { loginCommand } from '../commands/login.ts';\nimport { program } from '../program.ts';\n\ntype AuthTokenSource = 'admin' | 'env' | 'opt' | 'file';\n\ntype AuthTokenState = {\n authToken: string;\n source: AuthTokenSource;\n};\n\nexport class AuthToken extends Context.Tag('instant-cli/new/context/authToken')<\n AuthToken,\n {\n getAuthToken: Effect.Effect<string>;\n getSource: Effect.Effect<AuthTokenSource>;\n setAuthToken: (\n authToken: string,\n source?: AuthTokenSource,\n ) => Effect.Effect<void>;\n }\n>() {}\n\nexport class NotAuthedError extends Schema.TaggedError<NotAuthedError>(\n 'NotAuthedError',\n)('NotAuthedError', {\n message: Schema.String,\n}) {}\n\nexport const authTokenGetEffect = (allowAdminToken: boolean = true) =>\n Effect.gen(function* () {\n const options = program.opts() as Record<string, any>;\n if (typeof options.token === 'string') {\n return {\n authToken: options.token,\n source: 'opt' as 'env' | 'opt' | 'file',\n };\n }\n\n const env = yield* Config.string('INSTANT_CLI_AUTH_TOKEN').pipe(\n Config.option,\n Config.map(Option.getOrNull),\n );\n\n if (env) {\n return {\n authToken: env,\n source: 'env' as 'env' | 'opt' | 'file',\n };\n }\n\n const secondaryEnv = yield* Config.string('INSTANT_APP_ADMIN_TOKEN').pipe(\n Config.orElse(() => Config.string('INSTANT_ADMIN_TOKEN')),\n Config.option,\n Config.map(Option.getOrNull),\n );\n if (secondaryEnv && allowAdminToken) {\n return {\n authToken: secondaryEnv,\n source: 'admin' as 'admin',\n };\n }\n\n const authPaths = yield* getAuthPaths;\n const fs = yield* FileSystem.FileSystem;\n const file = yield* fs\n .readFileString(authPaths.authConfigFilePath, 'utf8')\n .pipe(\n // will usually fail if file not found, return null instead\n Effect.orElseSucceed(() => null),\n );\n if (file) {\n return {\n authToken: file,\n source: 'file' as 'env' | 'opt' | 'file',\n };\n }\n\n return yield* NotAuthedError.make({ message: 'You are not logged in' });\n });\n\nexport const AuthTokenLive = ({\n coerce,\n allowAdminToken = true,\n}: {\n coerce: boolean;\n allowAdminToken: boolean;\n}) =>\n Layer.effect(\n AuthToken,\n authTokenGetEffect(allowAdminToken).pipe(\n Effect.flatMap((tokenResult) =>\n Effect.gen(function* () {\n const authStateRef = yield* Ref.make<AuthTokenState>(tokenResult);\n return {\n getAuthToken: Ref.get(authStateRef).pipe(\n Effect.map((authState) => authState.authToken),\n ),\n getSource: Ref.get(authStateRef).pipe(\n Effect.map((authState) => authState.source),\n ),\n setAuthToken: (authToken: string, source?: AuthTokenSource) =>\n Ref.update(authStateRef, (authState) => ({\n ...authState,\n authToken,\n source: source ?? authState.source,\n })),\n };\n }),\n ),\n Effect.catchTag('NotAuthedError', (e) =>\n Effect.gen(function* () {\n if (coerce) {\n const loginResult = yield* loginCommand({});\n const authStateRef = yield* Ref.make<AuthTokenState>(loginResult);\n return {\n getAuthToken: Ref.get(authStateRef).pipe(\n Effect.map((authState) => authState.authToken),\n ),\n getSource: Ref.get(authStateRef).pipe(\n Effect.map((authState) => authState.source),\n ),\n setAuthToken: (authToken: string, source?: AuthTokenSource) =>\n Ref.update(authStateRef, (authState) => ({\n ...authState,\n authToken,\n source: source ?? authState.source,\n })),\n };\n } else {\n return yield* e;\n }\n }),\n ),\n ),\n );\n\nconst getAuthPaths = Effect.gen(function* () {\n const dev = yield* Config.boolean('INSTANT_CLI_DEV').pipe(\n Config.withDefault(false),\n );\n const key = `instantdb-${dev ? 'dev' : 'prod'}`;\n const { config: appConfigDirPath } = envPaths(key);\n const authConfigFilePath = join(appConfigDirPath, 'a');\n return { authConfigFilePath, appConfigDirPath };\n});\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Context, Layer } from 'effect';
|
|
2
|
+
import { InstantHttpAuthed } from '../lib/http.ts';
|
|
3
|
+
import { AuthToken } from './authToken.ts';
|
|
4
|
+
import { GlobalOpts } from './globalOpts.ts';
|
|
5
|
+
import { PlatformApi } from './platformApi.ts';
|
|
6
|
+
import { BadArgsError } from '../errors.ts';
|
|
7
|
+
export type CurrentAppInfo = {
|
|
8
|
+
appId: string;
|
|
9
|
+
adminToken?: string;
|
|
10
|
+
source: 'create' | 'import' | 'env' | 'flag' | 'ephemeral';
|
|
11
|
+
};
|
|
12
|
+
declare const CurrentApp_base: Context.TagClass<CurrentApp, "instant-cli/new/context/currentApp", CurrentAppInfo>;
|
|
13
|
+
export declare class CurrentApp extends CurrentApp_base {
|
|
14
|
+
}
|
|
15
|
+
declare const CurrentAppContextError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
16
|
+
readonly _tag: "CurrentAppContextError";
|
|
17
|
+
} & Readonly<A>;
|
|
18
|
+
export declare class CurrentAppContextError extends CurrentAppContextError_base<{
|
|
19
|
+
message: string;
|
|
20
|
+
}> {
|
|
21
|
+
}
|
|
22
|
+
declare const AppNotFoundError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
23
|
+
readonly _tag: "AppNotFoundError";
|
|
24
|
+
} & Readonly<A>;
|
|
25
|
+
export declare class AppNotFoundError extends AppNotFoundError_base<{
|
|
26
|
+
message: string;
|
|
27
|
+
}> {
|
|
28
|
+
}
|
|
29
|
+
export declare const potentialEnvs: Record<string, string>;
|
|
30
|
+
export declare const CurrentAppLive: (args: {
|
|
31
|
+
appId?: string;
|
|
32
|
+
coerce?: boolean;
|
|
33
|
+
title?: string;
|
|
34
|
+
applyEnv?: boolean;
|
|
35
|
+
}) => Layer.Layer<CurrentApp, BadArgsError | import("../lib/ui.ts").UIError | import("effect/Cause").UnknownException | import("../lib/http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("effect/ParseResult").ParseError | import("@effect/platform/HttpClientError").ResponseError | import("@effect/platform/Error").PlatformError | import("effect/ConfigError").ConfigError | CurrentAppContextError | AppNotFoundError | import("@effect/platform/HttpBody").HttpBodyError, GlobalOpts | import("./projectInfo.ts").ProjectInfo | import("@effect/platform/FileSystem").FileSystem | AuthToken | InstantHttpAuthed | import("@effect/platform/Path").Path | PlatformApi>;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=currentApp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"currentApp.d.ts","sourceRoot":"","sources":["../../src/context/currentApp.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAgB,KAAK,EAA2B,MAAM,QAAQ,CAAC;AAG/E,OAAO,EAAc,iBAAiB,EAAe,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;CAC5D,CAAC;;AAEF,qBAAa,UAAW,SAAQ,eAED;CAAG;;;;AAQlC,qBAAa,sBAAuB,SAAQ,4BAE1C;IACA,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;CAAG;;;;AAEL,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;CAAG;AAEL,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQhD,CAAC;AAQF,eAAO,MAAM,cAAc,GAAI,MAAM;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,muBAkGE,CAAC"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { HttpClientRequest, HttpClientResponse } from '@effect/platform';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import { Context, Data, Effect, Layer, Runtime, Schema, Option } from 'effect';
|
|
4
|
+
import { UI } from "../ui/index.js";
|
|
5
|
+
import { handleEnv } from "../lib/handleEnv.js";
|
|
6
|
+
import { getBaseUrl, InstantHttpAuthed, withCommand } from "../lib/http.js";
|
|
7
|
+
import { runUIEffect } from "../lib/ui.js";
|
|
8
|
+
import { AuthToken } from "./authToken.js";
|
|
9
|
+
import { GlobalOpts } from "./globalOpts.js";
|
|
10
|
+
import { PlatformApi } from "./platformApi.js";
|
|
11
|
+
import { readInstantConfigFile } from '../old.js';
|
|
12
|
+
import { BadArgsError } from "../errors.js";
|
|
13
|
+
export class CurrentApp extends Context.Tag('instant-cli/new/context/currentApp')() {
|
|
14
|
+
}
|
|
15
|
+
function isUUID(uuid) {
|
|
16
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
17
|
+
return uuidRegex.test(uuid);
|
|
18
|
+
}
|
|
19
|
+
export class CurrentAppContextError extends Data.TaggedError('CurrentAppContextError') {
|
|
20
|
+
}
|
|
21
|
+
export class AppNotFoundError extends Data.TaggedError('AppNotFoundError') {
|
|
22
|
+
}
|
|
23
|
+
export const potentialEnvs = {
|
|
24
|
+
catchall: 'INSTANT_APP_ID',
|
|
25
|
+
next: 'NEXT_PUBLIC_INSTANT_APP_ID',
|
|
26
|
+
svelte: 'PUBLIC_INSTANT_APP_ID',
|
|
27
|
+
vite: 'VITE_INSTANT_APP_ID',
|
|
28
|
+
expo: 'EXPO_PUBLIC_INSTANT_APP_ID',
|
|
29
|
+
nuxt: 'NUXT_PUBLIC_INSTANT_APP_ID',
|
|
30
|
+
bun: 'BUN_PUBLIC_INSTANT_APP_ID',
|
|
31
|
+
};
|
|
32
|
+
const potentialAdminTokenEnvs = {
|
|
33
|
+
default: 'INSTANT_APP_ADMIN_TOKEN',
|
|
34
|
+
short: 'INSTANT_ADMIN_TOKEN',
|
|
35
|
+
};
|
|
36
|
+
// TODO: add instant.config.ts support
|
|
37
|
+
export const CurrentAppLive = (args) => Layer.effect(CurrentApp, Effect.gen(function* () {
|
|
38
|
+
if (args.appId) {
|
|
39
|
+
if (isUUID(args.appId)) {
|
|
40
|
+
return {
|
|
41
|
+
appId: args.appId,
|
|
42
|
+
source: 'flag',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Check for instant.config.ts
|
|
47
|
+
const config = yield* Effect.tryPromise(() => readInstantConfigFile());
|
|
48
|
+
if (!config) {
|
|
49
|
+
return yield* new BadArgsError({
|
|
50
|
+
message: `App ID provided (${args.appId}) is not valid UUID`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const nameMatch = config?.apps?.[args.appId];
|
|
54
|
+
if (!nameMatch?.id) {
|
|
55
|
+
return yield* BadArgsError.make({
|
|
56
|
+
message: 'App ID not found in app inside instant.config.ts',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (nameMatch) {
|
|
60
|
+
return {
|
|
61
|
+
appId: nameMatch.id,
|
|
62
|
+
source: 'flag',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Detect from ENV
|
|
68
|
+
const found = Object.keys(potentialEnvs)
|
|
69
|
+
.map((type) => {
|
|
70
|
+
const envName = potentialEnvs[type];
|
|
71
|
+
const value = process.env[envName];
|
|
72
|
+
return { type, envName, value };
|
|
73
|
+
})
|
|
74
|
+
.find(({ value }) => !!value);
|
|
75
|
+
if (found?.value && !isUUID(found.value)) {
|
|
76
|
+
return yield* new CurrentAppContextError({
|
|
77
|
+
message: `Invalid UUID: ${found.value}`,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else if (found?.value) {
|
|
81
|
+
// try to get admin token
|
|
82
|
+
const adminToken = yield* getAdminToken;
|
|
83
|
+
return {
|
|
84
|
+
adminToken: Option.getOrUndefined(adminToken),
|
|
85
|
+
appId: found?.value,
|
|
86
|
+
source: 'env',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return yield* new AppNotFoundError({
|
|
90
|
+
message: 'No app found',
|
|
91
|
+
});
|
|
92
|
+
}).pipe(
|
|
93
|
+
// coerce into new app if app not found
|
|
94
|
+
Effect.catchTag('AppNotFoundError', () => Effect.gen(function* () {
|
|
95
|
+
if (!args.coerce)
|
|
96
|
+
return yield* new AppNotFoundError({ message: 'No app found' });
|
|
97
|
+
// coerce into a new app
|
|
98
|
+
const globalOpts = yield* GlobalOpts;
|
|
99
|
+
if (globalOpts.yes) {
|
|
100
|
+
if (!args.title) {
|
|
101
|
+
return yield* new CurrentAppContextError({
|
|
102
|
+
message: `If you provide --yes, you must provide a --title flag.`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
yield* Effect.log(`Creating app with title: ${args.title}`);
|
|
107
|
+
return yield* createApp(args.title);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return yield* promptImportOrCreateApp;
|
|
111
|
+
})),
|
|
112
|
+
// Handle save env
|
|
113
|
+
Effect.tap((app) => Effect.gen(function* () {
|
|
114
|
+
if (args.applyEnv &&
|
|
115
|
+
(app.source === 'import' ||
|
|
116
|
+
app.source === 'create' ||
|
|
117
|
+
app.source == 'ephemeral')) {
|
|
118
|
+
yield* handleEnv(app);
|
|
119
|
+
}
|
|
120
|
+
}))));
|
|
121
|
+
const createApp = Effect.fn(function* (title, orgId) {
|
|
122
|
+
const id = randomUUID();
|
|
123
|
+
const token = randomUUID();
|
|
124
|
+
const app = { id, title, admin_token: token, org_id: orgId };
|
|
125
|
+
const http = yield* InstantHttpAuthed;
|
|
126
|
+
yield* HttpClientRequest.post('/dash/apps').pipe(HttpClientRequest.bodyJson(app), Effect.flatMap(http.execute));
|
|
127
|
+
return {
|
|
128
|
+
appId: id,
|
|
129
|
+
source: 'create',
|
|
130
|
+
adminToken: token,
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
const promptImportOrCreateApp = Effect.gen(function* () {
|
|
134
|
+
const api = yield* getSimpleApi;
|
|
135
|
+
const result = yield* runUIEffect(new UI.AppSelector({
|
|
136
|
+
startingMenuIndex: 0,
|
|
137
|
+
allowEphemeral: true,
|
|
138
|
+
allowCreate: true,
|
|
139
|
+
api,
|
|
140
|
+
}));
|
|
141
|
+
if (result.approach === 'ephemeral') {
|
|
142
|
+
const authToken = yield* AuthToken;
|
|
143
|
+
yield* authToken.setAuthToken(result.adminToken, 'admin');
|
|
144
|
+
}
|
|
145
|
+
if (result.approach === 'import') {
|
|
146
|
+
yield* Effect.fork(trackAppImport(result.appId));
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
appId: result.appId,
|
|
150
|
+
source: result.approach,
|
|
151
|
+
adminToken: result.adminToken,
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
const getSimpleApi = Effect.gen(function* () {
|
|
155
|
+
const effectRuntime = yield* Effect.runtime();
|
|
156
|
+
const http = yield* InstantHttpAuthed;
|
|
157
|
+
const dashData = yield* http
|
|
158
|
+
.get('/dash')
|
|
159
|
+
.pipe(Effect.flatMap(HttpClientResponse.schemaBodyJson(Schema.Any)));
|
|
160
|
+
const platform = yield* PlatformApi;
|
|
161
|
+
const baseUrl = yield* getBaseUrl;
|
|
162
|
+
const authToken = yield* AuthToken;
|
|
163
|
+
return {
|
|
164
|
+
getDash: () => dashData,
|
|
165
|
+
createApp: async (title, orgId) => {
|
|
166
|
+
return Runtime.runPromise(effectRuntime, createApp(title, orgId).pipe(Effect.provideService(InstantHttpAuthed, http)));
|
|
167
|
+
},
|
|
168
|
+
createEphemeralApp: async (title) => {
|
|
169
|
+
return await Runtime.runPromise(effectRuntime, Effect.gen(function* () {
|
|
170
|
+
const platform = yield* PlatformApi;
|
|
171
|
+
const response = yield* platform.use((p) => p.createTemporaryApp({ title: title }), 'Error creating temporary app');
|
|
172
|
+
return {
|
|
173
|
+
appId: response.app.id,
|
|
174
|
+
adminToken: response.app.adminToken,
|
|
175
|
+
};
|
|
176
|
+
}).pipe(Effect.provideService(PlatformApi, platform)));
|
|
177
|
+
},
|
|
178
|
+
async getAppsForOrg(orgId) {
|
|
179
|
+
const token = await Runtime.runPromise(effectRuntime, authToken.getAuthToken);
|
|
180
|
+
const response = await fetch(baseUrl + '/dash/orgs/' + orgId, {
|
|
181
|
+
headers: {
|
|
182
|
+
Authorization: `Bearer ${token}`,
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
const data = await response.json();
|
|
186
|
+
return { apps: data.apps };
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
});
|
|
190
|
+
const getAdminToken = Effect.gen(function* () {
|
|
191
|
+
const found = Object.keys(potentialAdminTokenEnvs)
|
|
192
|
+
.map((type) => {
|
|
193
|
+
const envName = potentialAdminTokenEnvs[type];
|
|
194
|
+
const value = process.env[envName];
|
|
195
|
+
return { type, envName, value };
|
|
196
|
+
})
|
|
197
|
+
.find(({ value }) => !!value);
|
|
198
|
+
return Option.fromNullable(found?.value);
|
|
199
|
+
});
|
|
200
|
+
const trackAppImport = (appId) => Effect.gen(function* () {
|
|
201
|
+
const http = (yield* InstantHttpAuthed).pipe(withCommand('init'));
|
|
202
|
+
yield* http.post(`/dash/apps/${appId}/track-import`);
|
|
203
|
+
});
|
|
204
|
+
//# sourceMappingURL=currentApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"currentApp.js","sourceRoot":"","sources":["../../src/context/currentApp.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpClientRequest, HttpClientResponse } from '@effect/platform';\nimport { randomUUID } from 'crypto';\nimport { Context, Data, Effect, Layer, Runtime, Schema, Option } from 'effect';\nimport { UI } from '../ui/index.ts';\nimport { handleEnv } from '../lib/handleEnv.ts';\nimport { getBaseUrl, InstantHttpAuthed, withCommand } from '../lib/http.ts';\nimport { runUIEffect } from '../lib/ui.ts';\nimport { AuthToken } from './authToken.ts';\nimport { GlobalOpts } from './globalOpts.ts';\nimport { PlatformApi } from './platformApi.ts';\nimport { readInstantConfigFile } from '../old.js';\nimport { BadArgsError } from '../errors.ts';\n\nexport type CurrentAppInfo = {\n appId: string;\n adminToken?: string;\n source: 'create' | 'import' | 'env' | 'flag' | 'ephemeral';\n};\n\nexport class CurrentApp extends Context.Tag(\n 'instant-cli/new/context/currentApp',\n)<CurrentApp, CurrentAppInfo>() {}\n\nfunction isUUID(uuid: string) {\n const uuidRegex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n return uuidRegex.test(uuid);\n}\n\nexport class CurrentAppContextError extends Data.TaggedError(\n 'CurrentAppContextError',\n)<{\n message: string;\n}> {}\n\nexport class AppNotFoundError extends Data.TaggedError('AppNotFoundError')<{\n message: string;\n}> {}\n\nexport const potentialEnvs: Record<string, string> = {\n catchall: 'INSTANT_APP_ID',\n next: 'NEXT_PUBLIC_INSTANT_APP_ID',\n svelte: 'PUBLIC_INSTANT_APP_ID',\n vite: 'VITE_INSTANT_APP_ID',\n expo: 'EXPO_PUBLIC_INSTANT_APP_ID',\n nuxt: 'NUXT_PUBLIC_INSTANT_APP_ID',\n bun: 'BUN_PUBLIC_INSTANT_APP_ID',\n};\n\nconst potentialAdminTokenEnvs = {\n default: 'INSTANT_APP_ADMIN_TOKEN',\n short: 'INSTANT_ADMIN_TOKEN',\n} as const;\n\n// TODO: add instant.config.ts support\nexport const CurrentAppLive = (args: {\n appId?: string;\n coerce?: boolean;\n title?: string;\n applyEnv?: boolean;\n}) =>\n Layer.effect(\n CurrentApp,\n Effect.gen(function* () {\n if (args.appId) {\n if (isUUID(args.appId)) {\n return {\n appId: args.appId,\n source: 'flag' as const,\n };\n } else {\n // Check for instant.config.ts\n const config = yield* Effect.tryPromise(() =>\n readInstantConfigFile(),\n );\n if (!config) {\n return yield* new BadArgsError({\n message: `App ID provided (${args.appId}) is not valid UUID`,\n });\n }\n const nameMatch = config?.apps?.[args.appId];\n if (!nameMatch?.id) {\n return yield* BadArgsError.make({\n message: 'App ID not found in app inside instant.config.ts',\n });\n }\n if (nameMatch) {\n return {\n appId: nameMatch.id,\n source: 'flag' as const,\n };\n }\n }\n }\n\n // Detect from ENV\n const found = Object.keys(potentialEnvs)\n .map((type) => {\n const envName = potentialEnvs[type];\n const value = process.env[envName];\n return { type, envName, value };\n })\n .find(({ value }) => !!value);\n\n if (found?.value && !isUUID(found.value)) {\n return yield* new CurrentAppContextError({\n message: `Invalid UUID: ${found.value}`,\n });\n } else if (found?.value) {\n // try to get admin token\n const adminToken = yield* getAdminToken;\n return {\n adminToken: Option.getOrUndefined(adminToken),\n appId: found?.value,\n source: 'env' as const,\n };\n }\n return yield* new AppNotFoundError({\n message: 'No app found',\n });\n }).pipe(\n // coerce into new app if app not found\n Effect.catchTag('AppNotFoundError', () =>\n Effect.gen(function* () {\n if (!args.coerce)\n return yield* new AppNotFoundError({ message: 'No app found' });\n\n // coerce into a new app\n const globalOpts = yield* GlobalOpts;\n if (globalOpts.yes) {\n if (!args.title) {\n return yield* new CurrentAppContextError({\n message: `If you provide --yes, you must provide a --title flag.`,\n });\n } else {\n yield* Effect.log(`Creating app with title: ${args.title}`);\n return yield* createApp(args.title);\n }\n }\n\n return yield* promptImportOrCreateApp;\n }),\n ),\n\n // Handle save env\n Effect.tap((app) =>\n Effect.gen(function* () {\n if (\n args.applyEnv &&\n (app.source === 'import' ||\n app.source === 'create' ||\n app.source == 'ephemeral')\n ) {\n yield* handleEnv(app);\n }\n }),\n ),\n ),\n );\n\nconst createApp = Effect.fn(function* (title: string, orgId?: string) {\n const id = randomUUID();\n const token = randomUUID();\n const app = { id, title, admin_token: token, org_id: orgId };\n\n const http = yield* InstantHttpAuthed;\n yield* HttpClientRequest.post('/dash/apps').pipe(\n HttpClientRequest.bodyJson(app),\n Effect.flatMap(http.execute),\n );\n return {\n appId: id,\n source: 'create',\n adminToken: token,\n } satisfies CurrentAppInfo;\n});\n\nconst promptImportOrCreateApp = Effect.gen(function* () {\n const api = yield* getSimpleApi;\n const result = yield* runUIEffect(\n new UI.AppSelector({\n startingMenuIndex: 0,\n allowEphemeral: true,\n allowCreate: true,\n api,\n }),\n );\n\n if (result.approach === 'ephemeral') {\n const authToken = yield* AuthToken;\n yield* authToken.setAuthToken(result.adminToken, 'admin');\n }\n\n if (result.approach === 'import') {\n yield* Effect.fork(trackAppImport(result.appId));\n }\n\n return {\n appId: result.appId,\n source: result.approach,\n adminToken: result.adminToken,\n } satisfies CurrentAppInfo;\n});\n\nconst getSimpleApi = Effect.gen(function* () {\n const effectRuntime = yield* Effect.runtime<never>();\n\n const http = yield* InstantHttpAuthed;\n const dashData = yield* http\n .get('/dash')\n .pipe(Effect.flatMap(HttpClientResponse.schemaBodyJson(Schema.Any)));\n const platform = yield* PlatformApi;\n\n const baseUrl = yield* getBaseUrl;\n const authToken = yield* AuthToken;\n\n return {\n getDash: () => dashData,\n createApp: async (title, orgId) => {\n return Runtime.runPromise(\n effectRuntime,\n createApp(title, orgId).pipe(\n Effect.provideService(InstantHttpAuthed, http),\n ),\n );\n },\n\n createEphemeralApp: async (title) => {\n return await Runtime.runPromise(\n effectRuntime,\n Effect.gen(function* () {\n const platform = yield* PlatformApi;\n const response = yield* platform.use(\n (p) => p.createTemporaryApp({ title: title }),\n 'Error creating temporary app',\n );\n return {\n appId: response.app.id,\n adminToken: response.app.adminToken,\n };\n }).pipe(Effect.provideService(PlatformApi, platform)),\n );\n },\n\n async getAppsForOrg(orgId) {\n const token = await Runtime.runPromise(\n effectRuntime,\n authToken.getAuthToken,\n );\n const response = await fetch(baseUrl + '/dash/orgs/' + orgId, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n const data = await response.json();\n return { apps: data.apps };\n },\n } satisfies UI.AppSelectorApi;\n});\n\nconst getAdminToken = Effect.gen(function* () {\n const found = Object.keys(potentialAdminTokenEnvs)\n .map((type) => {\n const envName =\n potentialAdminTokenEnvs[type as keyof typeof potentialAdminTokenEnvs];\n const value = process.env[envName];\n return { type, envName, value };\n })\n .find(({ value }) => !!value);\n return Option.fromNullable(found?.value);\n});\n\nconst trackAppImport = (appId: string) =>\n Effect.gen(function* () {\n const http = (yield* InstantHttpAuthed).pipe(withCommand('init'));\n yield* http.post(`/dash/apps/${appId}/track-import`);\n });\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Context, Layer } from 'effect';
|
|
2
|
+
declare const GlobalOpts_base: Context.TagClass<GlobalOpts, "instant-cli/new/context/globalOpts", {
|
|
3
|
+
token?: string;
|
|
4
|
+
yes: boolean;
|
|
5
|
+
env?: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare class GlobalOpts extends GlobalOpts_base {
|
|
8
|
+
}
|
|
9
|
+
export declare const GlobalOptsLive: Layer.Layer<GlobalOpts, never, never>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=globalOpts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globalOpts.d.ts","sourceRoot":"","sources":["../../src/context/globalOpts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;;YAQ5B,MAAM;SACT,OAAO;UACN,MAAM;;AAPhB,qBAAa,UAAW,SAAQ,eAS7B;CAAG;AAEN,eAAO,MAAM,cAAc,uCAOzB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Context, Layer } from 'effect';
|
|
2
|
+
import { program } from "../program.js";
|
|
3
|
+
export class GlobalOpts extends Context.Tag('instant-cli/new/context/globalOpts')() {
|
|
4
|
+
}
|
|
5
|
+
export const GlobalOptsLive = Layer.sync(GlobalOpts, () => {
|
|
6
|
+
const opts = program.optsWithGlobals();
|
|
7
|
+
return {
|
|
8
|
+
yes: opts?.yes || false,
|
|
9
|
+
token: opts?.token,
|
|
10
|
+
env: opts?.env,
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=globalOpts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globalOpts.js","sourceRoot":"","sources":["../../src/context/globalOpts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,OAAO,UAAW,SAAQ,OAAO,CAAC,GAAG,CACzC,oCAAoC,CACrC,EAOE;CAAG;AAEN,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,EAAyB,CAAC;IAC9D,OAAO;QACL,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK;QACvB,KAAK,EAAE,IAAI,EAAE,KAAK;QAClB,GAAG,EAAE,IAAI,EAAE,GAAG;KACf,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { Context, Layer } from 'effect';\nimport { program } from '../program.ts';\n\nexport class GlobalOpts extends Context.Tag(\n 'instant-cli/new/context/globalOpts',\n)<\n GlobalOpts,\n {\n token?: string;\n yes: boolean;\n env?: string;\n }\n>() {}\n\nexport const GlobalOptsLive = Layer.sync(GlobalOpts, () => {\n const opts = program.optsWithGlobals() as Record<string, any>;\n return {\n yes: opts?.yes || false,\n token: opts?.token,\n env: opts?.env,\n };\n});\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PlatformApi as InstantPlatformApi } from '@instantdb/platform';
|
|
2
|
+
import { Effect } from 'effect';
|
|
3
|
+
declare const PlatformApiError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
4
|
+
readonly _tag: "PlatformApiError";
|
|
5
|
+
} & Readonly<A>;
|
|
6
|
+
export declare class PlatformApiError extends PlatformApiError_base<{
|
|
7
|
+
message: string;
|
|
8
|
+
cause: unknown;
|
|
9
|
+
}> {
|
|
10
|
+
}
|
|
11
|
+
declare const PlatformApi_base: Effect.Service.Class<PlatformApi, "instant-cli/new/context/platformApi", {
|
|
12
|
+
readonly effect: Effect.Effect<{
|
|
13
|
+
use: <R>(fun: (api: InstantPlatformApi) => Promise<R>, errorMessage?: string) => Effect.Effect<R, PlatformApiError, never>;
|
|
14
|
+
}, import("effect/ConfigError").ConfigError, never>;
|
|
15
|
+
}>;
|
|
16
|
+
export declare class PlatformApi extends PlatformApi_base {
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=platformApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platformApi.d.ts","sourceRoot":"","sources":["../../src/context/platformApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;AAGtC,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;CAAG;;;cAYS,CAAC,OACA,CAAC,GAAG,oBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,iBAC3B,MAAM;;;AAZ/B,qBAAa,WAAY,SAAQ,gBAyBhC;CAAG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PlatformApi as InstantPlatformApi } from '@instantdb/platform';
|
|
2
|
+
import { Data, Effect } from 'effect';
|
|
3
|
+
import { getBaseUrl } from "../lib/http.js";
|
|
4
|
+
export class PlatformApiError extends Data.TaggedError('PlatformApiError') {
|
|
5
|
+
}
|
|
6
|
+
export class PlatformApi extends Effect.Service()('instant-cli/new/context/platformApi', {
|
|
7
|
+
effect: Effect.gen(function* () {
|
|
8
|
+
const origin = yield* getBaseUrl;
|
|
9
|
+
const apiClient = new InstantPlatformApi({
|
|
10
|
+
apiURI: origin,
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
use: (fun, errorMessage) => Effect.tryPromise({
|
|
14
|
+
try: (_signal) => fun(apiClient),
|
|
15
|
+
catch: (e) => new PlatformApiError({
|
|
16
|
+
message: errorMessage || 'Error using platform api',
|
|
17
|
+
cause: e,
|
|
18
|
+
}),
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
}),
|
|
22
|
+
}) {
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=platformApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platformApi.js","sourceRoot":"","sources":["../../src/context/platformApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,OAAO,gBAAiB,SAAQ,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAGvE;CAAG;AAEL,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,OAAO,EAAe,CAC5D,qCAAqC,EACrC;IACE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC;YACvC,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,EAAE,CACH,GAA0C,EAC1C,YAAqB,EACrB,EAAE,CACF,MAAM,CAAC,UAAU,CAAC;gBAChB,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;gBAChC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,gBAAgB,CAAC;oBACnB,OAAO,EAAE,YAAY,IAAI,0BAA0B;oBACnD,KAAK,EAAE,CAAC;iBACT,CAAC;aACL,CAAC;SACL,CAAC;IACJ,CAAC,CAAC;CACH,CACF;CAAG","sourcesContent":["import { PlatformApi as InstantPlatformApi } from '@instantdb/platform';\nimport { Data, Effect } from 'effect';\nimport { getBaseUrl } from '../lib/http.ts';\n\nexport class PlatformApiError extends Data.TaggedError('PlatformApiError')<{\n message: string;\n cause: unknown;\n}> {}\n\nexport class PlatformApi extends Effect.Service<PlatformApi>()(\n 'instant-cli/new/context/platformApi',\n {\n effect: Effect.gen(function* () {\n const origin = yield* getBaseUrl;\n const apiClient = new InstantPlatformApi({\n apiURI: origin,\n });\n\n return {\n use: <R>(\n fun: (api: typeof apiClient) => Promise<R>,\n errorMessage?: string,\n ) =>\n Effect.tryPromise({\n try: (_signal) => fun(apiClient),\n catch: (e) =>\n new PlatformApiError({\n message: errorMessage || 'Error using platform api',\n cause: e,\n }),\n }),\n };\n }),\n },\n) {}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Context, Layer } from 'effect';
|
|
2
|
+
import { GlobalOpts } from './globalOpts.ts';
|
|
3
|
+
import { BadArgsError } from '../errors.ts';
|
|
4
|
+
declare const ProjectInfo_base: Context.TagClass<ProjectInfo, "instant-cli/new/context/projectInfo", {
|
|
5
|
+
pkgDir: string;
|
|
6
|
+
projectType: "node" | "deno";
|
|
7
|
+
instantModuleName: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare class ProjectInfo extends ProjectInfo_base {
|
|
10
|
+
}
|
|
11
|
+
export declare const PACKAGE_ALIAS_AND_FULL_NAMES: {
|
|
12
|
+
react: string;
|
|
13
|
+
'react-native': string;
|
|
14
|
+
core: string;
|
|
15
|
+
admin: string;
|
|
16
|
+
solid: string;
|
|
17
|
+
svelte: string;
|
|
18
|
+
};
|
|
19
|
+
declare const ProjectInfoError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
20
|
+
readonly _tag: "ProjectInfoError";
|
|
21
|
+
} & Readonly<A>;
|
|
22
|
+
export declare class ProjectInfoError extends ProjectInfoError_base<{
|
|
23
|
+
message: string;
|
|
24
|
+
cause?: unknown;
|
|
25
|
+
}> {
|
|
26
|
+
}
|
|
27
|
+
export declare const ProjectInfoLive: (coerce?: boolean, packageName?: keyof typeof PACKAGE_ALIAS_AND_FULL_NAMES) => Layer.Layer<ProjectInfo, BadArgsError | import("../lib/ui.ts").UIError | ProjectInfoError, GlobalOpts>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=projectInfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectInfo.d.ts","sourceRoot":"","sources":["../../src/context/projectInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAUtD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;;YAOhC,MAAM;iBACD,MAAM,GAAG,MAAM;uBACT,MAAM;;AAP7B,qBAAa,WAAY,SAAQ,gBAS9B;CAAG;AAIN,eAAO,MAAM,4BAA4B;;;;;;;CAOxC,CAAC;;;;AAEF,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;CAAG;AAuJL,eAAO,MAAM,eAAe,GAC1B,SAAQ,OAAc,EACtB,cAAc,MAAM,OAAO,4BAA4B,2GACU,CAAC"}
|