@passlock/cli 2.0.7 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.d.ts CHANGED
@@ -12,7 +12,7 @@ export type ParsedCommand = {
12
12
  readonly _tag: "run-init";
13
13
  readonly endpoint: string;
14
14
  };
15
- declare const CliParseError_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 & {
15
+ declare const CliParseError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
16
16
  readonly _tag: "@error/CliParse";
17
17
  } & Readonly<A>;
18
18
  declare class CliParseError extends CliParseError_base<{
package/dist/cli.js CHANGED
@@ -7,7 +7,7 @@
7
7
  import { Console, Data, Effect, pipe } from "effect";
8
8
  import { init } from "./init.js";
9
9
  import { NetworkFetchLive } from "./network.js";
10
- const VERSION = "2.0.7";
10
+ const VERSION = "2.1.2";
11
11
  const DEFAULT_ENDPOINT = "https://api.passlock.dev";
12
12
  const MAIN_HELP_TEXT = [
13
13
  "Passlock CLI tools",
package/dist/init.js CHANGED
@@ -30,7 +30,7 @@ const captureData = Effect.gen(function* () {
30
30
  },
31
31
  }));
32
32
  if (isCancel(email))
33
- return yield* new CancelError({});
33
+ return yield* new CancelError();
34
34
  const firstName = yield* Effect.promise(() => text({
35
35
  message: "Your first/given name",
36
36
  placeholder: "John",
@@ -40,7 +40,7 @@ const captureData = Effect.gen(function* () {
40
40
  },
41
41
  }));
42
42
  if (isCancel(firstName))
43
- return yield* new CancelError({});
43
+ return yield* new CancelError();
44
44
  const lastName = yield* Effect.promise(() => text({
45
45
  message: "Your last/family name",
46
46
  placeholder: "Doe",
@@ -50,12 +50,12 @@ const captureData = Effect.gen(function* () {
50
50
  },
51
51
  }));
52
52
  if (isCancel(lastName))
53
- return yield* new CancelError({});
53
+ return yield* new CancelError();
54
54
  const isConfirmed = yield* Effect.promise(() => confirm({
55
55
  message: `Using ${firstName} ${lastName} <${email}>, continue?`,
56
56
  }));
57
57
  if (isCancel(isConfirmed))
58
- return yield* new CancelError({});
58
+ return yield* new CancelError();
59
59
  return isConfirmed ? { email, firstName, lastName } : yield* captureData;
60
60
  });
