@lahat-group/cli 1.1.1 → 1.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.
Files changed (2) hide show
  1. package/dist/index.js +162 -6
  2. package/package.json +14 -5
package/dist/index.js CHANGED
@@ -7488,6 +7488,35 @@ function getColumnDepthCm(config, column) {
7488
7488
  init_esm_shims();
7489
7489
  var COMMISSION_STATES = ["potential", "pending_payment", "paid", "cancelled"];
7490
7490
 
7491
+ // ../../packages/shared/src/phone.ts
7492
+ init_esm_shims();
7493
+ var SEPARATORS = /[\s\-().]/g;
7494
+ var IL_PHONE = /^(?:(?:\+?972)0?|0)(?:[23489]\d{7}|[57]\d{8})$/;
7495
+ function normalizePhoneInput(value) {
7496
+ return value.replace(SEPARATORS, "");
7497
+ }
7498
+ function isValidIsraeliPhone(value) {
7499
+ return IL_PHONE.test(normalizePhoneInput(value));
7500
+ }
7501
+
7502
+ // ../../packages/shared/src/nationalId.ts
7503
+ init_esm_shims();
7504
+ var SEPARATORS2 = /[\s\-.]/g;
7505
+ function normalizeNationalIdInput(value) {
7506
+ return value.replace(SEPARATORS2, "");
7507
+ }
7508
+ function isValidIsraeliNationalId(value) {
7509
+ const digits = normalizeNationalIdInput(value);
7510
+ if (!/^\d{1,9}$/.test(digits)) return false;
7511
+ const padded = digits.padStart(9, "0");
7512
+ let sum = 0;
7513
+ for (let i = 0; i < 9; i++) {
7514
+ const product = Number(padded[i]) * (i % 2 === 0 ? 1 : 2);
7515
+ sum += product > 9 ? product - 9 : product;
7516
+ }
7517
+ return sum % 10 === 0;
7518
+ }
7519
+
7491
7520
  // ../../packages/shared/src/schemas.ts
7492
7521
  var MaterialIdSchema = external_exports.enum(MATERIAL_IDS);
7493
7522
  var ModuleTypeSchema = external_exports.enum([
@@ -7655,6 +7684,17 @@ var MeasurementPriceBreakdownSchema = external_exports.object({
7655
7684
  total: external_exports.number(),
7656
7685
  currency: external_exports.string()
7657
7686
  });
7687
+ var DiscountSettingsSchema = external_exports.object({
7688
+ enabled: external_exports.boolean(),
7689
+ percent: external_exports.number().min(0).max(100),
7690
+ description: external_exports.string().max(500)
7691
+ });
7692
+ var DiscountBreakdownSchema = DiscountSettingsSchema.extend({
7693
+ subtotal: external_exports.number(),
7694
+ amount: external_exports.number(),
7695
+ total: external_exports.number(),
7696
+ currency: external_exports.literal("NIS")
7697
+ });
7658
7698
  var PriceResultSchema = external_exports.object({
7659
7699
  total: external_exports.number(),
7660
7700
  currency: external_exports.string(),
@@ -7668,7 +7708,8 @@ var PriceResultSchema = external_exports.object({
7668
7708
  })).optional(),
7669
7709
  assemblyPrice: AssemblyPriceBreakdownSchema.optional(),
7670
7710
  transportPrice: TransportPriceBreakdownSchema.optional(),
7671
- measurementPrice: MeasurementPriceBreakdownSchema.optional()
7711
+ measurementPrice: MeasurementPriceBreakdownSchema.optional(),
7712
+ discount: DiscountBreakdownSchema.optional()
7672
7713
  });
7673
7714
  var ServicePricingConfigSchema = external_exports.object({
7674
7715
  id: external_exports.string().nullable(),
@@ -7709,6 +7750,35 @@ var CommissionConfigPatchBodySchema = external_exports.object({
7709
7750
  defaultRatePercent: external_exports.number().min(0).max(100)
7710
7751
  }).strict()
7711
7752
  });
7753
+ var ManufacturerConfigSchema = external_exports.object({
7754
+ email: external_exports.string().email().max(254).nullable(),
7755
+ version: external_exports.number().int().nonnegative()
7756
+ });
7757
+ var ManufacturerConfigPatchBodySchema = external_exports.object({
7758
+ version: external_exports.number().int().nonnegative(),
7759
+ patch: external_exports.object({
7760
+ email: external_exports.string().email().max(254)
7761
+ }).strict()
7762
+ });
7763
+ var DiscountConfigSchema = external_exports.object({
7764
+ id: external_exports.string().nullable(),
7765
+ enabled: external_exports.boolean(),
7766
+ percent: external_exports.number().min(0).max(100),
7767
+ description: external_exports.string().max(500),
7768
+ version: external_exports.number().int().nonnegative(),
7769
+ updatedAt: external_exports.string().nullable()
7770
+ });
7771
+ var DiscountConfigPatchBodySchema = external_exports.object({
7772
+ version: external_exports.number().int().nonnegative(),
7773
+ patch: external_exports.object({
7774
+ enabled: external_exports.boolean().optional(),
7775
+ percent: external_exports.number().min(0).max(100).optional(),
7776
+ description: external_exports.string().max(500).optional()
7777
+ }).strict().refine(
7778
+ (p) => Object.keys(p).length > 0,
7779
+ { message: "patch must contain at least one field" }
7780
+ )
7781
+ });
7712
7782
  var MBomLineItemSchema = external_exports.object({
7713
7783
  sku: external_exports.string(),
7714
7784
  qty: external_exports.number(),
@@ -7756,7 +7826,7 @@ var MBomDebugResponseSchema = external_exports.object({
7756
7826
  });
7757
7827
  var CreateCustomerSchema = external_exports.object({
7758
7828
  customerName: external_exports.string().min(1).max(120),
7759
- phoneNumber: external_exports.string().min(1).max(30),
7829
+ phoneNumber: external_exports.string().min(1).max(30).refine(isValidIsraeliPhone, "invalidPhone"),
7760
7830
  email: external_exports.string().email().max(254),
7761
7831
  address: external_exports.string().max(200).optional(),
7762
7832
  apartment: external_exports.string().max(50).optional(),
@@ -7767,7 +7837,7 @@ var CreateCustomerSchema = external_exports.object({
7767
7837
  });
7768
7838
  var UpdateCustomerSchema = external_exports.object({
7769
7839
  customerName: external_exports.string().min(1).max(120).optional(),
7770
- phoneNumber: external_exports.string().min(1).max(30).optional(),
7840
+ phoneNumber: external_exports.string().min(1).max(30).refine(isValidIsraeliPhone, "invalidPhone").optional(),
7771
7841
  email: external_exports.string().email().max(254).optional(),
7772
7842
  // Optional fields accept `null` to explicitly CLEAR (unset) a previously-set
7773
7843
  // value; omitting the key leaves it unchanged. Required for inline edit.
@@ -7819,7 +7889,13 @@ var ReviseOrderSchema = external_exports.object({
7819
7889
  var RegisterSchema = external_exports.object({
7820
7890
  email: external_exports.string().email().max(254),
7821
7891
  password: external_exports.string().min(8).max(128),
7822
- displayName: external_exports.string().min(1).max(50)
7892
+ displayName: external_exports.string().min(1).max(50),
7893
+ /**
7894
+ * Consent to the published legal documents, given on the signup form.
7895
+ * Required — a signup without it is rejected rather than silently recorded as
7896
+ * unconsented, which would leave the account stuck behind the consent gate.
7897
+ */
7898
+ acceptedLegal: external_exports.literal(true)
7823
7899
  });
7824
7900
  var LoginSchema = external_exports.object({
7825
7901
  email: external_exports.string().email().max(254),
@@ -7885,10 +7961,63 @@ var EmailTemplatePatchBodySchema = external_exports.object({
7885
7961
  { message: "patch must contain at least one field" }
7886
7962
  )
7887
7963
  });
7964
+ var CustomerEmailConfigSchema = external_exports.object({
7965
+ key: external_exports.string(),
7966
+ label: external_exports.string(),
7967
+ step: external_exports.number().int().nullable(),
7968
+ enabled: external_exports.boolean(),
7969
+ subject: external_exports.string(),
7970
+ preheader: external_exports.string(),
7971
+ badge: external_exports.string(),
7972
+ heading: external_exports.string(),
7973
+ paragraphs: external_exports.array(external_exports.string()),
7974
+ note: external_exports.string(),
7975
+ disclosure: external_exports.array(external_exports.string()),
7976
+ ctaLabel: external_exports.string(),
7977
+ ctaUrl: external_exports.string(),
7978
+ secondaryCtaLabel: external_exports.string(),
7979
+ secondaryCtaUrl: external_exports.string(),
7980
+ version: external_exports.number().int().nonnegative(),
7981
+ updatedAt: external_exports.string().nullable()
7982
+ });
7983
+ var EmailOutboxRowSchema = external_exports.object({
7984
+ _id: external_exports.string(),
7985
+ orderId: external_exports.string(),
7986
+ key: external_exports.string(),
7987
+ to: external_exports.string(),
7988
+ cc: external_exports.string(),
7989
+ subject: external_exports.string(),
7990
+ status: external_exports.enum(["sent", "failed", "skipped"]),
7991
+ attempts: external_exports.number().int().nonnegative(),
7992
+ lastError: external_exports.string().optional(),
7993
+ skippedReason: external_exports.string().optional(),
7994
+ sentAt: external_exports.string().nullable().optional(),
7995
+ createdAt: external_exports.string()
7996
+ });
7997
+ var CustomerEmailPatchBodySchema = external_exports.object({
7998
+ version: external_exports.number().int().nonnegative(),
7999
+ patch: external_exports.object({
8000
+ enabled: external_exports.boolean().optional(),
8001
+ subject: external_exports.string().max(300).optional(),
8002
+ preheader: external_exports.string().max(300).optional(),
8003
+ badge: external_exports.string().max(120).optional(),
8004
+ heading: external_exports.string().max(200).optional(),
8005
+ paragraphs: external_exports.array(external_exports.string().max(2e3)).max(12).optional(),
8006
+ note: external_exports.string().max(2e3).optional(),
8007
+ disclosure: external_exports.array(external_exports.string().max(2e3)).max(12).optional(),
8008
+ ctaLabel: external_exports.string().max(120).optional(),
8009
+ ctaUrl: external_exports.string().max(500).optional(),
8010
+ secondaryCtaLabel: external_exports.string().max(120).optional(),
8011
+ secondaryCtaUrl: external_exports.string().max(500).optional()
8012
+ }).strict().refine(
8013
+ (p) => Object.keys(p).length > 0,
8014
+ { message: "patch must contain at least one field" }
8015
+ )
8016
+ });
7888
8017
  var CustomerDetailsSchema = external_exports.object({
7889
8018
  email: external_exports.string().email().max(254),
7890
8019
  phone: external_exports.string().min(3).max(30),
7891
- nationalId: external_exports.string().min(5).max(20),
8020
+ nationalId: external_exports.string().min(5).max(20).refine(isValidIsraeliNationalId, "invalidNationalId"),
7892
8021
  installationAddress: external_exports.string().min(3).max(300),
7893
8022
  businessName: external_exports.string().max(120).optional(),
7894
8023
  contactPerson: external_exports.string().max(120).optional()
@@ -7902,6 +8031,11 @@ var OrderTransitionSchema = external_exports.object({
7902
8031
  /** Admin/support override: force-set the main status to `to`, bypassing the legal transition map. */
7903
8032
  override: external_exports.boolean().optional()
7904
8033
  });
8034
+ var UpdateOrderDateSchema = external_exports.object({
8035
+ field: external_exports.enum(["appointmentDate", "scheduledDate"]),
8036
+ value: external_exports.coerce.date(),
8037
+ reason: external_exports.string().max(500).optional()
8038
+ });
7905
8039
 
7906
8040
  // ../../packages/shared/src/pricing.ts
7907
8041
  init_esm_shims();
@@ -7909,6 +8043,9 @@ init_esm_shims();
7909
8043
  // ../../packages/shared/src/manufacturingBom/price.ts
7910
8044
  init_esm_shims();
7911
8045
 
8046
+ // ../../packages/shared/src/discount.ts
8047
+ init_esm_shims();
8048
+
7912
8049
  // ../../packages/shared/src/materials.ts
7913
8050
  init_esm_shims();
7914
8051
  var MATERIALS = {
@@ -9266,6 +9403,9 @@ init_esm_shims();
9266
9403
  // ../../packages/shared/src/permissions.ts
9267
9404
  init_esm_shims();
9268
9405
 
9406
+ // ../../packages/shared/src/legal.ts
9407
+ init_esm_shims();
9408
+
9269
9409
  // ../../packages/shared/src/orderWorkflow.ts
9270
9410
  init_esm_shims();
9271
9411
  var ORDER_STATUSES = [
@@ -9339,6 +9479,22 @@ var ORDER_EMAIL_EVENTS = [
9339
9479
  ];
9340
9480
  var ALL_ORDER_EMAIL_EVENTS = ORDER_EMAIL_EVENTS.map((e) => e.event);
9341
9481
 
9482
+ // ../../packages/shared/src/customerEmails.ts
9483
+ init_esm_shims();
9484
+ var CUSTOMER_EMAILS = [
9485
+ { key: "order_confirmed", label: "\u05D0\u05D9\u05E9\u05D5\u05E8 \u05D4\u05D6\u05DE\u05E0\u05D4 \u2014 \u05DE\u05E1\u05DE\u05DA \u05D2\u05D9\u05DC\u05D5\u05D9 \u05E0\u05D0\u05D5\u05EA", step: 1, hasHero: true, hasLineItems: true },
9486
+ { key: "measurement_coordination", label: "\u05EA\u05D9\u05D0\u05D5\u05DD \u05DE\u05D3\u05D9\u05D3\u05D4", step: 2, hasHero: false, hasLineItems: false },
9487
+ { key: "entering_production", label: "\u05D4\u05D0\u05E8\u05D5\u05DF \u05E0\u05DB\u05E0\u05E1 \u05DC\u05D9\u05D9\u05E6\u05D5\u05E8", step: 3, hasHero: false, hasLineItems: false },
9488
+ { key: "production_complete", label: "\u05E1\u05D9\u05D5\u05DD \u05D9\u05D9\u05E6\u05D5\u05E8", step: 4, hasHero: false, hasLineItems: false },
9489
+ { key: "installation_scheduled", label: "\u05EA\u05D9\u05D0\u05D5\u05DD \u05D5\u05D4\u05EA\u05E7\u05E0\u05D4", step: 5, hasHero: false, hasLineItems: false },
9490
+ { key: "installation_complete", label: "\u05DC\u05D0\u05D7\u05E8 \u05D4\u05EA\u05E7\u05E0\u05D4", step: 5, hasHero: true, hasLineItems: false },
9491
+ { key: "appointment_changed", label: "\u05E9\u05D9\u05E0\u05D5\u05D9 \u05DE\u05D5\u05E2\u05D3", step: null, hasHero: false, hasLineItems: false },
9492
+ { key: "order_revised", label: "\u05E2\u05D3\u05DB\u05D5\u05DF \u05D4\u05D6\u05DE\u05E0\u05D4", step: null, hasHero: false, hasLineItems: true }
9493
+ ];
9494
+ var CUSTOMER_EMAIL_BY_KEY = Object.fromEntries(
9495
+ CUSTOMER_EMAILS.map((d) => [d.key, d])
9496
+ );
9497
+
9342
9498
  // ../../packages/shared/src/manufacturingBom/index.ts
9343
9499
  init_esm_shims();
9344
9500
 
@@ -11707,7 +11863,7 @@ async function formatCliError(err, json) {
11707
11863
 
11708
11864
  // src/version.ts
11709
11865
  init_esm_shims();
11710
- var CLI_VERSION = "1.1.1";
11866
+ var CLI_VERSION = "1.1.2";
11711
11867
 
11712
11868
  // src/index.ts
11713
11869
  program.name("wardrobe").description("Wardrobe configurator CLI").version(CLI_VERSION);
package/package.json CHANGED
@@ -1,18 +1,27 @@
1
1
  {
2
2
  "name": "@lahat-group/cli",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "CLI + Claude Skill to build, validate, price, and save wardrobe designs.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
7
- "bin": { "wardrobe": "dist/index.js" },
8
- "files": ["dist", "skill"],
9
- "engines": { "node": ">=18" },
7
+ "bin": {
8
+ "wardrobe": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "skill"
13
+ ],
14
+ "engines": {
15
+ "node": ">=18"
16
+ },
10
17
  "repository": {
11
18
  "type": "git",
12
19
  "url": "git+https://github.com/shahar-abra/wardrobe-configurator.git",
13
20
  "directory": "tools/cli"
14
21
  },
15
- "publishConfig": { "access": "public" },
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
16
25
  "scripts": {
17
26
  "build": "tsup",
18
27
  "prepublishOnly": "npm run build",