@happyvertical/smrt-products 0.30.0
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/AGENTS.md +122 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +115 -0
- package/dist/lib/__smrt-register__.d.ts +2 -0
- package/dist/lib/__smrt-register__.d.ts.map +1 -0
- package/dist/lib/app/main.d.ts +6 -0
- package/dist/lib/app/main.d.ts.map +1 -0
- package/dist/lib/chunks/ProductAssetCollection-DFPXN43q.js +64 -0
- package/dist/lib/chunks/ProductAssetCollection-DFPXN43q.js.map +1 -0
- package/dist/lib/chunks/ProductForm-DHeb2L24.js +371 -0
- package/dist/lib/chunks/ProductForm-DHeb2L24.js.map +1 -0
- package/dist/lib/chunks/Sku-DUKtbYWT.js +511 -0
- package/dist/lib/chunks/Sku-DUKtbYWT.js.map +1 -0
- package/dist/lib/chunks/SkuCollection-C0tdkEdL.js +160 -0
- package/dist/lib/chunks/SkuCollection-C0tdkEdL.js.map +1 -0
- package/dist/lib/chunks/__smrt-register__-BIgFaVKn.js +5 -0
- package/dist/lib/chunks/__smrt-register__-BIgFaVKn.js.map +1 -0
- package/dist/lib/chunks/index-i3-ci1FB.js +6 -0
- package/dist/lib/chunks/index-i3-ci1FB.js.map +1 -0
- package/dist/lib/chunks/product-store.svelte-Dayd5n3W.js +132 -0
- package/dist/lib/chunks/product-store.svelte-Dayd5n3W.js.map +1 -0
- package/dist/lib/client.d.ts +9 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/collections.d.ts +2 -0
- package/dist/lib/collections.d.ts.map +1 -0
- package/dist/lib/collections.js +12 -0
- package/dist/lib/collections.js.map +1 -0
- package/dist/lib/components.d.ts +2 -0
- package/dist/lib/components.d.ts.map +1 -0
- package/dist/lib/components.js +6 -0
- package/dist/lib/components.js.map +1 -0
- package/dist/lib/generated.d.ts +2 -0
- package/dist/lib/generated.d.ts.map +1 -0
- package/dist/lib/generated.js +5 -0
- package/dist/lib/generated.js.map +1 -0
- package/dist/lib/index.d.ts +14 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +228 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/lib/collections/CategoryCollection.d.ts +20 -0
- package/dist/lib/lib/collections/CategoryCollection.d.ts.map +1 -0
- package/dist/lib/lib/collections/MaterialCollection.d.ts +20 -0
- package/dist/lib/lib/collections/MaterialCollection.d.ts.map +1 -0
- package/dist/lib/lib/collections/ProductAssetCollection.d.ts +16 -0
- package/dist/lib/lib/collections/ProductAssetCollection.d.ts.map +1 -0
- package/dist/lib/lib/collections/ProductCollection.d.ts +12 -0
- package/dist/lib/lib/collections/ProductCollection.d.ts.map +1 -0
- package/dist/lib/lib/collections/ProductVariantCollection.d.ts +10 -0
- package/dist/lib/lib/collections/ProductVariantCollection.d.ts.map +1 -0
- package/dist/lib/lib/collections/SkuCollection.d.ts +31 -0
- package/dist/lib/lib/collections/SkuCollection.d.ts.map +1 -0
- package/dist/lib/lib/collections/index.d.ts +7 -0
- package/dist/lib/lib/collections/index.d.ts.map +1 -0
- package/dist/lib/lib/components/ProductCard.svelte +173 -0
- package/dist/lib/lib/components/ProductCard.svelte.d.ts +10 -0
- package/dist/lib/lib/components/ProductCard.svelte.d.ts.map +1 -0
- package/dist/lib/lib/components/ProductForm.svelte +289 -0
- package/dist/lib/lib/components/ProductForm.svelte.d.ts +11 -0
- package/dist/lib/lib/components/ProductForm.svelte.d.ts.map +1 -0
- package/dist/lib/lib/components/TestComponent.svelte +25 -0
- package/dist/lib/lib/components/TestComponent.svelte.d.ts +7 -0
- package/dist/lib/lib/components/TestComponent.svelte.d.ts.map +1 -0
- package/dist/lib/lib/components/auto-generated/AutoForm.svelte +240 -0
- package/dist/lib/lib/components/auto-generated/AutoForm.svelte.d.ts +13 -0
- package/dist/lib/lib/components/auto-generated/AutoForm.svelte.d.ts.map +1 -0
- package/dist/lib/lib/components/auto-generated/FieldRenderer.svelte +205 -0
- package/dist/lib/lib/components/auto-generated/FieldRenderer.svelte.d.ts +14 -0
- package/dist/lib/lib/components/auto-generated/FieldRenderer.svelte.d.ts.map +1 -0
- package/dist/lib/lib/components/index.d.ts +12 -0
- package/dist/lib/lib/components/index.d.ts.map +1 -0
- package/dist/lib/lib/components/index.js +11 -0
- package/dist/lib/lib/features/CategoryManager.svelte +80 -0
- package/dist/lib/lib/features/CategoryManager.svelte.d.ts +7 -0
- package/dist/lib/lib/features/CategoryManager.svelte.d.ts.map +1 -0
- package/dist/lib/lib/features/ProductCatalog.svelte +299 -0
- package/dist/lib/lib/features/ProductCatalog.svelte.d.ts +8 -0
- package/dist/lib/lib/features/ProductCatalog.svelte.d.ts.map +1 -0
- package/dist/lib/lib/federation-entry.d.ts +11 -0
- package/dist/lib/lib/federation-entry.d.ts.map +1 -0
- package/dist/lib/lib/generated/index.d.ts +2 -0
- package/dist/lib/lib/generated/index.d.ts.map +1 -0
- package/dist/lib/lib/i18n.d.ts +79 -0
- package/dist/lib/lib/i18n.d.ts.map +1 -0
- package/dist/lib/lib/index.d.ts +20 -0
- package/dist/lib/lib/index.d.ts.map +1 -0
- package/dist/lib/lib/mock-smrt-client.d.ts +40 -0
- package/dist/lib/lib/mock-smrt-client.d.ts.map +1 -0
- package/dist/lib/lib/mock-smrt-client.js +129 -0
- package/dist/lib/lib/mock-smrt-client.js.map +1 -0
- package/dist/lib/lib/models/Category.d.ts +38 -0
- package/dist/lib/lib/models/Category.d.ts.map +1 -0
- package/dist/lib/lib/models/Material.d.ts +22 -0
- package/dist/lib/lib/models/Material.d.ts.map +1 -0
- package/dist/lib/lib/models/Product.d.ts +57 -0
- package/dist/lib/lib/models/Product.d.ts.map +1 -0
- package/dist/lib/lib/models/ProductAsset.d.ts +17 -0
- package/dist/lib/lib/models/ProductAsset.d.ts.map +1 -0
- package/dist/lib/lib/models/ProductVariant.d.ts +51 -0
- package/dist/lib/lib/models/ProductVariant.d.ts.map +1 -0
- package/dist/lib/lib/models/Sku.d.ts +79 -0
- package/dist/lib/lib/models/Sku.d.ts.map +1 -0
- package/dist/lib/lib/models/index.d.ts +15 -0
- package/dist/lib/lib/models/index.d.ts.map +1 -0
- package/dist/lib/lib/models/types.d.ts +41 -0
- package/dist/lib/lib/models/types.d.ts.map +1 -0
- package/dist/lib/lib/stores/index.d.ts +8 -0
- package/dist/lib/lib/stores/index.d.ts.map +1 -0
- package/dist/lib/lib/stores/index.js +7 -0
- package/dist/lib/lib/stores/product-store.client.svelte.d.ts +45 -0
- package/dist/lib/lib/stores/product-store.client.svelte.d.ts.map +1 -0
- package/dist/lib/lib/stores/product-store.client.svelte.js +147 -0
- package/dist/lib/lib/stores/product-store.svelte.d.ts +29 -0
- package/dist/lib/lib/stores/product-store.svelte.d.ts.map +1 -0
- package/dist/lib/lib/stores/product-store.svelte.js +144 -0
- package/dist/lib/lib/types.d.ts +43 -0
- package/dist/lib/lib/types.d.ts.map +1 -0
- package/dist/lib/lib/utils/index.d.ts +10 -0
- package/dist/lib/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/main.d.ts +5 -0
- package/dist/lib/main.d.ts.map +1 -0
- package/dist/lib/manifest.json +3758 -0
- package/dist/lib/mcp.d.ts +14 -0
- package/dist/lib/mcp.d.ts.map +1 -0
- package/dist/lib/models.d.ts +2 -0
- package/dist/lib/models.d.ts.map +1 -0
- package/dist/lib/models.js +12 -0
- package/dist/lib/models.js.map +1 -0
- package/dist/lib/native-api-server.d.ts +7 -0
- package/dist/lib/native-api-server.d.ts.map +1 -0
- package/dist/lib/server.d.ts +11 -0
- package/dist/lib/server.d.ts.map +1 -0
- package/dist/lib/simple-api-server.d.ts +7 -0
- package/dist/lib/simple-api-server.d.ts.map +1 -0
- package/dist/lib/simple-server.d.ts +6 -0
- package/dist/lib/simple-server.d.ts.map +1 -0
- package/dist/lib/smrt-knowledge.json +1584 -0
- package/dist/lib/smrt-products.css +233 -0
- package/dist/lib/stores.d.ts +2 -0
- package/dist/lib/stores.d.ts.map +1 -0
- package/dist/lib/stores.js +6 -0
- package/dist/lib/stores.js.map +1 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +27 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +127 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export declare const M: {
|
|
2
|
+
readonly 'products.app.categories_coming_soon': "products.app.categories_coming_soon";
|
|
3
|
+
readonly 'products.app.analytics_coming_soon': "products.app.analytics_coming_soon";
|
|
4
|
+
readonly 'products.app_layout.service_title': "products.app_layout.service_title";
|
|
5
|
+
readonly 'products.app_layout.footer_copyright': "products.app_layout.footer_copyright";
|
|
6
|
+
readonly 'products.app_layout.api_docs': "products.app_layout.api_docs";
|
|
7
|
+
readonly 'products.app_layout.mcp_tools': "products.app_layout.mcp_tools";
|
|
8
|
+
readonly 'products.demo_page.title': "products.demo_page.title";
|
|
9
|
+
readonly 'products.demo_page.subtitle': "products.demo_page.subtitle";
|
|
10
|
+
readonly 'products.demo_page.custom_components_tab': "products.demo_page.custom_components_tab";
|
|
11
|
+
readonly 'products.demo_page.auto_generated_heading': "products.demo_page.auto_generated_heading";
|
|
12
|
+
readonly 'products.demo_page.auto_generated_description': "products.demo_page.auto_generated_description";
|
|
13
|
+
readonly 'products.demo_page.generated_form_heading': "products.demo_page.generated_form_heading";
|
|
14
|
+
readonly 'products.demo_page.auto_form_title': "products.demo_page.auto_form_title";
|
|
15
|
+
readonly 'products.demo_page.generated_display_heading': "products.demo_page.generated_display_heading";
|
|
16
|
+
readonly 'products.demo_page.custom_components_heading': "products.demo_page.custom_components_heading";
|
|
17
|
+
readonly 'products.demo_page.custom_components_description': "products.demo_page.custom_components_description";
|
|
18
|
+
readonly 'products.demo_page.custom_form_heading': "products.demo_page.custom_form_heading";
|
|
19
|
+
readonly 'products.demo_page.custom_display_heading': "products.demo_page.custom_display_heading";
|
|
20
|
+
readonly 'products.demo_page.progressive_heading': "products.demo_page.progressive_heading";
|
|
21
|
+
readonly 'products.demo_page.progressive_description': "products.demo_page.progressive_description";
|
|
22
|
+
readonly 'products.demo_page.feature_zero_config': "products.demo_page.feature_zero_config";
|
|
23
|
+
readonly 'products.demo_page.feature_instant_ui': "products.demo_page.feature_instant_ui";
|
|
24
|
+
readonly 'products.demo_page.feature_type_safe': "products.demo_page.feature_type_safe";
|
|
25
|
+
readonly 'products.demo_page.feature_prototyping': "products.demo_page.feature_prototyping";
|
|
26
|
+
readonly 'products.demo_page.custom_components_label': "products.demo_page.custom_components_label";
|
|
27
|
+
readonly 'products.demo_page.feature_tailored_ux': "products.demo_page.feature_tailored_ux";
|
|
28
|
+
readonly 'products.demo_page.feature_business_workflows': "products.demo_page.feature_business_workflows";
|
|
29
|
+
readonly 'products.demo_page.feature_advanced_interactions': "products.demo_page.feature_advanced_interactions";
|
|
30
|
+
readonly 'products.demo_page.simple_auto_form_title': "products.demo_page.simple_auto_form_title";
|
|
31
|
+
readonly 'products.demo_page.benefits_heading': "products.demo_page.benefits_heading";
|
|
32
|
+
readonly 'products.demo_page.benefit_define_once_label': "products.demo_page.benefit_define_once_label";
|
|
33
|
+
readonly 'products.demo_page.benefit_define_once_text': "products.demo_page.benefit_define_once_text";
|
|
34
|
+
readonly 'products.demo_page.benefit_auto_generate_label': "products.demo_page.benefit_auto_generate_label";
|
|
35
|
+
readonly 'products.demo_page.benefit_auto_generate_text': "products.demo_page.benefit_auto_generate_text";
|
|
36
|
+
readonly 'products.demo_page.benefit_progressive_label': "products.demo_page.benefit_progressive_label";
|
|
37
|
+
readonly 'products.demo_page.benefit_progressive_text': "products.demo_page.benefit_progressive_text";
|
|
38
|
+
readonly 'products.demo_page.benefit_type_safety_label': "products.demo_page.benefit_type_safety_label";
|
|
39
|
+
readonly 'products.demo_page.benefit_type_safety_text': "products.demo_page.benefit_type_safety_text";
|
|
40
|
+
readonly 'products.demo_page.benefit_multiple_consumption_label': "products.demo_page.benefit_multiple_consumption_label";
|
|
41
|
+
readonly 'products.demo_page.benefit_multiple_consumption_text': "products.demo_page.benefit_multiple_consumption_text";
|
|
42
|
+
readonly 'products.products_page.description': "products.products_page.description";
|
|
43
|
+
readonly 'products.products_page.auto_generated_text': "products.products_page.auto_generated_text";
|
|
44
|
+
readonly 'products.products_page.ai_ready_heading': "products.products_page.ai_ready_heading";
|
|
45
|
+
readonly 'products.products_page.ai_ready_text': "products.products_page.ai_ready_text";
|
|
46
|
+
readonly 'products.products_page.federatable_text': "products.products_page.federatable_text";
|
|
47
|
+
readonly 'products.products_page.library_text': "products.products_page.library_text";
|
|
48
|
+
readonly 'products.product_form.name_label': "products.product_form.name_label";
|
|
49
|
+
readonly 'products.product_form.name_placeholder': "products.product_form.name_placeholder";
|
|
50
|
+
readonly 'products.product_form.description_placeholder': "products.product_form.description_placeholder";
|
|
51
|
+
readonly 'products.product_form.category_placeholder': "products.product_form.category_placeholder";
|
|
52
|
+
readonly 'products.product_form.tags_placeholder': "products.product_form.tags_placeholder";
|
|
53
|
+
readonly 'products.product_form.tags_hint': "products.product_form.tags_hint";
|
|
54
|
+
readonly 'products.product_form.in_stock_label': "products.product_form.in_stock_label";
|
|
55
|
+
readonly 'products.test_component.title': "products.test_component.title";
|
|
56
|
+
readonly 'products.auto_form.subtitle': "products.auto_form.subtitle";
|
|
57
|
+
readonly 'products.auto_form.debug_summary': "products.auto_form.debug_summary";
|
|
58
|
+
readonly 'products.field_renderer.array_hint': "products.field_renderer.array_hint";
|
|
59
|
+
readonly 'products.field_renderer.object_hint': "products.field_renderer.object_hint";
|
|
60
|
+
readonly 'products.category_manager.title': "products.category_manager.title";
|
|
61
|
+
readonly 'products.category_manager.subtitle': "products.category_manager.subtitle";
|
|
62
|
+
readonly 'products.category_manager.coming_soon': "products.category_manager.coming_soon";
|
|
63
|
+
readonly 'products.category_manager.will_include': "products.category_manager.will_include";
|
|
64
|
+
readonly 'products.category_manager.create_edit': "products.category_manager.create_edit";
|
|
65
|
+
readonly 'products.category_manager.organize_hierarchy': "products.category_manager.organize_hierarchy";
|
|
66
|
+
readonly 'products.category_manager.manage_permissions': "products.category_manager.manage_permissions";
|
|
67
|
+
readonly 'products.category_manager.analytics': "products.category_manager.analytics";
|
|
68
|
+
readonly 'products.product_catalog.title': "products.product_catalog.title";
|
|
69
|
+
readonly 'products.product_catalog.in_stock': "products.product_catalog.in_stock";
|
|
70
|
+
readonly 'products.product_catalog.total_value': "products.product_catalog.total_value";
|
|
71
|
+
readonly 'products.product_catalog.search_placeholder': "products.product_catalog.search_placeholder";
|
|
72
|
+
readonly 'products.product_catalog.all_categories': "products.product_catalog.all_categories";
|
|
73
|
+
readonly 'products.product_catalog.add_product': "products.product_catalog.add_product";
|
|
74
|
+
readonly 'products.product_catalog.loading': "products.product_catalog.loading";
|
|
75
|
+
readonly 'products.product_catalog.empty': "products.product_catalog.empty";
|
|
76
|
+
readonly 'products.product_catalog.create_first': "products.product_catalog.create_first";
|
|
77
|
+
readonly 'products.product_catalog.no_match': "products.product_catalog.no_match";
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../src/lib/i18n.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwHZ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMRT Template Library
|
|
3
|
+
*
|
|
4
|
+
* Complete library export for triple-purpose usage:
|
|
5
|
+
* 1. NPM package imports: import { Product, ProductCard } from '@company/product-service'
|
|
6
|
+
* 2. Module federation: Remote consumption of components
|
|
7
|
+
* 3. Standalone application: Internal imports for the full app
|
|
8
|
+
*/
|
|
9
|
+
export { default as createClient } from '@smrt/client';
|
|
10
|
+
export { manifest } from '@smrt/manifest';
|
|
11
|
+
export { default as createMCPServer } from '@smrt/mcp';
|
|
12
|
+
export { default as setupRoutes } from '@smrt/routes';
|
|
13
|
+
export type * from '@smrt/types';
|
|
14
|
+
export * from './collections/index';
|
|
15
|
+
export * from './components/index';
|
|
16
|
+
export * from './generated/index';
|
|
17
|
+
export * from './models/index';
|
|
18
|
+
export * from './stores/index';
|
|
19
|
+
export * from './utils/index';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AACtD,mBAAmB,aAAa,CAAC;AACjC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,mBAAmB,CAAC;AAElC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAE/B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock SMRT Client - Temporary implementation for demo purposes
|
|
3
|
+
*
|
|
4
|
+
* This replaces the missing @smrt/client virtual module with a working implementation
|
|
5
|
+
* that demonstrates the intended functionality.
|
|
6
|
+
*/
|
|
7
|
+
export interface ProductData {
|
|
8
|
+
id?: string;
|
|
9
|
+
name: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
category: string;
|
|
12
|
+
manufacturer?: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
price?: number;
|
|
15
|
+
inStock?: boolean;
|
|
16
|
+
specifications?: Record<string, any>;
|
|
17
|
+
tags?: string[];
|
|
18
|
+
createdAt?: string;
|
|
19
|
+
updatedAt?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ApiResponse<T> {
|
|
22
|
+
data: T;
|
|
23
|
+
success: boolean;
|
|
24
|
+
message?: string;
|
|
25
|
+
}
|
|
26
|
+
declare class MockApiClient {
|
|
27
|
+
products: {
|
|
28
|
+
list(): Promise<ApiResponse<ProductData[]>>;
|
|
29
|
+
get(id: string): Promise<ApiResponse<ProductData>>;
|
|
30
|
+
create(productData: Partial<ProductData>): Promise<ApiResponse<ProductData>>;
|
|
31
|
+
update(id: string, updates: Partial<ProductData>): Promise<ApiResponse<ProductData>>;
|
|
32
|
+
delete(id: string): Promise<ApiResponse<void>>;
|
|
33
|
+
};
|
|
34
|
+
categories: {
|
|
35
|
+
list(): Promise<ApiResponse<string[]>>;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export declare function createClient(baseUrl?: string): MockApiClient;
|
|
39
|
+
export default createClient;
|
|
40
|
+
//# sourceMappingURL=mock-smrt-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-smrt-client.d.ts","sourceRoot":"","sources":["../../../src/lib/mock-smrt-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkCD,cAAM,aAAa;IACjB,QAAQ;gBACQ,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;gBAWnC,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;4BAgBzC,OAAO,CAAC,WAAW,CAAC,GAChC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;mBA4B9B,MAAM,WACD,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;mBAuBnB,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;MAgBpD;IAEF,UAAU;gBACM,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;MAa5C;CACH;AAED,wBAAgB,YAAY,CAAC,OAAO,SAAY,GAAG,aAAa,CAE/D;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
const mockProducts = [
|
|
2
|
+
{
|
|
3
|
+
id: "1",
|
|
4
|
+
name: "Demo Product",
|
|
5
|
+
description: "A sample product for demonstration",
|
|
6
|
+
category: "Electronics",
|
|
7
|
+
manufacturer: "Demo Corp",
|
|
8
|
+
model: "DM-100",
|
|
9
|
+
price: 29.99,
|
|
10
|
+
inStock: true,
|
|
11
|
+
specifications: { weight: "1.2kg", color: "Black" },
|
|
12
|
+
tags: ["demo", "sample"],
|
|
13
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
14
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: "2",
|
|
18
|
+
name: "Budget Item",
|
|
19
|
+
description: "An affordable option",
|
|
20
|
+
category: "Accessories",
|
|
21
|
+
manufacturer: "Budget Inc",
|
|
22
|
+
model: "BI-200",
|
|
23
|
+
price: 19.99,
|
|
24
|
+
inStock: false,
|
|
25
|
+
specifications: { size: "small" },
|
|
26
|
+
tags: ["budget", "affordable"],
|
|
27
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
28
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
class MockApiClient {
|
|
32
|
+
products = {
|
|
33
|
+
async list() {
|
|
34
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
35
|
+
return {
|
|
36
|
+
data: [...mockProducts],
|
|
37
|
+
success: true,
|
|
38
|
+
message: "Products retrieved successfully"
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
async get(id) {
|
|
42
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
43
|
+
const product = mockProducts.find((p) => p.id === id);
|
|
44
|
+
if (!product) {
|
|
45
|
+
throw new Error(`Product with id ${id} not found`);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
data: product,
|
|
49
|
+
success: true,
|
|
50
|
+
message: "Product retrieved successfully"
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
async create(productData) {
|
|
54
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
55
|
+
const newProduct = {
|
|
56
|
+
id: (mockProducts.length + 1).toString(),
|
|
57
|
+
name: productData.name || "Untitled Product",
|
|
58
|
+
description: productData.description || "",
|
|
59
|
+
category: productData.category || "Uncategorized",
|
|
60
|
+
manufacturer: productData.manufacturer || "",
|
|
61
|
+
model: productData.model || "",
|
|
62
|
+
price: productData.price || 0,
|
|
63
|
+
inStock: productData.inStock ?? true,
|
|
64
|
+
specifications: productData.specifications || {},
|
|
65
|
+
tags: productData.tags || [],
|
|
66
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
67
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
68
|
+
};
|
|
69
|
+
mockProducts.push(newProduct);
|
|
70
|
+
return {
|
|
71
|
+
data: newProduct,
|
|
72
|
+
success: true,
|
|
73
|
+
message: "Product created successfully"
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
async update(id, updates) {
|
|
77
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
78
|
+
const index = mockProducts.findIndex((p) => p.id === id);
|
|
79
|
+
if (index === -1) {
|
|
80
|
+
throw new Error(`Product with id ${id} not found`);
|
|
81
|
+
}
|
|
82
|
+
const updatedProduct = {
|
|
83
|
+
...mockProducts[index],
|
|
84
|
+
...updates,
|
|
85
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
86
|
+
};
|
|
87
|
+
mockProducts[index] = updatedProduct;
|
|
88
|
+
return {
|
|
89
|
+
data: updatedProduct,
|
|
90
|
+
success: true,
|
|
91
|
+
message: "Product updated successfully"
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
async delete(id) {
|
|
95
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
96
|
+
const index = mockProducts.findIndex((p) => p.id === id);
|
|
97
|
+
if (index === -1) {
|
|
98
|
+
throw new Error(`Product with id ${id} not found`);
|
|
99
|
+
}
|
|
100
|
+
mockProducts.splice(index, 1);
|
|
101
|
+
return {
|
|
102
|
+
data: void 0,
|
|
103
|
+
success: true,
|
|
104
|
+
message: "Product deleted successfully"
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
categories = {
|
|
109
|
+
async list() {
|
|
110
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
111
|
+
const categories = Array.from(
|
|
112
|
+
new Set(mockProducts.map((p) => p.category).filter(Boolean))
|
|
113
|
+
);
|
|
114
|
+
return {
|
|
115
|
+
data: categories,
|
|
116
|
+
success: true,
|
|
117
|
+
message: "Categories retrieved successfully"
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function createClient(baseUrl = "/api/v1") {
|
|
123
|
+
return new MockApiClient();
|
|
124
|
+
}
|
|
125
|
+
export {
|
|
126
|
+
createClient,
|
|
127
|
+
createClient as default
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=mock-smrt-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-smrt-client.js","sources":["../../../src/lib/mock-smrt-client.ts"],"sourcesContent":["/**\n * Mock SMRT Client - Temporary implementation for demo purposes\n *\n * This replaces the missing @smrt/client virtual module with a working implementation\n * that demonstrates the intended functionality.\n */\n\nexport interface ProductData {\n id?: string;\n name: string;\n description?: string;\n category: string;\n manufacturer?: string;\n model?: string;\n price?: number;\n inStock?: boolean;\n specifications?: Record<string, any>;\n tags?: string[];\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface ApiResponse<T> {\n data: T;\n success: boolean;\n message?: string;\n}\n\n// Mock data store\nconst mockProducts: ProductData[] = [\n {\n id: '1',\n name: 'Demo Product',\n description: 'A sample product for demonstration',\n category: 'Electronics',\n manufacturer: 'Demo Corp',\n model: 'DM-100',\n price: 29.99,\n inStock: true,\n specifications: { weight: '1.2kg', color: 'Black' },\n tags: ['demo', 'sample'],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n {\n id: '2',\n name: 'Budget Item',\n description: 'An affordable option',\n category: 'Accessories',\n manufacturer: 'Budget Inc',\n model: 'BI-200',\n price: 19.99,\n inStock: false,\n specifications: { size: 'small' },\n tags: ['budget', 'affordable'],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n];\n\nclass MockApiClient {\n products = {\n async list(): Promise<ApiResponse<ProductData[]>> {\n // Simulate API delay\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n return {\n data: [...mockProducts],\n success: true,\n message: 'Products retrieved successfully',\n };\n },\n\n async get(id: string): Promise<ApiResponse<ProductData>> {\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n const product = mockProducts.find((p) => p.id === id);\n if (!product) {\n throw new Error(`Product with id ${id} not found`);\n }\n\n return {\n data: product,\n success: true,\n message: 'Product retrieved successfully',\n };\n },\n\n async create(\n productData: Partial<ProductData>,\n ): Promise<ApiResponse<ProductData>> {\n await new Promise((resolve) => setTimeout(resolve, 300));\n\n const newProduct: ProductData = {\n id: (mockProducts.length + 1).toString(),\n name: productData.name || 'Untitled Product',\n description: productData.description || '',\n category: productData.category || 'Uncategorized',\n manufacturer: productData.manufacturer || '',\n model: productData.model || '',\n price: productData.price || 0,\n inStock: productData.inStock ?? true,\n specifications: productData.specifications || {},\n tags: productData.tags || [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n mockProducts.push(newProduct);\n\n return {\n data: newProduct,\n success: true,\n message: 'Product created successfully',\n };\n },\n\n async update(\n id: string,\n updates: Partial<ProductData>,\n ): Promise<ApiResponse<ProductData>> {\n await new Promise((resolve) => setTimeout(resolve, 300));\n\n const index = mockProducts.findIndex((p) => p.id === id);\n if (index === -1) {\n throw new Error(`Product with id ${id} not found`);\n }\n\n const updatedProduct = {\n ...mockProducts[index],\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n\n mockProducts[index] = updatedProduct;\n\n return {\n data: updatedProduct,\n success: true,\n message: 'Product updated successfully',\n };\n },\n\n async delete(id: string): Promise<ApiResponse<void>> {\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n const index = mockProducts.findIndex((p) => p.id === id);\n if (index === -1) {\n throw new Error(`Product with id ${id} not found`);\n }\n\n mockProducts.splice(index, 1);\n\n return {\n data: undefined as any,\n success: true,\n message: 'Product deleted successfully',\n };\n },\n };\n\n categories = {\n async list(): Promise<ApiResponse<string[]>> {\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n const categories = Array.from(\n new Set(mockProducts.map((p) => p.category).filter(Boolean)),\n );\n\n return {\n data: categories,\n success: true,\n message: 'Categories retrieved successfully',\n };\n },\n };\n}\n\nexport function createClient(baseUrl = '/api/v1'): MockApiClient {\n return new MockApiClient();\n}\n\nexport default createClient;\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SmrtObject, SmrtObjectOptions } from '@happyvertical/smrt-core';
|
|
2
|
+
/**
|
|
3
|
+
* Options for Category initialization
|
|
4
|
+
*/
|
|
5
|
+
export interface CategoryOptions extends SmrtObjectOptions {
|
|
6
|
+
tenantId?: string | null;
|
|
7
|
+
name?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
parentId?: string;
|
|
10
|
+
level?: number;
|
|
11
|
+
productCount?: number;
|
|
12
|
+
active?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Product knowledge base category for organizing product information.
|
|
16
|
+
*
|
|
17
|
+
* Optional tenancy — categories may be shared globally (tenantId=null) or
|
|
18
|
+
* scoped to a tenant. Hierarchical via parentId.
|
|
19
|
+
*/
|
|
20
|
+
export declare class Category extends SmrtObject {
|
|
21
|
+
/**
|
|
22
|
+
* Tenant ID for multi-tenant isolation.
|
|
23
|
+
* Nullable to support both tenant-scoped and global categories.
|
|
24
|
+
*/
|
|
25
|
+
tenantId: string | null;
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
parentId?: string;
|
|
29
|
+
level: number;
|
|
30
|
+
productCount: number;
|
|
31
|
+
active: boolean;
|
|
32
|
+
constructor(options?: CategoryOptions);
|
|
33
|
+
getProducts(): Promise<never[]>;
|
|
34
|
+
getSubcategories(): Promise<never[]>;
|
|
35
|
+
updateProductCount(): Promise<void>;
|
|
36
|
+
static getRootCategories(): Promise<Category[]>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=Category.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Category.d.ts","sourceRoot":"","sources":["../../../../src/lib/models/Category.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,UAAU,EACV,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAGlC;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAkBa,QAAS,SAAQ,UAAU;IACtC;;;OAGG;IAEH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,IAAI,SAAM;IACV,WAAW,SAAM;IAEjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,SAAK;IACV,YAAY,SAAK;IACjB,MAAM,UAAQ;gBAEF,OAAO,GAAE,eAAoB;IAWnC,WAAW;IAKX,gBAAgB;IAKhB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;WAK5B,iBAAiB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;CAItD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Meta } from '@happyvertical/smrt-core';
|
|
2
|
+
import { Product, ProductOptions } from './Product';
|
|
3
|
+
import { MaterialKind, ProductType } from './types';
|
|
4
|
+
export interface MaterialOptions extends ProductOptions {
|
|
5
|
+
materialKind?: MaterialKind;
|
|
6
|
+
uom?: string;
|
|
7
|
+
costPerUnit?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class Material extends Product {
|
|
10
|
+
productType: ProductType;
|
|
11
|
+
/** Classification — fabric, trim, thread, label, packaging, component, ... */
|
|
12
|
+
materialKind: Meta<MaterialKind>;
|
|
13
|
+
/** Unit of measure — "yards", "meters", "each", "grams", "lbs". */
|
|
14
|
+
uom: Meta<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Latest known cost per UOM. For sophisticated cost rollup, manufacturing
|
|
17
|
+
* may pull from purchase-order history instead of this denormalised value.
|
|
18
|
+
*/
|
|
19
|
+
costPerUnit: Meta<number>;
|
|
20
|
+
constructor(options?: MaterialOptions);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=Material.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Material.d.ts","sourceRoot":"","sources":["../../../../src/lib/models/Material.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,IAAI,EAAQ,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,KAAK,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzD,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAQD,qBAuBa,QAAS,SAAQ,OAAO;IAC1B,WAAW,EAAE,WAAW,CAAwB;IAUzD,8EAA8E;IAC9E,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAe;IAE/C,mEAAmE;IACnE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAU;IAE3B;;;OAGG;IACH,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAO;gBAEpB,OAAO,GAAE,eAAoB;CAQ1C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Asset } from '@happyvertical/smrt-assets';
|
|
2
|
+
import { SmrtObject, SmrtObjectOptions } from '@happyvertical/smrt-core';
|
|
3
|
+
import { ProductType } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Options for Product initialization
|
|
6
|
+
*/
|
|
7
|
+
export interface ProductOptions extends SmrtObjectOptions {
|
|
8
|
+
tenantId?: string | null;
|
|
9
|
+
productType?: ProductType;
|
|
10
|
+
name?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
category?: string;
|
|
13
|
+
manufacturer?: string;
|
|
14
|
+
model?: string;
|
|
15
|
+
price?: number;
|
|
16
|
+
inStock?: boolean;
|
|
17
|
+
specifications?: Record<string, any>;
|
|
18
|
+
tags?: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Product information for knowledge base queries.
|
|
22
|
+
*
|
|
23
|
+
* STI base — subclasses (e.g. `Material` upstream, `Style`/`Makeup` in the
|
|
24
|
+
* apparel template) share this table via the `_meta_type` discriminator
|
|
25
|
+
* and `productType` field. Optional tenancy lets the same package serve
|
|
26
|
+
* shared global catalogs OR per-merchant catalogs.
|
|
27
|
+
*/
|
|
28
|
+
export declare class Product extends SmrtObject {
|
|
29
|
+
/**
|
|
30
|
+
* Tenant ID for multi-tenant isolation.
|
|
31
|
+
* Nullable to support both tenant-scoped and global catalogs.
|
|
32
|
+
*/
|
|
33
|
+
tenantId: string | null;
|
|
34
|
+
/**
|
|
35
|
+
* STI discriminator. Subclasses override this with their type.
|
|
36
|
+
*/
|
|
37
|
+
productType: ProductType;
|
|
38
|
+
name: string;
|
|
39
|
+
description: string;
|
|
40
|
+
category: string;
|
|
41
|
+
manufacturer: string;
|
|
42
|
+
model: string;
|
|
43
|
+
price: number;
|
|
44
|
+
inStock: boolean;
|
|
45
|
+
specifications: Record<string, any>;
|
|
46
|
+
tags: string[];
|
|
47
|
+
constructor(options?: ProductOptions);
|
|
48
|
+
getSpecification(key: string): Promise<any>;
|
|
49
|
+
updateSpecification(key: string, value: any): Promise<void>;
|
|
50
|
+
private getProductAssetCollection;
|
|
51
|
+
getAssets(relationship?: string): Promise<Asset[]>;
|
|
52
|
+
addAsset(asset: Asset, relationship?: string, sortOrder?: number): Promise<void>;
|
|
53
|
+
removeAsset(assetId: string, relationship?: string): Promise<void>;
|
|
54
|
+
static searchByText(_query: string): Promise<Product[]>;
|
|
55
|
+
static findByManufacturer(_manufacturer: string): Promise<Product[]>;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=Product.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Product.d.ts","sourceRoot":"","sources":["../../../../src/lib/models/Product.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAMxD,OAAO,EACL,UAAU,EACV,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACvD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,qBA2Ba,OAAQ,SAAQ,UAAU;IACrC;;;OAGG;IAEH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B;;OAEG;IACH,WAAW,EAAE,WAAW,CAAuB;IAE/C,IAAI,SAAM;IACV,WAAW,SAAM;IACjB,QAAQ,SAAM;IACd,YAAY,SAAM;IAClB,KAAK,SAAM;IACX,KAAK,SAAK;IACV,OAAO,UAAQ;IACf,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAM;IACzC,IAAI,EAAE,MAAM,EAAE,CAAM;gBAER,OAAO,GAAE,cAAmB;IAwBlC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI3C,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAInD,yBAAyB;IAMjC,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAuClD,QAAQ,CACZ,KAAK,EAAE,KAAK,EACZ,YAAY,SAAe,EAC3B,SAAS,SAAI,GACZ,OAAO,CAAC,IAAI,CAAC;IAoBV,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAkB3D,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;WAKhD,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAI3E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SmrtObjectOptions, SmrtObject } from '@happyvertical/smrt-core';
|
|
2
|
+
export interface ProductAssetOptions extends SmrtObjectOptions {
|
|
3
|
+
tenantId?: string | null;
|
|
4
|
+
productId?: string;
|
|
5
|
+
assetId?: string;
|
|
6
|
+
relationship?: string;
|
|
7
|
+
sortOrder?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class ProductAsset extends SmrtObject {
|
|
10
|
+
tenantId: string | null;
|
|
11
|
+
productId: string;
|
|
12
|
+
assetId: string;
|
|
13
|
+
relationship: string;
|
|
14
|
+
sortOrder: number;
|
|
15
|
+
constructor(options?: ProductAssetOptions);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ProductAsset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductAsset.d.ts","sourceRoot":"","sources":["../../../../src/lib/models/ProductAsset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAIL,UAAU,EAEX,MAAM,0BAA0B,CAAC;AAGlC,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAYa,YAAa,SAAQ,UAAU;IAE1C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG/B,SAAS,SAAM;IAGf,OAAO,SAAM;IAGb,YAAY,SAAgB;IAG5B,SAAS,SAAK;gBAEF,OAAO,GAAE,mBAAwB;CAQ9C"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { SmrtObject, SmrtObjectOptions } from '@happyvertical/smrt-core';
|
|
2
|
+
/**
|
|
3
|
+
* Options accepted by the {@link ProductVariant} constructor.
|
|
4
|
+
*/
|
|
5
|
+
export interface ProductVariantOptions extends SmrtObjectOptions {
|
|
6
|
+
tenantId?: string | null;
|
|
7
|
+
productId?: string;
|
|
8
|
+
axisName?: string;
|
|
9
|
+
label?: string;
|
|
10
|
+
allowedValues?: string[] | string;
|
|
11
|
+
sortOrder?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class ProductVariant extends SmrtObject {
|
|
14
|
+
/** Tenant scope. `null` means the variant axis is global. */
|
|
15
|
+
tenantId: string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Plain string reference to the {@link Product} this axis belongs to
|
|
18
|
+
* (or any Product STI subtype — `Material`, or vertical subtypes
|
|
19
|
+
* defined in templates such as the apparel `Style` / `Makeup`).
|
|
20
|
+
*/
|
|
21
|
+
productId: string;
|
|
22
|
+
/**
|
|
23
|
+
* The name of the axis (`'size'`, `'color'`, `'finish'`, `'voltage'`,
|
|
24
|
+
* `'packSize'`, …). Free-form — the framework treats this as opaque.
|
|
25
|
+
*/
|
|
26
|
+
axisName: string;
|
|
27
|
+
/** Optional human-friendly label for forms / UIs (defaults to `axisName`). */
|
|
28
|
+
label: string;
|
|
29
|
+
/**
|
|
30
|
+
* Allowed values for this axis, stored as a JSON string. Named
|
|
31
|
+
* `allowedValues` (rather than `values`) because the unprefixed name
|
|
32
|
+
* collides with the SQL `VALUES` keyword on several engines. Use
|
|
33
|
+
* {@link getValues} / {@link setValues} to round-trip the array form.
|
|
34
|
+
*/
|
|
35
|
+
allowedValues: string;
|
|
36
|
+
/** Sort order for displaying multiple axes in a consistent column order. */
|
|
37
|
+
sortOrder: number;
|
|
38
|
+
constructor(options?: ProductVariantOptions);
|
|
39
|
+
/**
|
|
40
|
+
* Parse and return the {@link allowedValues} JSON array. Returns an
|
|
41
|
+
* empty array if the stored value cannot be parsed as an array.
|
|
42
|
+
*/
|
|
43
|
+
getValues(): string[];
|
|
44
|
+
/**
|
|
45
|
+
* Serialize the allowed values back into the stored
|
|
46
|
+
* {@link allowedValues} string. Accepts either an array or a
|
|
47
|
+
* pre-serialized JSON string.
|
|
48
|
+
*/
|
|
49
|
+
setValues(value: string[] | string): void;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=ProductVariant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductVariant.d.ts","sourceRoot":"","sources":["../../../../src/lib/models/ProductVariant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAEL,UAAU,EACV,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAGlC;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAQa,cAAe,SAAQ,UAAU;IAC5C,6DAA6D;IAE7D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B;;;;OAIG;IAEH,SAAS,EAAE,MAAM,CAAM;IAEvB;;;OAGG;IAEH,QAAQ,EAAE,MAAM,CAAM;IAEtB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAM;IAEnB;;;;;OAKG;IACH,aAAa,EAAE,MAAM,CAAQ;IAE7B,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAK;gBAEV,OAAO,GAAE,qBAA0B;IAmB/C;;;OAGG;IACH,SAAS,IAAI,MAAM,EAAE;IAUrB;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI;CAO1C"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { SmrtObject, SmrtObjectOptions } from '@happyvertical/smrt-core';
|
|
2
|
+
/**
|
|
3
|
+
* Options accepted by the {@link Sku} constructor.
|
|
4
|
+
*/
|
|
5
|
+
export interface SkuOptions extends SmrtObjectOptions {
|
|
6
|
+
tenantId?: string | null;
|
|
7
|
+
productId?: string;
|
|
8
|
+
code?: string;
|
|
9
|
+
barcode?: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
attributes?: Record<string, unknown> | string;
|
|
12
|
+
weightGrams?: number;
|
|
13
|
+
parentSkuId?: string;
|
|
14
|
+
active?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class Sku extends SmrtObject {
|
|
17
|
+
/** Tenant scope. `null` means the SKU is a global record. */
|
|
18
|
+
tenantId: string | null;
|
|
19
|
+
/**
|
|
20
|
+
* Plain string reference to a row in this package — typically a
|
|
21
|
+
* `Product` id (or any of its STI subtypes, such as `Material`
|
|
22
|
+
* upstream or `Style` / `Makeup` in the apparel template).
|
|
23
|
+
*
|
|
24
|
+
* Marked required so the framework rejects a save with `productId`
|
|
25
|
+
* empty or unset. Without this, downstream consumers (inventory
|
|
26
|
+
* stock motion, manufacturing BOM resolution) would have to filter
|
|
27
|
+
* out orphan SKU rows that point at no product — a sharp footgun
|
|
28
|
+
* the moment one slips through. The `@field({ required: true })`
|
|
29
|
+
* decorator also surfaces the constraint in generated REST/MCP
|
|
30
|
+
* schemas.
|
|
31
|
+
*/
|
|
32
|
+
productId: string;
|
|
33
|
+
/**
|
|
34
|
+
* Stable, human-meaningful identifier such as a UPC, internal SKU
|
|
35
|
+
* code, or part number. Together with `tenantId` this is the natural
|
|
36
|
+
* key (`conflictColumns: ['code', 'tenant_id']`), so re-saving an
|
|
37
|
+
* identical row is an upsert rather than a UNIQUE violation.
|
|
38
|
+
*/
|
|
39
|
+
code: string;
|
|
40
|
+
/** Optional scannable barcode (EAN/UPC/Code-128/etc.). */
|
|
41
|
+
barcode: string;
|
|
42
|
+
/** Display name for UIs. Optional — `code` is enough for machines. */
|
|
43
|
+
name: string;
|
|
44
|
+
/**
|
|
45
|
+
* Axis values for this SKU expressed as JSON, e.g. `{ size: 'M' }`,
|
|
46
|
+
* `{ finish: 'walnut' }`, or `{ voltage: '230V' }`.
|
|
47
|
+
*
|
|
48
|
+
* The persisted column type is text; use {@link getAttributes} and
|
|
49
|
+
* {@link setAttributes} to round-trip parsed values without worrying
|
|
50
|
+
* about parse errors.
|
|
51
|
+
*/
|
|
52
|
+
attributes: string;
|
|
53
|
+
/** Optional physical weight in grams for shipping / cost calculations. */
|
|
54
|
+
weightGrams: number;
|
|
55
|
+
/**
|
|
56
|
+
* Optional self-reference for bundles / kits — set to the id of the
|
|
57
|
+
* "parent" SKU that this SKU is a component of.
|
|
58
|
+
*/
|
|
59
|
+
parentSkuId: string;
|
|
60
|
+
/**
|
|
61
|
+
* Soft-active flag. Inactive SKUs stay queryable for history but
|
|
62
|
+
* should not be offered for sale or production planning.
|
|
63
|
+
*/
|
|
64
|
+
active: boolean;
|
|
65
|
+
constructor(options?: SkuOptions);
|
|
66
|
+
/**
|
|
67
|
+
* Parse and return the {@link attributes} JSON. Returns an empty
|
|
68
|
+
* object if the stored value is invalid JSON so callers don't have
|
|
69
|
+
* to wrap every read in a try/catch.
|
|
70
|
+
*/
|
|
71
|
+
getAttributes(): Record<string, unknown>;
|
|
72
|
+
/**
|
|
73
|
+
* Serialize axis values back into the stored {@link attributes}
|
|
74
|
+
* string. Accepts either an object (will be `JSON.stringify`'d) or a
|
|
75
|
+
* raw JSON string that the caller has already serialized.
|
|
76
|
+
*/
|
|
77
|
+
setAttributes(value: Record<string, unknown> | string): void;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=Sku.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sku.d.ts","sourceRoot":"","sources":["../../../../src/lib/models/Sku.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAEL,UAAU,EACV,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAGlC;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,iBAAiB;IACnD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAQa,GAAI,SAAQ,UAAU;IACjC,6DAA6D;IAE7D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B;;;;;;;;;;;;OAYG;IAEH,SAAS,EAAE,MAAM,CAAM;IAEvB;;;;;OAKG;IAEH,IAAI,EAAE,MAAM,CAAM;IAElB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAM;IAErB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAM;IAElB;;;;;;;OAOG;IACH,UAAU,EAAE,MAAM,CAAQ;IAE1B,0EAA0E;IAE1E,WAAW,EAAE,MAAM,CAAO;IAE1B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAM;IAEzB;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAQ;gBAEX,OAAO,GAAE,UAAe;IAgBpC;;;;OAIG;IACH,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYxC;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI;CAO7D"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type { CategoryOptions } from './Category';
|
|
2
|
+
export { Category } from './Category';
|
|
3
|
+
export type { MaterialOptions } from './Material';
|
|
4
|
+
export { Material } from './Material';
|
|
5
|
+
export type { ProductOptions } from './Product';
|
|
6
|
+
export { Product } from './Product';
|
|
7
|
+
export type { ProductAssetOptions } from './ProductAsset';
|
|
8
|
+
export { ProductAsset } from './ProductAsset';
|
|
9
|
+
export type { ProductVariantOptions } from './ProductVariant';
|
|
10
|
+
export { ProductVariant } from './ProductVariant';
|
|
11
|
+
export type { SkuOptions } from './Sku';
|
|
12
|
+
export { Sku } from './Sku';
|
|
13
|
+
export type { MaterialKind } from './types';
|
|
14
|
+
export { ProductType } from './types';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/models/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,4BAA4B,CAAC;AAEpC,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|