@lahat-group/cli 1.1.1 → 1.1.3

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 +166 -7
  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,11 +7750,43 @@ 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(),
7715
7785
  sellPrice: external_exports.number(),
7716
- costPrice: external_exports.number(),
7786
+ // Optional: `/api/mbom-debug` — the only producer this schema validates —
7787
+ // strips supplier cost before responding, since its consumer is the
7788
+ // customer-facing breakdown modal.
7789
+ costPrice: external_exports.number().optional(),
7717
7790
  comment: external_exports.string(),
7718
7791
  part: external_exports.string(),
7719
7792
  heightMm: external_exports.number(),
@@ -7756,7 +7829,7 @@ var MBomDebugResponseSchema = external_exports.object({
7756
7829
  });
7757
7830
  var CreateCustomerSchema = external_exports.object({
7758
7831
  customerName: external_exports.string().min(1).max(120),
7759
- phoneNumber: external_exports.string().min(1).max(30),
7832
+ phoneNumber: external_exports.string().min(1).max(30).refine(isValidIsraeliPhone, "invalidPhone"),
7760
7833
  email: external_exports.string().email().max(254),
7761
7834
  address: external_exports.string().max(200).optional(),
7762
7835
  apartment: external_exports.string().max(50).optional(),
@@ -7767,7 +7840,7 @@ var CreateCustomerSchema = external_exports.object({
7767
7840
  });
7768
7841
  var UpdateCustomerSchema = external_exports.object({
7769
7842
  customerName: external_exports.string().min(1).max(120).optional(),
7770
- phoneNumber: external_exports.string().min(1).max(30).optional(),
7843
+ phoneNumber: external_exports.string().min(1).max(30).refine(isValidIsraeliPhone, "invalidPhone").optional(),
7771
7844
  email: external_exports.string().email().max(254).optional(),
7772
7845
  // Optional fields accept `null` to explicitly CLEAR (unset) a previously-set
7773
7846
  // value; omitting the key leaves it unchanged. Required for inline edit.
@@ -7819,7 +7892,13 @@ var ReviseOrderSchema = external_exports.object({
7819
7892
  var RegisterSchema = external_exports.object({
7820
7893
  email: external_exports.string().email().max(254),
7821
7894
  password: external_exports.string().min(8).max(128),
7822
- displayName: external_exports.string().min(1).max(50)
7895
+ displayName: external_exports.string().min(1).max(50),
7896
+ /**
7897
+ * Consent to the published legal documents, given on the signup form.
7898
+ * Required — a signup without it is rejected rather than silently recorded as
7899
+ * unconsented, which would leave the account stuck behind the consent gate.
7900
+ */
7901
+ acceptedLegal: external_exports.literal(true)
7823
7902
  });
7824
7903
  var LoginSchema = external_exports.object({
7825
7904
  email: external_exports.string().email().max(254),
@@ -7885,10 +7964,63 @@ var EmailTemplatePatchBodySchema = external_exports.object({
7885
7964
  { message: "patch must contain at least one field" }
7886
7965
  )
7887
7966
  });
7967
+ var CustomerEmailConfigSchema = external_exports.object({
7968
+ key: external_exports.string(),
7969
+ label: external_exports.string(),
7970
+ step: external_exports.number().int().nullable(),
7971
+ enabled: external_exports.boolean(),
7972
+ subject: external_exports.string(),
7973
+ preheader: external_exports.string(),
7974
+ badge: external_exports.string(),
7975
+ heading: external_exports.string(),
7976
+ paragraphs: external_exports.array(external_exports.string()),
7977
+ note: external_exports.string(),
7978
+ disclosure: external_exports.array(external_exports.string()),
7979
+ ctaLabel: external_exports.string(),
7980
+ ctaUrl: external_exports.string(),
7981
+ secondaryCtaLabel: external_exports.string(),
7982
+ secondaryCtaUrl: external_exports.string(),
7983
+ version: external_exports.number().int().nonnegative(),
7984
+ updatedAt: external_exports.string().nullable()
7985
+ });
7986
+ var EmailOutboxRowSchema = external_exports.object({
7987
+ _id: external_exports.string(),
7988
+ orderId: external_exports.string(),
7989
+ key: external_exports.string(),
7990
+ to: external_exports.string(),
7991
+ cc: external_exports.string(),
7992
+ subject: external_exports.string(),
7993
+ status: external_exports.enum(["sent", "failed", "skipped"]),
7994
+ attempts: external_exports.number().int().nonnegative(),
7995
+ lastError: external_exports.string().optional(),
7996
+ skippedReason: external_exports.string().optional(),
7997
+ sentAt: external_exports.string().nullable().optional(),
7998
+ createdAt: external_exports.string()
7999
+ });
8000
+ var CustomerEmailPatchBodySchema = external_exports.object({
8001
+ version: external_exports.number().int().nonnegative(),
8002
+ patch: external_exports.object({
8003
+ enabled: external_exports.boolean().optional(),
8004
+ subject: external_exports.string().max(300).optional(),
8005
+ preheader: external_exports.string().max(300).optional(),
8006
+ badge: external_exports.string().max(120).optional(),
8007
+ heading: external_exports.string().max(200).optional(),
8008
+ paragraphs: external_exports.array(external_exports.string().max(2e3)).max(12).optional(),
8009
+ note: external_exports.string().max(2e3).optional(),
8010
+ disclosure: external_exports.array(external_exports.string().max(2e3)).max(12).optional(),
8011
+ ctaLabel: external_exports.string().max(120).optional(),
8012
+ ctaUrl: external_exports.string().max(500).optional(),
8013
+ secondaryCtaLabel: external_exports.string().max(120).optional(),
8014
+ secondaryCtaUrl: external_exports.string().max(500).optional()
8015
+ }).strict().refine(
8016
+ (p) => Object.keys(p).length > 0,
8017
+ { message: "patch must contain at least one field" }
8018
+ )
8019
+ });
7888
8020
  var CustomerDetailsSchema = external_exports.object({
7889
8021
  email: external_exports.string().email().max(254),
7890
8022
  phone: external_exports.string().min(3).max(30),
7891
- nationalId: external_exports.string().min(5).max(20),
8023
+ nationalId: external_exports.string().min(5).max(20).refine(isValidIsraeliNationalId, "invalidNationalId"),
7892
8024
  installationAddress: external_exports.string().min(3).max(300),
7893
8025
  businessName: external_exports.string().max(120).optional(),
7894
8026
  contactPerson: external_exports.string().max(120).optional()
@@ -7902,6 +8034,11 @@ var OrderTransitionSchema = external_exports.object({
7902
8034
  /** Admin/support override: force-set the main status to `to`, bypassing the legal transition map. */
7903
8035
  override: external_exports.boolean().optional()
7904
8036
  });
8037
+ var UpdateOrderDateSchema = external_exports.object({
8038
+ field: external_exports.enum(["appointmentDate", "scheduledDate"]),
8039
+ value: external_exports.coerce.date(),
8040
+ reason: external_exports.string().max(500).optional()
8041
+ });
7905
8042
 
7906
8043
  // ../../packages/shared/src/pricing.ts
7907
8044
  init_esm_shims();
@@ -7909,6 +8046,9 @@ init_esm_shims();
7909
8046
  // ../../packages/shared/src/manufacturingBom/price.ts
7910
8047
  init_esm_shims();
7911
8048
 
8049
+ // ../../packages/shared/src/discount.ts
8050
+ init_esm_shims();
8051
+
7912
8052
  // ../../packages/shared/src/materials.ts
7913
8053
  init_esm_shims();
7914
8054
  var MATERIALS = {
@@ -9266,6 +9406,9 @@ init_esm_shims();
9266
9406
  // ../../packages/shared/src/permissions.ts
9267
9407
  init_esm_shims();
9268
9408
 
9409
+ // ../../packages/shared/src/legal.ts
9410
+ init_esm_shims();
9411
+
9269
9412
  // ../../packages/shared/src/orderWorkflow.ts
9270
9413
  init_esm_shims();
9271
9414
  var ORDER_STATUSES = [
@@ -9339,6 +9482,22 @@ var ORDER_EMAIL_EVENTS = [
9339
9482
  ];
9340
9483
  var ALL_ORDER_EMAIL_EVENTS = ORDER_EMAIL_EVENTS.map((e) => e.event);
9341
9484
 
9485
+ // ../../packages/shared/src/customerEmails.ts
9486
+ init_esm_shims();
9487
+ var CUSTOMER_EMAILS = [
9488
+ { 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 },
9489
+ { key: "measurement_coordination", label: "\u05EA\u05D9\u05D0\u05D5\u05DD \u05DE\u05D3\u05D9\u05D3\u05D4", step: 2, hasHero: false, hasLineItems: false },
9490
+ { 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 },
9491
+ { key: "production_complete", label: "\u05E1\u05D9\u05D5\u05DD \u05D9\u05D9\u05E6\u05D5\u05E8", step: 4, hasHero: false, hasLineItems: false },
9492
+ { key: "installation_scheduled", label: "\u05EA\u05D9\u05D0\u05D5\u05DD \u05D5\u05D4\u05EA\u05E7\u05E0\u05D4", step: 5, hasHero: false, hasLineItems: false },
9493
+ { key: "installation_complete", label: "\u05DC\u05D0\u05D7\u05E8 \u05D4\u05EA\u05E7\u05E0\u05D4", step: 5, hasHero: true, hasLineItems: false },
9494
+ { key: "appointment_changed", label: "\u05E9\u05D9\u05E0\u05D5\u05D9 \u05DE\u05D5\u05E2\u05D3", step: null, hasHero: false, hasLineItems: false },
9495
+ { key: "order_revised", label: "\u05E2\u05D3\u05DB\u05D5\u05DF \u05D4\u05D6\u05DE\u05E0\u05D4", step: null, hasHero: false, hasLineItems: true }
9496
+ ];
9497
+ var CUSTOMER_EMAIL_BY_KEY = Object.fromEntries(
9498
+ CUSTOMER_EMAILS.map((d) => [d.key, d])
9499
+ );
9500
+
9342
9501
  // ../../packages/shared/src/manufacturingBom/index.ts
9343
9502
  init_esm_shims();
9344
9503
 
@@ -11707,7 +11866,7 @@ async function formatCliError(err, json) {
11707
11866
 
11708
11867
  // src/version.ts
11709
11868
  init_esm_shims();
11710
- var CLI_VERSION = "1.1.1";
11869
+ var CLI_VERSION = "1.1.3";
11711
11870
 
11712
11871
  // src/index.ts
11713
11872
  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.3",
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",