@passlock/cli 2.0.0-beta.5 → 2.0.1

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/README.md CHANGED
@@ -52,7 +52,4 @@ Follow the prompts
52
52
 
53
53
  ### Help
54
54
 
55
- `passlock --help`
56
-
57
- [contact]: https://passlock.dev/contact
58
- [client]: https://www.npmjs.com/package/@passlock/client
55
+ `passlock --help`
@@ -52,7 +52,4 @@ Follow the prompts
52
52
 
53
53
  ### Help
54
54
 
55
- `passlock --help`
56
-
57
- [contact]: https://passlock.dev/contact
58
- [client]: https://www.npmjs.com/package/@passlock/client
55
+ `passlock --help`
package/dist/init.js CHANGED
@@ -23,7 +23,7 @@ const captureData = Effect.gen(function* () {
23
23
  message: "Root account email? (we'll send a single use code to this address)",
24
24
  placeholder: "jdoe@gmail.com",
25
25
  validate(value) {
26
- if (value.length === 0)
26
+ if (!value || value.length === 0)
27
27
  return `Value is required!`;
28
28
  if (!emailRegex.test(value))
29
29
  return `Please provide a valid email address!`;
@@ -35,7 +35,7 @@ const captureData = Effect.gen(function* () {
35
35
  message: "Your first/given name",
36
36
  placeholder: "John",
37
37
  validate(value) {
38
- if (value.length === 0)
38
+ if (!value || value.length === 0)
39
39
  return `Value is required!`;
40
40
  },
41
41
  }));
@@ -45,7 +45,7 @@ const captureData = Effect.gen(function* () {
45
45
  message: "Your last/family name",
46
46
  placeholder: "Doe",
47
47
  validate(value) {
48
- if (value.length === 0)
48
+ if (!value || value.length === 0)
49
49
  return `Value is required!`;
50
50
  },
51
51
  }));
@@ -78,7 +78,7 @@ export const init = pipe(Effect.gen(function* () {
78
78
  const s = spinner();
79
79
  s.start("Setting up instance");
80
80
  const { tenancyId, apiKey } = yield* pipe(signup(signupData), Effect.tapError(() => Effect.sync(() => {
81
- s.stop("Something went wrong", 1);
81
+ s.stop("Something went wrong");
82
82
  })));
83
83
  s.stop("Instance ready 🎉");
84
84
  log.success("Here are your development instance credentials.\nPlease keep them secure:");
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 { confirm, intro, isCancel, log, outro, spinner, text } from \"@clack/prompts\"\nimport { HttpBody, HttpClient, HttpClientResponse } from \"@effect/platform\"\nimport { Data, Effect, Match, pipe, Schema } from \"effect\"\nimport kleur from \"kleur\"\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>(\"@error/InvalidEmail\")(\n \"@error/InvalidEmail\",\n { message: Schema.String }\n) {}\n\nexport class DuplicateEmail extends Schema.TaggedError<DuplicateEmail>(\"@error/DuplicateEmail\")(\n \"@error/DuplicateEmail\",\n { message: Schema.String }\n) {}\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(function* () {\n const email = yield* Effect.promise(() =>\n text({\n message: \"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.length === 0) return `Value is required!`\n if (!emailRegex.test(value)) 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.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.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\nexport const signup = (\n payload: SignupPayload\n): Effect.Effect<TenancyData, InvalidEmail | DuplicateEmail, HttpClient.HttpClient> =>\n pipe(\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const encodedPayload = yield* HttpBody.json(payload)\n\n const response = yield* pipe(\n // endpoint will be prepended by the HttpClient\n client.post(\"/signup\", {\n body: encodedPayload,\n })\n )\n\n const encoded = yield* HttpClientResponse.matchStatus(response, {\n \"2xx\": () => HttpClientResponse.schemaBodyJson(TenancyData)(response),\n orElse: () =>\n HttpClientResponse.schemaBodyJson(Schema.Union(InvalidEmail, DuplicateEmail))(response),\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.catchTag(\"HttpBodyError\", Effect.die),\n Effect.catchTag(\"ParseError\", Effect.die),\n Effect.catchTag(\"RequestError\", Effect.die),\n Effect.catchTag(\"ResponseError\", Effect.die)\n )\n\nexport const init: Effect.Effect<void, never, HttpClient.HttpClient> = 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),\n Effect.tapError(() =>\n Effect.sync(() => {\n s.stop(\"Something went wrong\", 1)\n })\n )\n )\n s.stop(\"Instance ready 🎉\")\n\n log.success(\"Here are your development instance credentials.\\nPlease keep them secure:\")\n\n log.message(`Tenancy ID: ${kleur.green(tenancyId)}\\n` + `API Key: ${kleur.green(apiKey)}`)\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(\"Email already registered\\n\" + \"Sign in at https://console.passlock.dev\")\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 { confirm, intro, isCancel, log, outro, spinner, text } from \"@clack/prompts\"\nimport { HttpBody, HttpClient, HttpClientResponse } from \"@effect/platform\"\nimport { Data, Effect, Match, pipe, Schema } from \"effect\"\nimport kleur from \"kleur\"\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>(\"@error/InvalidEmail\")(\n \"@error/InvalidEmail\",\n { message: Schema.String }\n) {}\n\nexport class DuplicateEmail extends Schema.TaggedError<DuplicateEmail>(\"@error/DuplicateEmail\")(\n \"@error/DuplicateEmail\",\n { message: Schema.String }\n) {}\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(function* () {\n const email = yield* Effect.promise(() =>\n text({\n message: \"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)) 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\nexport const signup = (\n payload: SignupPayload\n): Effect.Effect<TenancyData, InvalidEmail | DuplicateEmail, HttpClient.HttpClient> =>\n pipe(\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const encodedPayload = yield* HttpBody.json(payload)\n\n const response = yield* pipe(\n // endpoint will be prepended by the HttpClient\n client.post(\"/signup\", {\n body: encodedPayload,\n })\n )\n\n const encoded = yield* HttpClientResponse.matchStatus(response, {\n \"2xx\": () => HttpClientResponse.schemaBodyJson(TenancyData)(response),\n orElse: () =>\n HttpClientResponse.schemaBodyJson(Schema.Union(InvalidEmail, DuplicateEmail))(response),\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.catchTag(\"HttpBodyError\", Effect.die),\n Effect.catchTag(\"ParseError\", Effect.die),\n Effect.catchTag(\"RequestError\", Effect.die),\n Effect.catchTag(\"ResponseError\", Effect.die)\n )\n\nexport const init: Effect.Effect<void, never, HttpClient.HttpClient> = 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),\n Effect.tapError(() =>\n Effect.sync(() => {\n s.stop(\"Something went wrong\")\n })\n )\n )\n s.stop(\"Instance ready 🎉\")\n\n log.success(\"Here are your development instance credentials.\\nPlease keep them secure:\")\n\n log.message(`Tenancy ID: ${kleur.green(tenancyId)}\\n` + `API Key: ${kleur.green(apiKey)}`)\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(\"Email already registered\\n\" + \"Sign in at https://console.passlock.dev\")\n }),\n \"@error/InvalidEmail\": () =>\n Effect.sync(() => {\n log.error(\"Invalid email address\")\n }),\n })\n)\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@passlock/cli",
3
- "version": "2.0.0-beta.5",
3
+ "version": "2.0.1",
4
4
  "description": "CLI tooling support for the Passlock authentication framework",
5
5
  "keywords": [
6
6
  "passkey",
@@ -42,18 +42,19 @@
42
42
  "!dist/**/*.spec.*"
43
43
  ],
44
44
  "dependencies": {
45
- "@clack/prompts": "^0.11.0",
46
- "@effect/cli": "^0.73.0",
47
- "@effect/platform": "^0.94.1",
48
- "@effect/platform-node": "^0.104.0",
49
- "effect": "3.19.14",
45
+ "@clack/prompts": "^1.0.0",
46
+ "@effect/cli": "^0.73.1",
47
+ "@effect/cluster": "^0.56.1",
48
+ "@effect/platform": "^0.94.2",
49
+ "@effect/platform-node": "^0.104.1",
50
+ "effect": "3.19.15",
50
51
  "kleur": "^4.1.5"
51
52
  },
52
53
  "devDependencies": {
53
- "@types/node": "25.0.9",
54
- "@biomejs/biome": "^2.3.11",
55
- "globals": "^17.0.0",
56
- "npm-check-updates": "^19.3.1",
54
+ "@biomejs/biome": "^2.3.13",
55
+ "@types/node": "25.1.0",
56
+ "globals": "^17.2.0",
57
+ "npm-check-updates": "^19.3.2",
57
58
  "publint": "0.3.17",
58
59
  "rimraf": "^6.1.2",
59
60
  "tsx": "4.21.0",
@@ -70,10 +71,7 @@
70
71
  "clean": "tsc --build --clean",
71
72
  "clean:full": "rimraf dist tsconfig.tsbuildinfo",
72
73
  "replaceTokens": "LATEST=${npm_package_version} tsx ../../scripts/replace-tokens.ts ./packages/cli",
73
- "test": "vitest run",
74
- "test:coverage": "vitest run --coverage",
75
- "test:ui": "vitest --coverage.enabled=true --ui",
76
- "test:watch": "vitest dev",
74
+ "test:unit": "vitest",
77
75
  "typecheck": "tsc --noEmit",
78
76
  "lint": "biome check .",
79
77
  "lint:fix": "biome check --fix .",