61
61
  export const signup = (payload, endpoint) => pipe(Effect.gen(function* () {
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n confirm,\n intro,\n isCancel,\n log,\n outro,\n spinner,\n text,\n} from \"@clack/prompts\"\nimport { Data, Effect, Match, pipe, Schema } from \"effect\"\nimport kleur from \"kleur\"\nimport {\n fetchNetwork,\n matchStatus,\n type NetworkFetch,\n type NetworkPayloadError,\n type NetworkRequestError,\n type NetworkResponseError,\n} from \"./network.js\"\n\nclass CancelError extends Data.TaggedError(\"@error/Abort\")<object> {}\n\nconst emailRegex = /^[^@]+@[^@]+.[^@]+$/\n\nconst SignupPayload = Schema.Struct({\n email: Schema.String,\n firstName: Schema.String,\n lastName: Schema.String,\n})\n\ntype SignupPayload = typeof SignupPayload.Type\n\nexport class InvalidEmail extends Schema.TaggedError<InvalidEmail>(\n \"@error/InvalidEmail\"\n)(\"@error/InvalidEmail\", { message: Schema.String }) {}\n\nexport class DuplicateEmail extends Schema.TaggedError<DuplicateEmail>(\n \"@error/DuplicateEmail\"\n)(\"@error/DuplicateEmail\", { message: Schema.String }) {}\n\nexport const TenancyData = Schema.TaggedStruct(\"TenancyData\", {\n apiKey: Schema.String,\n tenancyId: Schema.String,\n})\n\nexport type TenancyData = typeof TenancyData.Type\n\nconst captureData: Effect.Effect<SignupPayload, CancelError> = Effect.gen(\n function* () {\n const email = yield* Effect.promise(() =>\n text({\n message:\n \"Root account email? (we'll send a single use code to this address)\",\n\n placeholder: \"jdoe@gmail.com\",\n\n validate(value) {\n if (!value || value.length === 0) return `Value is required!`\n if (!emailRegex.test(value))\n return `Please provide a valid email address!`\n },\n })\n )\n\n if (isCancel(email)) return yield* new CancelError({})\n\n const firstName = yield* Effect.promise(() =>\n text({\n message: \"Your first/given name\",\n\n placeholder: \"John\",\n\n validate(value) {\n if (!value || value.length === 0) return `Value is required!`\n },\n })\n )\n\n if (isCancel(firstName)) return yield* new CancelError({})\n\n const lastName = yield* Effect.promise(() =>\n text({\n message: \"Your last/family name\",\n\n placeholder: \"Doe\",\n\n validate(value) {\n if (!value || value.length === 0) return `Value is required!`\n },\n })\n )\n\n if (isCancel(lastName)) return yield* new CancelError({})\n\n const isConfirmed = yield* Effect.promise(() =>\n confirm({\n message: `Using ${firstName} ${lastName} <${email}>, continue?`,\n })\n )\n\n if (isCancel(isConfirmed)) return yield* new CancelError({})\n\n return isConfirmed ? { email, firstName, lastName } : yield* captureData\n }\n)\n\nexport const signup = (\n payload: SignupPayload,\n endpoint: string\n): Effect.Effect<TenancyData, InvalidEmail | DuplicateEmail, NetworkFetch> =>\n pipe(\n Effect.gen(function* () {\n const response = yield* fetchNetwork(\n new URL(\"/signup\", endpoint),\n \"post\",\n payload\n )\n\n const encoded: TenancyData | InvalidEmail | DuplicateEmail =\n yield* matchStatus(response, {\n \"2xx\": ({ json }) =>\n pipe(json, Effect.flatMap(Schema.decodeUnknown(TenancyData))),\n orElse: ({ json }) =>\n pipe(\n json,\n Effect.flatMap(\n Schema.decodeUnknown(Schema.Union(InvalidEmail, DuplicateEmail))\n )\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"TenancyData\", (principal) => Effect.succeed(principal)),\n Match.tag(\"@error/InvalidEmail\", (err) => Effect.fail(err)),\n Match.tag(\"@error/DuplicateEmail\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n })\n )\n\nexport const init = (\n endpoint: string\n): Effect.Effect<void, never, NetworkFetch> =>\n pipe(\n Effect.gen(function* () {\n intro(`Setting up new Passlock cloud instance...`)\n\n const signupData = yield* captureData\n const s = spinner()\n s.start(\"Setting up instance\")\n\n const { tenancyId, apiKey } = yield* pipe(\n signup(signupData, endpoint),\n Effect.tapError(() =>\n Effect.sync(() => {\n s.stop(\"Something went wrong\")\n })\n )\n )\n s.stop(\"Instance ready 🎉\")\n\n log.success(\n \"Here are your development instance credentials.\\nPlease keep them secure:\"\n )\n\n log.message(\n `Tenancy ID: ${kleur.green(tenancyId)}\\n` +\n `API Key: ${kleur.green(apiKey)}`\n )\n\n log.message(\n `Login to your Passlock console at\\n${kleur.blue().underline(\"https://console.passlock.dev\")}`\n )\n\n log.message(\n \"Check out the quick start guide at\\n\" +\n kleur.blue().underline(\"https://passlock.dev/getting-started/\")\n )\n\n outro(\"You're all set!\")\n }),\n Effect.catchTags({\n \"@error/Abort\": () =>\n Effect.sync(() => {\n log.error(\"Operation cancelled\")\n }),\n \"@error/DuplicateEmail\": () =>\n Effect.sync(() => {\n log.error(\n \"Email already registered\\n\" +\n \"Sign in at https://console.passlock.dev\"\n )\n }),\n \"@error/InvalidEmail\": () =>\n Effect.sync(() => {\n log.error(\"Invalid email address\")\n }),\n })\n )\n"]}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n confirm,\n intro,\n isCancel,\n log,\n outro,\n spinner,\n text,\n} from \"@clack/prompts\"\nimport { Data, Effect, Match, pipe, Schema } from \"effect\"\nimport kleur from \"kleur\"\nimport {\n fetchNetwork,\n matchStatus,\n type NetworkFetch,\n type NetworkPayloadError,\n type NetworkRequestError,\n type NetworkResponseError,\n} from \"./network.js\"\n\nclass CancelError extends Data.TaggedError(\"@error/Abort\")<object> {}\n\nconst emailRegex = /^[^@]+@[^@]+.[^@]+$/\n\nconst SignupPayload = Schema.Struct({\n email: Schema.String,\n firstName: Schema.String,\n lastName: Schema.String,\n})\n\ntype SignupPayload = typeof SignupPayload.Type\n\nexport class InvalidEmail extends Schema.TaggedError<InvalidEmail>(\n \"@error/InvalidEmail\"\n)(\"@error/InvalidEmail\", { message: Schema.String }) {}\n\nexport class DuplicateEmail extends Schema.TaggedError<DuplicateEmail>(\n \"@error/DuplicateEmail\"\n)(\"@error/DuplicateEmail\", { message: Schema.String }) {}\n\nexport const TenancyData = Schema.TaggedStruct(\"TenancyData\", {\n apiKey: Schema.String,\n tenancyId: Schema.String,\n})\n\nexport type TenancyData = typeof TenancyData.Type\n\nconst captureData: Effect.Effect<SignupPayload, CancelError> = Effect.gen(\n function* () {\n const email = yield* Effect.promise(() =>\n text({\n message:\n \"Root account email? (we'll send a single use code to this address)\",\n\n placeholder: \"jdoe@gmail.com\",\n\n validate(value) {\n if (!value || value.length === 0) return `Value is required!`\n if (!emailRegex.test(value))\n return `Please provide a valid email address!`\n },\n })\n )\n\n if (isCancel(email)) return yield* new CancelError()\n\n const firstName = yield* Effect.promise(() =>\n text({\n message: \"Your first/given name\",\n\n placeholder: \"John\",\n\n validate(value) {\n if (!value || value.length === 0) return `Value is required!`\n },\n })\n )\n\n if (isCancel(firstName)) return yield* new CancelError()\n\n const lastName = yield* Effect.promise(() =>\n text({\n message: \"Your last/family name\",\n\n placeholder: \"Doe\",\n\n validate(value) {\n if (!value || value.length === 0) return `Value is required!`\n },\n })\n )\n\n if (isCancel(lastName)) return yield* new CancelError()\n\n const isConfirmed = yield* Effect.promise(() =>\n confirm({\n message: `Using ${firstName} ${lastName} <${email}>, continue?`,\n })\n )\n\n if (isCancel(isConfirmed)) return yield* new CancelError()\n\n return isConfirmed ? { email, firstName, lastName } : yield* captureData\n }\n)\n\nexport const signup = (\n payload: SignupPayload,\n endpoint: string\n): Effect.Effect<TenancyData, InvalidEmail | DuplicateEmail, NetworkFetch> =>\n pipe(\n Effect.gen(function* () {\n const response = yield* fetchNetwork(\n new URL(\"/signup\", endpoint),\n \"post\",\n payload\n )\n\n const encoded: TenancyData | InvalidEmail | DuplicateEmail =\n yield* matchStatus(response, {\n \"2xx\": ({ json }) =>\n pipe(json, Effect.flatMap(Schema.decodeUnknown(TenancyData))),\n orElse: ({ json }) =>\n pipe(\n json,\n Effect.flatMap(\n Schema.decodeUnknown(Schema.Union(InvalidEmail, DuplicateEmail))\n )\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"TenancyData\", (principal) => Effect.succeed(principal)),\n Match.tag(\"@error/InvalidEmail\", (err) => Effect.fail(err)),\n Match.tag(\"@error/DuplicateEmail\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n })\n )\n\nexport const init = (\n endpoint: string\n): Effect.Effect<void, never, NetworkFetch> =>\n pipe(\n Effect.gen(function* () {\n intro(`Setting up new Passlock cloud instance...`)\n\n const signupData = yield* captureData\n const s = spinner()\n s.start(\"Setting up instance\")\n\n const { tenancyId, apiKey } = yield* pipe(\n signup(signupData, endpoint),\n Effect.tapError(() =>\n Effect.sync(() => {\n s.stop(\"Something went wrong\")\n })\n )\n )\n s.stop(\"Instance ready 🎉\")\n\n log.success(\n \"Here are your development instance credentials.\\nPlease keep them secure:\"\n )\n\n log.message(\n `Tenancy ID: ${kleur.green(tenancyId)}\\n` +\n `API Key: ${kleur.green(apiKey)}`\n )\n\n log.message(\n `Login to your Passlock console at\\n${kleur.blue().underline(\"https://console.passlock.dev\")}`\n )\n\n log.message(\n \"Check out the quick start guide at\\n\" +\n kleur.blue().underline(\"https://passlock.dev/getting-started/\")\n )\n\n outro(\"You're all set!\")\n }),\n Effect.catchTags({\n \"@error/Abort\": () =>\n Effect.sync(() => {\n log.error(\"Operation cancelled\")\n }),\n \"@error/DuplicateEmail\": () =>\n Effect.sync(() => {\n log.error(\n \"Email already registered\\n\" +\n \"Sign in at https://console.passlock.dev\"\n )\n }),\n \"@error/InvalidEmail\": () =>\n Effect.sync(() => {\n log.error(\"Invalid email address\")\n }),\n })\n )\n"]}
package/dist/network.d.ts CHANGED
@@ -66,7 +66,7 @@ export interface MatchStatusCases<Resp extends NetworkResponse = NetworkResponse
66
66
  readonly "5xx"?: MatchStatusHandler<Resp>;
67
67
  readonly orElse: MatchStatusHandler<Resp>;
68
68
  }
69
- declare const NetworkRequestError_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 & {
69
+ declare const NetworkRequestError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
70
70
  readonly _tag: "@error/NetworkRequest";
71
71
  } & Readonly<A>;
72
72
  /**
@@ -78,7 +78,7 @@ export declare class NetworkRequestError extends NetworkRequestError_base<{
78
78
  readonly message: string;
79
79
  }> {
80
80
  }
81
- declare const NetworkPayloadError_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 & {
81
+ declare const NetworkPayloadError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
82
82
  readonly _tag: "@error/NetworkPayload";
83
83
  } & Readonly<A>;
84
84
  /**
@@ -89,7 +89,7 @@ export declare class NetworkPayloadError extends NetworkPayloadError_base<{
89
89
  readonly message: string;
90
90
  }> {
91
91
  }
92
- declare const NetworkResponseError_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 & {
92
+ declare const NetworkResponseError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
93
93
  readonly _tag: "@error/NetworkResponse";
94
94
  } & Readonly<A>;
95
95
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@passlock/cli",
3
- "version": "2.0.7",
3
+ "version": "2.1.2",
4
4
  "description": "CLI tooling support for the Passlock authentication framework",
5
5
  "keywords": [
6
6
  "passkey",
@@ -43,15 +43,15 @@
43
43
  ],
44
44
  "dependencies": {
45
45
  "@clack/prompts": "^1.1.0",
46
- "effect": "3.19.19",
46
+ "effect": "3.21.0",
47
47
  "kleur": "^4.1.5"
48
48
  },
49
49
  "devDependencies": {
50
- "@biomejs/biome": "^2.4.6",
51
- "@effect/vitest": "^0.27.0",
52
- "@types/node": "25.3.5",
50
+ "@biomejs/biome": "^2.4.9",
51
+ "@effect/vitest": "^0.29.0",
52
+ "@types/node": "25.5.0",
53
53
  "globals": "^17.4.0",
54
- "npm-check-updates": "^19.6.3",
54
+ "npm-check-updates": "^19.6.6",
55
55
  "publint": "0.3.18",
56
56
  "rimraf": "^6.1.3",
57
57
  "tsx": "4.21.0",