@kustomizer/visual-editor 0.0.1 → 0.1.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/LICENSE +12 -0
- package/README.md +25 -15
- package/fesm2022/kustomizer-visual-editor.mjs +955 -2075
- package/fesm2022/kustomizer-visual-editor.mjs.map +1 -1
- package/package.json +22 -13
- package/types/kustomizer-visual-editor.d.ts +263 -450
|
@@ -3,9 +3,7 @@ import { InjectionToken, Type, EnvironmentProviders, OnInit, OnDestroy } from '@
|
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import * as _ngrx_store from '@ngrx/store';
|
|
5
5
|
import * as _kustomizer_visual_editor from '@kustomizer/visual-editor';
|
|
6
|
-
import {
|
|
7
|
-
import { Session, User, SupabaseClient } from '@supabase/supabase-js';
|
|
8
|
-
import { CanActivateFn } from '@angular/router';
|
|
6
|
+
import { SafeResourceUrl } from '@angular/platform-browser';
|
|
9
7
|
|
|
10
8
|
/**
|
|
11
9
|
* Navigation target for the visual editor
|
|
@@ -18,6 +16,8 @@ type VisualEditorNavigationTarget = {
|
|
|
18
16
|
} | {
|
|
19
17
|
type: 'page-preview';
|
|
20
18
|
pageId: string;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'setup';
|
|
21
21
|
};
|
|
22
22
|
/**
|
|
23
23
|
* Confirmation dialog options
|
|
@@ -84,12 +84,20 @@ interface VisualEditorState {
|
|
|
84
84
|
declare const initialVisualEditorState: VisualEditorState;
|
|
85
85
|
declare const VISUAL_EDITOR_FEATURE_KEY = "visualEditor";
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Shopify configuration for GraphQL API access
|
|
89
|
+
*/
|
|
88
90
|
interface ShopifyConfig {
|
|
89
91
|
shopDomain: string;
|
|
90
92
|
accessToken: string;
|
|
91
93
|
apiVersion: string;
|
|
94
|
+
/** Optional proxy URL for development (bypasses CORS) */
|
|
95
|
+
proxyUrl?: string;
|
|
92
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Injection token for Shopify configuration
|
|
99
|
+
* Can be provided as a static object or as an Observable for dynamic config
|
|
100
|
+
*/
|
|
93
101
|
declare const SHOPIFY_CONFIG: InjectionToken<ShopifyConfig | Observable<ShopifyConfig>>;
|
|
94
102
|
/**
|
|
95
103
|
* Metafield representation from Shopify
|
|
@@ -118,6 +126,8 @@ interface PageIndexEntry {
|
|
|
118
126
|
updatedAt: string;
|
|
119
127
|
publishedAt?: string;
|
|
120
128
|
size: number;
|
|
129
|
+
/** MetafieldDefinition ID for this page's metafield (enables Storefront API access) */
|
|
130
|
+
definitionId?: string;
|
|
121
131
|
}
|
|
122
132
|
/**
|
|
123
133
|
* Index of all pages stored in a single metafield
|
|
@@ -187,6 +197,28 @@ interface UpdatePageRequest {
|
|
|
187
197
|
interface PublishPageRequest {
|
|
188
198
|
version: number;
|
|
189
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Shopify Storefront API configuration (read-only, public access)
|
|
202
|
+
*/
|
|
203
|
+
interface StorefrontConfig {
|
|
204
|
+
shopDomain: string;
|
|
205
|
+
storefrontAccessToken: string;
|
|
206
|
+
apiVersion: string;
|
|
207
|
+
/** Optional proxy URL for SSR (avoids CORS) */
|
|
208
|
+
proxyUrl?: string;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Injection token for Storefront API configuration.
|
|
212
|
+
* Used by the public-storefront to read metafields via the Storefront API.
|
|
213
|
+
*/
|
|
214
|
+
declare const STOREFRONT_CONFIG: InjectionToken<StorefrontConfig>;
|
|
215
|
+
/**
|
|
216
|
+
* Injection token for the client storefront URL.
|
|
217
|
+
* The editor uses this to:
|
|
218
|
+
* 1. Fetch the component manifest (`{url}/kustomizer/manifest.json`)
|
|
219
|
+
* 2. Embed the live preview iframe (`{url}/kustomizer/editor`)
|
|
220
|
+
*/
|
|
221
|
+
declare const STOREFRONT_URL: InjectionToken<string>;
|
|
190
222
|
|
|
191
223
|
/**
|
|
192
224
|
* Abstract strategy for loading pages into the editor
|
|
@@ -784,9 +816,11 @@ interface ComponentDefinition<TProps extends Record<string, unknown> = Record<st
|
|
|
784
816
|
*/
|
|
785
817
|
icon?: string;
|
|
786
818
|
/**
|
|
787
|
-
* Angular component class to render
|
|
819
|
+
* Angular component class to render.
|
|
820
|
+
* Optional for manifest-loaded definitions where the component is rendered
|
|
821
|
+
* in a remote iframe and the editor only needs metadata.
|
|
788
822
|
*/
|
|
789
|
-
component
|
|
823
|
+
component?: Type<unknown>;
|
|
790
824
|
/**
|
|
791
825
|
* Schema of editable properties
|
|
792
826
|
*/
|
|
@@ -1343,7 +1377,6 @@ interface BlockPickerTarget {
|
|
|
1343
1377
|
declare class BlockTreeItemComponent {
|
|
1344
1378
|
readonly facade: VisualEditorFacade;
|
|
1345
1379
|
private readonly dndService;
|
|
1346
|
-
private readonly sanitizer;
|
|
1347
1380
|
private readonly treeBlock;
|
|
1348
1381
|
readonly block: _angular_core.InputSignal<EditorElement>;
|
|
1349
1382
|
readonly context: _angular_core.InputSignal<BlockTreeContext>;
|
|
@@ -1375,7 +1408,7 @@ declare class BlockTreeItemComponent {
|
|
|
1375
1408
|
readonly blockSlots: _angular_core.Signal<SlotDefinition[]>;
|
|
1376
1409
|
readonly children: _angular_core.Signal<EditorElement[]>;
|
|
1377
1410
|
readonly childContext: _angular_core.Signal<BlockTreeContext>;
|
|
1378
|
-
readonly blockIcon: _angular_core.Signal<
|
|
1411
|
+
readonly blockIcon: _angular_core.Signal<string>;
|
|
1379
1412
|
readonly blockName: _angular_core.Signal<string>;
|
|
1380
1413
|
readonly duplicable: _angular_core.Signal<boolean>;
|
|
1381
1414
|
readonly canAddMore: _angular_core.Signal<boolean>;
|
|
@@ -1414,6 +1447,8 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
|
|
|
1414
1447
|
private readonly loadingStrategy;
|
|
1415
1448
|
private readonly config;
|
|
1416
1449
|
private readonly dndService;
|
|
1450
|
+
private readonly iframeBridge;
|
|
1451
|
+
private readonly storefrontUrl;
|
|
1417
1452
|
private readonly sanitizer;
|
|
1418
1453
|
private readonly destroy$;
|
|
1419
1454
|
readonly showBackButton: _angular_core.Signal<boolean>;
|
|
@@ -1424,6 +1459,9 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
|
|
|
1424
1459
|
isEditor: boolean;
|
|
1425
1460
|
}>;
|
|
1426
1461
|
private readonly canvasEl;
|
|
1462
|
+
private readonly previewFrame;
|
|
1463
|
+
readonly previewUrl: _angular_core.Signal<SafeResourceUrl | null>;
|
|
1464
|
+
private iframeReady;
|
|
1427
1465
|
readonly propertiesTab: _angular_core.WritableSignal<"props" | "blocks">;
|
|
1428
1466
|
readonly expandedGroups: _angular_core.WritableSignal<Set<string>>;
|
|
1429
1467
|
readonly expandedSections: _angular_core.WritableSignal<Set<string>>;
|
|
@@ -1465,19 +1503,18 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
|
|
|
1465
1503
|
startEditingName(): void;
|
|
1466
1504
|
saveEditingName(event: Event): void;
|
|
1467
1505
|
cancelEditingName(): void;
|
|
1506
|
+
constructor();
|
|
1468
1507
|
ngOnInit(): void;
|
|
1469
1508
|
ngOnDestroy(): void;
|
|
1509
|
+
onIframeLoad(): void;
|
|
1470
1510
|
goBack(): void;
|
|
1471
1511
|
savePage(): void;
|
|
1472
1512
|
publishPage(): void;
|
|
1473
1513
|
unpublishPage(): void;
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
getBlockIcon(def: ComponentDefinition): SafeHtml;
|
|
1479
|
-
getBlockIconByType(type: string): SafeHtml;
|
|
1480
|
-
getSectionIcon(type: string): SafeHtml;
|
|
1514
|
+
getIcon(def: ComponentDefinition): string;
|
|
1515
|
+
getBlockIcon(def: ComponentDefinition): string;
|
|
1516
|
+
getBlockIconByType(type: string): string;
|
|
1517
|
+
getSectionIcon(type: string): string;
|
|
1481
1518
|
isSectionExpanded(sectionId: string): boolean;
|
|
1482
1519
|
isAllBlocksExpanded(sectionId: string): boolean;
|
|
1483
1520
|
toggleSectionExpand(sectionId: string, event: Event): void;
|
|
@@ -1540,8 +1577,8 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
|
|
|
1540
1577
|
addSectionFromPreset(rp: ResolvedPreset): void;
|
|
1541
1578
|
addBlockToSectionFromPreset(section: EditorSection, rp: ResolvedPreset): void;
|
|
1542
1579
|
addNestedBlockFromPreset(rp: ResolvedPreset): void;
|
|
1543
|
-
getSectionPresetIcon(rp: ResolvedPreset):
|
|
1544
|
-
getBlockPresetIcon(rp: ResolvedPreset):
|
|
1580
|
+
getSectionPresetIcon(rp: ResolvedPreset): string;
|
|
1581
|
+
getBlockPresetIcon(rp: ResolvedPreset): string;
|
|
1545
1582
|
selectSection(section: EditorSection, event: Event): void;
|
|
1546
1583
|
selectBlock(block: EditorElement): void;
|
|
1547
1584
|
deleteSection(sectionId: string, event: Event): void;
|
|
@@ -1658,6 +1695,7 @@ declare class PageManagerComponent implements OnInit {
|
|
|
1658
1695
|
readonly isDeleting: _angular_core.WritableSignal<boolean>;
|
|
1659
1696
|
ngOnInit(): void;
|
|
1660
1697
|
loadPages(): void;
|
|
1698
|
+
openSetup(): void;
|
|
1661
1699
|
openCreateDialog(): void;
|
|
1662
1700
|
closeCreateDialog(): void;
|
|
1663
1701
|
onTitleInput(event: Event): void;
|
|
@@ -1673,345 +1711,63 @@ declare class PageManagerComponent implements OnInit {
|
|
|
1673
1711
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageManagerComponent, "lib-page-manager", never, {}, {}, never, never, true, never>;
|
|
1674
1712
|
}
|
|
1675
1713
|
|
|
1676
|
-
/**
|
|
1677
|
-
* Token para inyectar el dominio de la tienda.
|
|
1678
|
-
* Debe ser configurado por la aplicación que instala el editor.
|
|
1679
|
-
*
|
|
1680
|
-
* Ejemplo de uso:
|
|
1681
|
-
* ```typescript
|
|
1682
|
-
* providers: [
|
|
1683
|
-
* { provide: STORE_DOMAIN, useValue: 'nike.com' }
|
|
1684
|
-
* ]
|
|
1685
|
-
* ```
|
|
1686
|
-
*
|
|
1687
|
-
* Si no se provee, el servicio intentará detectar el dominio desde window.location.hostname
|
|
1688
|
-
*/
|
|
1689
|
-
declare const STORE_DOMAIN: InjectionToken<string>;
|
|
1690
|
-
interface Shop {
|
|
1691
|
-
id: string;
|
|
1692
|
-
name: string;
|
|
1693
|
-
shopify_domain: string;
|
|
1694
|
-
}
|
|
1695
|
-
interface ShopUser {
|
|
1696
|
-
email: string;
|
|
1697
|
-
role: 'owner' | 'admin' | 'reader';
|
|
1698
|
-
}
|
|
1699
|
-
interface ShopLicense {
|
|
1700
|
-
tier: 'starter' | 'growth' | 'enterprise';
|
|
1701
|
-
expires_at: string | null;
|
|
1702
|
-
active: boolean;
|
|
1703
|
-
}
|
|
1704
|
-
interface ShopAuthData {
|
|
1705
|
-
shop: Shop | null;
|
|
1706
|
-
user: ShopUser | null;
|
|
1707
|
-
license: ShopLicense | null;
|
|
1708
|
-
}
|
|
1709
|
-
interface ShopAuthError {
|
|
1710
|
-
code: string;
|
|
1711
|
-
message: string;
|
|
1712
|
-
}
|
|
1713
|
-
declare class ShopAuthService {
|
|
1714
|
-
private http;
|
|
1715
|
-
private config;
|
|
1716
|
-
private authService;
|
|
1717
|
-
private storeDomainConfig;
|
|
1718
|
-
private _shop;
|
|
1719
|
-
private _user;
|
|
1720
|
-
private _license;
|
|
1721
|
-
private _loading;
|
|
1722
|
-
private _error;
|
|
1723
|
-
private _initialized;
|
|
1724
|
-
readonly shop: _angular_core.Signal<Shop | null>;
|
|
1725
|
-
readonly user: _angular_core.Signal<ShopUser | null>;
|
|
1726
|
-
readonly license: _angular_core.Signal<ShopLicense | null>;
|
|
1727
|
-
readonly loading: _angular_core.Signal<boolean>;
|
|
1728
|
-
readonly error: _angular_core.Signal<ShopAuthError | null>;
|
|
1729
|
-
readonly initialized: _angular_core.Signal<boolean>;
|
|
1730
|
-
readonly shopId: _angular_core.Signal<string | null>;
|
|
1731
|
-
readonly shopName: _angular_core.Signal<string | null>;
|
|
1732
|
-
readonly shopifyDomain: _angular_core.Signal<string | null>;
|
|
1733
|
-
readonly userEmail: _angular_core.Signal<string | null>;
|
|
1734
|
-
readonly userRole: _angular_core.Signal<"owner" | "admin" | "reader" | null>;
|
|
1735
|
-
readonly isOwner: _angular_core.Signal<boolean>;
|
|
1736
|
-
readonly isAdmin: _angular_core.Signal<boolean>;
|
|
1737
|
-
readonly canEdit: _angular_core.Signal<boolean>;
|
|
1738
|
-
readonly licenseTier: _angular_core.Signal<"starter" | "growth" | "enterprise" | null>;
|
|
1739
|
-
readonly licenseActive: _angular_core.Signal<boolean>;
|
|
1740
|
-
readonly licenseExpiresAt: _angular_core.Signal<string | null>;
|
|
1741
|
-
readonly hasAccess: _angular_core.Signal<boolean>;
|
|
1742
|
-
readonly daysRemaining: _angular_core.Signal<number | null>;
|
|
1743
|
-
readonly isLicenseExpiringSoon: _angular_core.Signal<boolean>;
|
|
1744
|
-
/**
|
|
1745
|
-
* Obtiene el dominio actual.
|
|
1746
|
-
* Prioridad:
|
|
1747
|
-
* 1. STORE_DOMAIN token (inyectado)
|
|
1748
|
-
* 2. Query param ?shop= (solo en localhost)
|
|
1749
|
-
* 3. window.location.hostname
|
|
1750
|
-
*/
|
|
1751
|
-
getCurrentDomain(): string;
|
|
1752
|
-
/**
|
|
1753
|
-
* Autentica al usuario para el dominio actual.
|
|
1754
|
-
* Esta es la función principal que debe llamarse al cargar la app.
|
|
1755
|
-
*/
|
|
1756
|
-
authenticate(): Promise<ShopAuthData>;
|
|
1757
|
-
/**
|
|
1758
|
-
* Limpia el estado (para logout)
|
|
1759
|
-
*/
|
|
1760
|
-
clear(): void;
|
|
1761
|
-
/**
|
|
1762
|
-
* Refresca la autenticación
|
|
1763
|
-
*/
|
|
1764
|
-
refresh(): Promise<ShopAuthData>;
|
|
1765
|
-
/**
|
|
1766
|
-
* Verifica si el error actual indica que el usuario no tiene acceso
|
|
1767
|
-
*/
|
|
1768
|
-
isNoAccessError(): boolean;
|
|
1769
|
-
/**
|
|
1770
|
-
* Verifica si el error actual indica que la licencia expiró
|
|
1771
|
-
*/
|
|
1772
|
-
isLicenseExpiredError(): boolean;
|
|
1773
|
-
/**
|
|
1774
|
-
* Verifica si el usuario está inactivo
|
|
1775
|
-
*/
|
|
1776
|
-
isUserInactiveError(): boolean;
|
|
1777
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopAuthService, never>;
|
|
1778
|
-
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopAuthService>;
|
|
1779
|
-
}
|
|
1780
|
-
|
|
1781
|
-
declare class LicenseGuardComponent {
|
|
1782
|
-
shopAuthService: ShopAuthService;
|
|
1783
|
-
showExpirationWarning: _angular_core.InputSignal<boolean>;
|
|
1784
|
-
subscribe: _angular_core.OutputEmitterRef<void>;
|
|
1785
|
-
renew: _angular_core.OutputEmitterRef<void>;
|
|
1786
|
-
reauth: _angular_core.OutputEmitterRef<void>;
|
|
1787
|
-
retry: _angular_core.OutputEmitterRef<void>;
|
|
1788
|
-
onSubscribe(): void;
|
|
1789
|
-
onRenew(): void;
|
|
1790
|
-
onReauth(): void;
|
|
1791
|
-
onRetry(): void;
|
|
1792
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LicenseGuardComponent, never>;
|
|
1793
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LicenseGuardComponent, "lib-license-guard", never, { "showExpirationWarning": { "alias": "showExpirationWarning"; "required": false; "isSignal": true; }; }, { "subscribe": "subscribe"; "renew": "renew"; "reauth": "reauth"; "retry": "retry"; }, never, ["*"], true, never>;
|
|
1794
|
-
}
|
|
1795
|
-
|
|
1796
|
-
declare class LoginComponent {
|
|
1797
|
-
private authService;
|
|
1798
|
-
private router;
|
|
1799
|
-
loginSuccess: _angular_core.OutputEmitterRef<void>;
|
|
1800
|
-
email: _angular_core.WritableSignal<string>;
|
|
1801
|
-
password: _angular_core.WritableSignal<string>;
|
|
1802
|
-
error: _angular_core.WritableSignal<string | null>;
|
|
1803
|
-
loading: _angular_core.WritableSignal<boolean>;
|
|
1804
|
-
isSignUp: _angular_core.WritableSignal<boolean>;
|
|
1805
|
-
showPassword: _angular_core.WritableSignal<boolean>;
|
|
1806
|
-
toggleMode(): void;
|
|
1807
|
-
togglePassword(): void;
|
|
1808
|
-
onSubmit(): Promise<void>;
|
|
1809
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LoginComponent, never>;
|
|
1810
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoginComponent, "lib-login", never, {}, { "loginSuccess": "loginSuccess"; }, never, never, true, never>;
|
|
1811
|
-
}
|
|
1812
|
-
|
|
1813
|
-
type ViewState = 'loading' | 'no-store' | 'license-expired';
|
|
1814
|
-
declare class ActivateLicenseComponent implements OnInit {
|
|
1815
|
-
shopAuthService: ShopAuthService;
|
|
1816
|
-
viewState: _angular_core.Signal<ViewState>;
|
|
1817
|
-
ngOnInit(): void;
|
|
1818
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ActivateLicenseComponent, never>;
|
|
1819
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ActivateLicenseComponent, "lib-activate-license", never, {}, {}, never, never, true, never>;
|
|
1820
|
-
}
|
|
1821
|
-
|
|
1822
|
-
interface SupabaseConfig {
|
|
1823
|
-
supabaseUrl: string;
|
|
1824
|
-
supabaseAnonKey: string;
|
|
1825
|
-
}
|
|
1826
|
-
declare const SUPABASE_CONFIG: InjectionToken<SupabaseConfig>;
|
|
1827
|
-
declare class SupabaseAuthService implements OnDestroy {
|
|
1828
|
-
private config;
|
|
1829
|
-
private supabase;
|
|
1830
|
-
private supabasePromise;
|
|
1831
|
-
private authSubscription;
|
|
1832
|
-
private _session;
|
|
1833
|
-
private _user;
|
|
1834
|
-
private _loading;
|
|
1835
|
-
private _error;
|
|
1836
|
-
private _initialized;
|
|
1837
|
-
readonly session: _angular_core.Signal<Session | null>;
|
|
1838
|
-
readonly user: _angular_core.Signal<User | null>;
|
|
1839
|
-
readonly loading: _angular_core.Signal<boolean>;
|
|
1840
|
-
readonly error: _angular_core.Signal<string | null>;
|
|
1841
|
-
readonly initialized: _angular_core.Signal<boolean>;
|
|
1842
|
-
readonly isAuthenticated: _angular_core.Signal<boolean>;
|
|
1843
|
-
readonly accessToken: _angular_core.Signal<string | null>;
|
|
1844
|
-
readonly userEmail: _angular_core.Signal<string | null>;
|
|
1845
|
-
private getSupabaseClient;
|
|
1846
|
-
private initializeClient;
|
|
1847
|
-
ensureInitialized(): Promise<void>;
|
|
1848
|
-
signInWithPassword(email: string, password: string): Promise<{
|
|
1849
|
-
success: boolean;
|
|
1850
|
-
error?: string;
|
|
1851
|
-
}>;
|
|
1852
|
-
signUp(email: string, password: string): Promise<{
|
|
1853
|
-
success: boolean;
|
|
1854
|
-
error?: string;
|
|
1855
|
-
}>;
|
|
1856
|
-
signOut(): Promise<void>;
|
|
1857
|
-
resetPassword(email: string): Promise<{
|
|
1858
|
-
success: boolean;
|
|
1859
|
-
error?: string;
|
|
1860
|
-
}>;
|
|
1861
|
-
getClient(): Promise<SupabaseClient | null>;
|
|
1862
|
-
ngOnDestroy(): void;
|
|
1863
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SupabaseAuthService, never>;
|
|
1864
|
-
static ɵprov: _angular_core.ɵɵInjectableDeclaration<SupabaseAuthService>;
|
|
1865
|
-
}
|
|
1866
|
-
|
|
1867
|
-
declare class AppShellComponent {
|
|
1868
|
-
authService: SupabaseAuthService;
|
|
1869
|
-
shopAuthService: ShopAuthService;
|
|
1870
|
-
loggedOut: _angular_core.OutputEmitterRef<void>;
|
|
1871
|
-
logout(): Promise<void>;
|
|
1872
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppShellComponent, never>;
|
|
1873
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppShellComponent, "lib-app-shell", never, {}, { "loggedOut": "loggedOut"; }, never, ["*"], true, never>;
|
|
1874
|
-
}
|
|
1875
|
-
|
|
1876
|
-
declare class NoAccessComponent {
|
|
1877
|
-
backToLogin: _angular_core.OutputEmitterRef<void>;
|
|
1878
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NoAccessComponent, never>;
|
|
1879
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NoAccessComponent, "ke-no-access", never, {}, { "backToLogin": "backToLogin"; }, never, never, true, never>;
|
|
1880
|
-
}
|
|
1881
|
-
|
|
1882
|
-
declare class LicenseExpiredComponent {
|
|
1883
|
-
backToLogin: _angular_core.OutputEmitterRef<void>;
|
|
1884
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LicenseExpiredComponent, never>;
|
|
1885
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LicenseExpiredComponent, "ke-license-expired", never, {}, { "backToLogin": "backToLogin"; }, never, never, true, never>;
|
|
1886
|
-
}
|
|
1887
|
-
|
|
1888
1714
|
/**
|
|
1889
1715
|
* Injection token to enable in-memory page storage (for development)
|
|
1890
1716
|
* When false (default), uses Shopify metafields via GraphQL API
|
|
1891
1717
|
*/
|
|
1892
1718
|
declare const USE_IN_MEMORY_PAGES: InjectionToken<boolean>;
|
|
1893
|
-
/**
|
|
1894
|
-
* Injection token for page environment (metafield key prefix).
|
|
1895
|
-
* Default is 'production'.
|
|
1896
|
-
*/
|
|
1897
|
-
declare const PAGE_ENVIRONMENT: InjectionToken<string>;
|
|
1898
1719
|
declare class PageService {
|
|
1899
1720
|
private readonly useInMemory;
|
|
1900
|
-
private readonly pageEnvironment;
|
|
1901
1721
|
private readonly memoryRepo;
|
|
1902
1722
|
private readonly shopifyRepo;
|
|
1903
|
-
private resolveEnvironment;
|
|
1904
1723
|
/**
|
|
1905
1724
|
* Get all pages (summaries only for listing)
|
|
1906
1725
|
*/
|
|
1907
|
-
getPages(
|
|
1726
|
+
getPages(): Observable<PageSummary[]>;
|
|
1908
1727
|
/**
|
|
1909
1728
|
* Get a single page by ID (full content)
|
|
1910
1729
|
*/
|
|
1911
|
-
getPage(id: string
|
|
1730
|
+
getPage(id: string): Observable<Page>;
|
|
1912
1731
|
/**
|
|
1913
1732
|
* Get a published page by slug (for public rendering)
|
|
1914
1733
|
*/
|
|
1915
|
-
getPublishedPageBySlug(slug: string
|
|
1734
|
+
getPublishedPageBySlug(slug: string): Observable<Page>;
|
|
1916
1735
|
/**
|
|
1917
1736
|
* Create a new page
|
|
1918
1737
|
*/
|
|
1919
|
-
createPage(request: CreatePageRequest
|
|
1738
|
+
createPage(request: CreatePageRequest): Observable<Page>;
|
|
1920
1739
|
/**
|
|
1921
1740
|
* Update an existing page
|
|
1922
1741
|
*/
|
|
1923
|
-
updatePage(id: string, request: UpdatePageRequest
|
|
1742
|
+
updatePage(id: string, request: UpdatePageRequest): Observable<Page>;
|
|
1924
1743
|
/**
|
|
1925
1744
|
* Delete a page
|
|
1926
1745
|
*/
|
|
1927
|
-
deletePage(id: string
|
|
1746
|
+
deletePage(id: string): Observable<void>;
|
|
1928
1747
|
/**
|
|
1929
1748
|
* Publish a page (changes status to 'published')
|
|
1930
1749
|
*/
|
|
1931
|
-
publishPage(id: string, request: PublishPageRequest
|
|
1750
|
+
publishPage(id: string, request: PublishPageRequest): Observable<Page>;
|
|
1932
1751
|
/**
|
|
1933
1752
|
* Unpublish a page (changes status to 'draft')
|
|
1934
1753
|
*/
|
|
1935
|
-
unpublishPage(id: string, request: PublishPageRequest
|
|
1754
|
+
unpublishPage(id: string, request: PublishPageRequest): Observable<Page>;
|
|
1936
1755
|
/**
|
|
1937
1756
|
* Duplicate an existing page
|
|
1938
1757
|
*/
|
|
1939
|
-
duplicatePage(id: string
|
|
1940
|
-
/**
|
|
1941
|
-
* Delete all pages for a given environment
|
|
1942
|
-
*/
|
|
1943
|
-
deletePagesByEnvironment(environment?: string): Observable<void>;
|
|
1758
|
+
duplicatePage(id: string): Observable<Page>;
|
|
1944
1759
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageService, never>;
|
|
1945
1760
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageService>;
|
|
1946
1761
|
}
|
|
1947
1762
|
|
|
1948
|
-
interface ShopifyAppConfig {
|
|
1949
|
-
appUrl: string;
|
|
1950
|
-
}
|
|
1951
|
-
interface ShopifyTokenResponse {
|
|
1952
|
-
accessToken: string;
|
|
1953
|
-
shopifyDomain: string;
|
|
1954
|
-
}
|
|
1955
|
-
type TokenErrorCode = 'NOT_AUTHENTICATED' | 'NO_ACTIVE_STORE' | 'TOKEN_FETCH_FAILED' | 'SESSION_EXPIRED' | 'NO_STORE_ACCESS' | 'NETWORK_ERROR' | 'UNKNOWN_ERROR';
|
|
1956
|
-
interface TokenError {
|
|
1957
|
-
code: TokenErrorCode;
|
|
1958
|
-
message: string;
|
|
1959
|
-
status?: number;
|
|
1960
|
-
}
|
|
1961
|
-
declare const SHOPIFY_APP_CONFIG: InjectionToken<ShopifyAppConfig>;
|
|
1962
|
-
declare class ShopifyTokenService {
|
|
1963
|
-
private readonly http;
|
|
1964
|
-
private readonly config;
|
|
1965
|
-
private readonly authService;
|
|
1966
|
-
private readonly shopAuthService;
|
|
1967
|
-
private readonly CACHE_TTL_MS;
|
|
1968
|
-
private readonly tokenCache;
|
|
1969
|
-
private readonly _currentToken;
|
|
1970
|
-
private readonly _currentDomain;
|
|
1971
|
-
private readonly _loading;
|
|
1972
|
-
private readonly _error;
|
|
1973
|
-
private pendingRequest;
|
|
1974
|
-
readonly currentToken: _angular_core.Signal<string | null>;
|
|
1975
|
-
readonly currentDomain: _angular_core.Signal<string | null>;
|
|
1976
|
-
readonly loading: _angular_core.Signal<boolean>;
|
|
1977
|
-
readonly error: _angular_core.Signal<TokenError | null>;
|
|
1978
|
-
readonly hasToken: _angular_core.Signal<boolean>;
|
|
1979
|
-
readonly isReady: _angular_core.Signal<boolean>;
|
|
1980
|
-
getToken(): Observable<ShopifyTokenResponse>;
|
|
1981
|
-
getTokenForDomain(shopifyDomain: string): Observable<ShopifyTokenResponse>;
|
|
1982
|
-
refreshToken(): Observable<ShopifyTokenResponse>;
|
|
1983
|
-
invalidateCache(shopifyDomain?: string): void;
|
|
1984
|
-
clear(): void;
|
|
1985
|
-
private fetchToken;
|
|
1986
|
-
private getCachedToken;
|
|
1987
|
-
private setCachedToken;
|
|
1988
|
-
private handleHttpError;
|
|
1989
|
-
private createError;
|
|
1990
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopifyTokenService, never>;
|
|
1991
|
-
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopifyTokenService>;
|
|
1992
|
-
}
|
|
1993
|
-
|
|
1994
|
-
type GraphQLErrorCode = 'GRAPHQL_ERROR' | 'EMPTY_RESPONSE' | 'UNAUTHORIZED' | 'FORBIDDEN' | 'RATE_LIMIT' | 'SERVER_ERROR' | 'NETWORK_ERROR' | 'HTTP_ERROR' | 'TOKEN_ERROR' | 'UNKNOWN_ERROR';
|
|
1995
|
-
interface GraphQLError {
|
|
1996
|
-
code: GraphQLErrorCode;
|
|
1997
|
-
message: string;
|
|
1998
|
-
status?: number;
|
|
1999
|
-
errors?: Array<{
|
|
2000
|
-
message: string;
|
|
2001
|
-
}>;
|
|
2002
|
-
original?: unknown;
|
|
2003
|
-
}
|
|
2004
1763
|
declare class ShopifyGraphQLClient {
|
|
2005
1764
|
private readonly http;
|
|
2006
|
-
private readonly authService;
|
|
2007
|
-
private readonly shopAuthService;
|
|
2008
1765
|
private readonly config;
|
|
2009
|
-
query<T>(query: string, variables?: Record<string,
|
|
2010
|
-
mutate<T>(mutation: string, variables?: Record<string,
|
|
1766
|
+
query<T>(query: string, variables?: Record<string, any>): Observable<T>;
|
|
1767
|
+
mutate<T>(mutation: string, variables?: Record<string, any>): Observable<T>;
|
|
2011
1768
|
private executeOperation;
|
|
2012
1769
|
private handleResponse;
|
|
2013
|
-
private
|
|
2014
|
-
private createError;
|
|
1770
|
+
private handleError;
|
|
2015
1771
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopifyGraphQLClient, never>;
|
|
2016
1772
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopifyGraphQLClient>;
|
|
2017
1773
|
}
|
|
@@ -2022,22 +1778,34 @@ declare const MAX_METAFIELD_SIZE: number;
|
|
|
2022
1778
|
declare const GET_SHOP_METAFIELD_QUERY = "\n query GetShopMetafield($namespace: String!, $key: String!) {\n shop {\n id\n metafield(namespace: $namespace, key: $key) {\n id\n value\n createdAt\n updatedAt\n }\n }\n }\n";
|
|
2023
1779
|
declare const SET_METAFIELD_MUTATION = "\n mutation SetMetafield($metafields: [MetafieldsSetInput!]!) {\n metafieldsSet(metafields: $metafields) {\n metafields {\n id\n namespace\n key\n value\n }\n userErrors {\n field\n message\n }\n }\n }\n";
|
|
2024
1780
|
declare const DELETE_METAFIELDS_MUTATION = "\n mutation DeleteMetafields($metafields: [MetafieldIdentifierInput!]!) {\n metafieldsDelete(metafields: $metafields) {\n deletedMetafields {\n key\n namespace\n }\n userErrors {\n field\n message\n }\n }\n }\n";
|
|
1781
|
+
declare const CREATE_METAFIELD_DEFINITION_MUTATION = "\n mutation CreateMetafieldDefinition($definition: MetafieldDefinitionInput!) {\n metafieldDefinitionCreate(definition: $definition) {\n createdDefinition {\n id\n }\n userErrors {\n field\n message\n code\n }\n }\n }\n";
|
|
1782
|
+
declare const DELETE_METAFIELD_DEFINITION_MUTATION = "\n mutation DeleteMetafieldDefinition($id: ID!) {\n metafieldDefinitionDelete(id: $id) {\n deletedDefinitionId\n userErrors {\n field\n message\n code\n }\n }\n }\n";
|
|
1783
|
+
declare const GET_METAFIELD_DEFINITION_QUERY = "\n query GetMetafieldDefinition($ownerType: MetafieldOwnerType!, $namespace: String, $key: String!) {\n metafieldDefinition(identifier: { ownerType: $ownerType, namespace: $namespace, key: $key }) {\n id\n }\n }\n";
|
|
2025
1784
|
declare const GET_SHOP_ID_QUERY = "\n query GetShopId {\n shop {\n id\n }\n }\n";
|
|
2026
1785
|
declare class ShopifyMetafieldRepository {
|
|
2027
1786
|
private readonly client;
|
|
2028
|
-
private resolveEnvironment;
|
|
2029
|
-
private buildIndexKey;
|
|
2030
|
-
private buildPageKey;
|
|
2031
1787
|
getMetafield(namespace: string, key: string): Observable<Metafield | null>;
|
|
2032
1788
|
setMetafield(namespace: string, key: string, value: any, ownerId: string): Observable<Metafield>;
|
|
2033
1789
|
deleteMetafield(namespace: string, key: string): Observable<void>;
|
|
2034
1790
|
getShopId(): Observable<string>;
|
|
2035
|
-
getPageIndex(
|
|
2036
|
-
updatePageIndex(index: PagesIndex
|
|
2037
|
-
getPageMetafield(pageId: string
|
|
2038
|
-
setPageMetafield(pageId: string, page: Page
|
|
2039
|
-
deletePageMetafield(pageId: string
|
|
2040
|
-
|
|
1791
|
+
getPageIndex(): Observable<PagesIndex>;
|
|
1792
|
+
updatePageIndex(index: PagesIndex): Observable<PagesIndex>;
|
|
1793
|
+
getPageMetafield(pageId: string): Observable<Page | null>;
|
|
1794
|
+
setPageMetafield(pageId: string, page: Page): Observable<Page>;
|
|
1795
|
+
deletePageMetafield(pageId: string): Observable<void>;
|
|
1796
|
+
/**
|
|
1797
|
+
* Create a MetafieldDefinition with PUBLIC_READ storefront access.
|
|
1798
|
+
* Idempotent: if definition already exists, returns the existing ID.
|
|
1799
|
+
*/
|
|
1800
|
+
createMetafieldDefinition(namespace: string, key: string, name: string): Observable<string>;
|
|
1801
|
+
/**
|
|
1802
|
+
* Delete a MetafieldDefinition by ID. Does not delete associated metafields.
|
|
1803
|
+
*/
|
|
1804
|
+
deleteMetafieldDefinition(definitionId: string): Observable<void>;
|
|
1805
|
+
/**
|
|
1806
|
+
* Look up a MetafieldDefinition ID by namespace and key.
|
|
1807
|
+
*/
|
|
1808
|
+
getMetafieldDefinitionId(namespace: string, key: string): Observable<string>;
|
|
2041
1809
|
validateSize(data: any): {
|
|
2042
1810
|
valid: boolean;
|
|
2043
1811
|
size: number;
|
|
@@ -2050,17 +1818,23 @@ declare class ShopifyMetafieldRepository {
|
|
|
2050
1818
|
|
|
2051
1819
|
declare class PageShopifyRepository {
|
|
2052
1820
|
private readonly metafieldRepo;
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
1821
|
+
getPages(): Observable<PageSummary[]>;
|
|
1822
|
+
getPage(id: string): Observable<Page>;
|
|
1823
|
+
getPublishedPageBySlug(slug: string): Observable<Page>;
|
|
1824
|
+
createPage(request: CreatePageRequest): Observable<Page>;
|
|
1825
|
+
updatePage(id: string, request: UpdatePageRequest): Observable<Page>;
|
|
1826
|
+
deletePage(id: string): Observable<void>;
|
|
1827
|
+
publishPage(id: string, request: PublishPageRequest): Observable<Page>;
|
|
1828
|
+
unpublishPage(id: string, request: PublishPageRequest): Observable<Page>;
|
|
1829
|
+
duplicatePage(id: string): Observable<Page>;
|
|
1830
|
+
/**
|
|
1831
|
+
* Backfill MetafieldDefinitions for existing pages that don't have one.
|
|
1832
|
+
* Creates definitions with PUBLIC_READ storefront access.
|
|
1833
|
+
*/
|
|
1834
|
+
ensureDefinitionsExist(): Observable<{
|
|
1835
|
+
created: number;
|
|
1836
|
+
skipped: number;
|
|
1837
|
+
}>;
|
|
2064
1838
|
private validateUniqueSlug;
|
|
2065
1839
|
private generateUniqueSlug;
|
|
2066
1840
|
private addPageToIndex;
|
|
@@ -2071,135 +1845,174 @@ declare class PageShopifyRepository {
|
|
|
2071
1845
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageShopifyRepository>;
|
|
2072
1846
|
}
|
|
2073
1847
|
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
invited_by: string;
|
|
2087
|
-
created_at: string;
|
|
2088
|
-
expires_at: string;
|
|
2089
|
-
is_expired: boolean;
|
|
2090
|
-
}
|
|
2091
|
-
interface CurrentUser {
|
|
2092
|
-
email: string;
|
|
2093
|
-
role: string;
|
|
2094
|
-
can_invite: boolean;
|
|
2095
|
-
can_remove_members: boolean;
|
|
2096
|
-
}
|
|
2097
|
-
interface TeamData {
|
|
2098
|
-
shop: {
|
|
2099
|
-
id: string;
|
|
2100
|
-
name: string;
|
|
2101
|
-
shopify_domain: string;
|
|
2102
|
-
allowed_domains: string[];
|
|
2103
|
-
};
|
|
2104
|
-
members: TeamMember[];
|
|
2105
|
-
invitations: PendingInvitation[];
|
|
2106
|
-
current_user: CurrentUser;
|
|
2107
|
-
summary: {
|
|
2108
|
-
total_members: number;
|
|
2109
|
-
pending_invitations: number;
|
|
2110
|
-
};
|
|
2111
|
-
}
|
|
2112
|
-
interface InviteResult {
|
|
2113
|
-
invitation_id: string;
|
|
2114
|
-
token: string;
|
|
2115
|
-
expires_at: string;
|
|
2116
|
-
email: string;
|
|
2117
|
-
role: string;
|
|
2118
|
-
}
|
|
2119
|
-
interface AcceptInvitationResult {
|
|
2120
|
-
success: boolean;
|
|
2121
|
-
shop: {
|
|
2122
|
-
id: string;
|
|
2123
|
-
name: string;
|
|
2124
|
-
shopify_domain: string;
|
|
2125
|
-
};
|
|
2126
|
-
role: string;
|
|
2127
|
-
message: string;
|
|
2128
|
-
}
|
|
2129
|
-
declare class ShopTeamService {
|
|
2130
|
-
private http;
|
|
2131
|
-
private config;
|
|
2132
|
-
private authService;
|
|
2133
|
-
private shopAuthService;
|
|
2134
|
-
private _team;
|
|
2135
|
-
private _loading;
|
|
2136
|
-
private _error;
|
|
2137
|
-
readonly team: _angular_core.Signal<TeamData | null>;
|
|
2138
|
-
readonly loading: _angular_core.Signal<boolean>;
|
|
2139
|
-
readonly error: _angular_core.Signal<string | null>;
|
|
2140
|
-
readonly members: _angular_core.Signal<TeamMember[]>;
|
|
2141
|
-
readonly invitations: _angular_core.Signal<PendingInvitation[]>;
|
|
2142
|
-
readonly currentUser: _angular_core.Signal<CurrentUser | null>;
|
|
2143
|
-
readonly activeMembers: _angular_core.Signal<TeamMember[]>;
|
|
2144
|
-
readonly pendingInvitations: _angular_core.Signal<PendingInvitation[]>;
|
|
2145
|
-
readonly canInvite: _angular_core.Signal<boolean>;
|
|
2146
|
-
/**
|
|
2147
|
-
* Carga el equipo de la shop actual
|
|
2148
|
-
*/
|
|
2149
|
-
loadTeam(): Promise<TeamData | null>;
|
|
2150
|
-
/**
|
|
2151
|
-
* Invita a un usuario a la shop
|
|
2152
|
-
*/
|
|
2153
|
-
inviteUser(email: string, role: 'admin' | 'reader', message?: string): Promise<InviteResult | null>;
|
|
2154
|
-
/**
|
|
2155
|
-
* Acepta una invitación (usado cuando un usuario hace click en el link de invitación)
|
|
2156
|
-
*/
|
|
2157
|
-
acceptInvitation(invitationToken: string): Promise<AcceptInvitationResult | null>;
|
|
2158
|
-
/**
|
|
2159
|
-
* Genera el URL de invitación (para copiar/compartir)
|
|
2160
|
-
*/
|
|
2161
|
-
getInvitationUrl(token: string, baseUrl?: string): string;
|
|
2162
|
-
/**
|
|
2163
|
-
* Limpia el estado
|
|
2164
|
-
*/
|
|
2165
|
-
clear(): void;
|
|
2166
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopTeamService, never>;
|
|
2167
|
-
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopTeamService>;
|
|
1848
|
+
/**
|
|
1849
|
+
* Read-only GraphQL client for the Shopify Storefront API.
|
|
1850
|
+
* Uses a Storefront Access Token (public, non-secret) instead of Admin API credentials.
|
|
1851
|
+
*/
|
|
1852
|
+
declare class StorefrontGraphQLClient {
|
|
1853
|
+
private readonly http;
|
|
1854
|
+
private readonly config;
|
|
1855
|
+
query<T>(query: string, variables?: Record<string, any>): Observable<T>;
|
|
1856
|
+
private handleResponse;
|
|
1857
|
+
private handleError;
|
|
1858
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StorefrontGraphQLClient, never>;
|
|
1859
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<StorefrontGraphQLClient>;
|
|
2168
1860
|
}
|
|
2169
1861
|
|
|
2170
|
-
|
|
2171
|
-
|
|
1862
|
+
/**
|
|
1863
|
+
* Read-only metafield repository using the Shopify Storefront API.
|
|
1864
|
+
* Only works for metafields with MetafieldDefinitions that have `access.storefront: PUBLIC_READ`.
|
|
1865
|
+
*/
|
|
1866
|
+
declare class StorefrontMetafieldRepository {
|
|
1867
|
+
private readonly client;
|
|
1868
|
+
getMetafield(namespace: string, key: string): Observable<{
|
|
1869
|
+
value: string;
|
|
1870
|
+
type: string;
|
|
1871
|
+
} | null>;
|
|
1872
|
+
getPageIndex(): Observable<PagesIndex>;
|
|
1873
|
+
getPageMetafield(pageId: string): Observable<Page | null>;
|
|
1874
|
+
private getDefaultIndex;
|
|
1875
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StorefrontMetafieldRepository, never>;
|
|
1876
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<StorefrontMetafieldRepository>;
|
|
1877
|
+
}
|
|
2172
1878
|
|
|
2173
|
-
|
|
2174
|
-
|
|
1879
|
+
/**
|
|
1880
|
+
* Read-only page repository using the Shopify Storefront API.
|
|
1881
|
+
* Used by the public-storefront to read published pages without Admin API access.
|
|
1882
|
+
*/
|
|
1883
|
+
declare class PageStorefrontRepository {
|
|
1884
|
+
private readonly metafieldRepo;
|
|
1885
|
+
getPages(): Observable<PageSummary[]>;
|
|
1886
|
+
getPublishedPages(): Observable<PageSummary[]>;
|
|
1887
|
+
getPage(id: string): Observable<Page>;
|
|
1888
|
+
getPublishedPageBySlug(slug: string): Observable<Page>;
|
|
1889
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageStorefrontRepository, never>;
|
|
1890
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageStorefrontRepository>;
|
|
1891
|
+
}
|
|
2175
1892
|
|
|
2176
1893
|
/**
|
|
2177
|
-
*
|
|
2178
|
-
*
|
|
2179
|
-
* 2. Usuario tiene acceso a la shop del dominio actual
|
|
2180
|
-
* 3. Licencia activa
|
|
2181
|
-
*
|
|
2182
|
-
* Redirige a:
|
|
2183
|
-
* - /login si no está autenticado
|
|
2184
|
-
* - /no-access si no tiene acceso a la shop
|
|
2185
|
-
* - /license-expired si la licencia expiró
|
|
1894
|
+
* A manifest describing all available components from a client's storefront.
|
|
1895
|
+
* Fetched at runtime by the editor via HTTP.
|
|
2186
1896
|
*/
|
|
2187
|
-
|
|
1897
|
+
interface ComponentManifest {
|
|
1898
|
+
version: string;
|
|
1899
|
+
components: ComponentManifestEntry[];
|
|
1900
|
+
}
|
|
2188
1901
|
/**
|
|
2189
|
-
*
|
|
2190
|
-
*
|
|
1902
|
+
* A single component entry in the manifest — same shape as ComponentDefinition
|
|
1903
|
+
* but without the Angular `component` class reference.
|
|
2191
1904
|
*/
|
|
2192
|
-
|
|
1905
|
+
interface ComponentManifestEntry {
|
|
1906
|
+
type: string;
|
|
1907
|
+
name: string;
|
|
1908
|
+
description?: string;
|
|
1909
|
+
category: ComponentCategory;
|
|
1910
|
+
icon?: string;
|
|
1911
|
+
isSection?: boolean;
|
|
1912
|
+
isBlock?: boolean;
|
|
1913
|
+
blockScope?: 'section' | 'theme';
|
|
1914
|
+
sectionTypes?: string[];
|
|
1915
|
+
draggable?: boolean;
|
|
1916
|
+
deletable?: boolean;
|
|
1917
|
+
duplicable?: boolean;
|
|
1918
|
+
tags?: string[];
|
|
1919
|
+
order?: number;
|
|
1920
|
+
slots?: SlotDefinition[];
|
|
1921
|
+
props: PropSchemaMap;
|
|
1922
|
+
}
|
|
1923
|
+
|
|
2193
1924
|
/**
|
|
2194
|
-
*
|
|
2195
|
-
*
|
|
1925
|
+
* Loads a component manifest from a remote storefront URL and registers
|
|
1926
|
+
* the entries in the ComponentRegistryService as "virtual" definitions
|
|
1927
|
+
* (no Angular component class — only metadata for palette and property panel).
|
|
2196
1928
|
*/
|
|
2197
|
-
declare
|
|
1929
|
+
declare class ManifestLoaderService {
|
|
1930
|
+
private readonly http;
|
|
1931
|
+
private readonly registry;
|
|
1932
|
+
/**
|
|
1933
|
+
* Fetch the manifest from the given URL and register all components.
|
|
1934
|
+
*/
|
|
1935
|
+
loadManifest(url: string): Observable<ComponentManifest>;
|
|
1936
|
+
/**
|
|
1937
|
+
* Register manifest entries in the ComponentRegistryService.
|
|
1938
|
+
* Each entry becomes a ComponentDefinition without a `component` field.
|
|
1939
|
+
*/
|
|
1940
|
+
registerManifestComponents(manifest: ComponentManifest): void;
|
|
1941
|
+
private manifestEntryToDefinition;
|
|
1942
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ManifestLoaderService, never>;
|
|
1943
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ManifestLoaderService>;
|
|
1944
|
+
}
|
|
1945
|
+
|
|
1946
|
+
/** Parent → Iframe */
|
|
1947
|
+
interface PageUpdateMessage {
|
|
1948
|
+
type: 'kustomizer:page-update';
|
|
1949
|
+
sections: EditorSection[];
|
|
1950
|
+
}
|
|
1951
|
+
interface SelectElementMessage {
|
|
1952
|
+
type: 'kustomizer:select-element';
|
|
1953
|
+
elementId: string;
|
|
1954
|
+
}
|
|
1955
|
+
interface DeselectMessage {
|
|
1956
|
+
type: 'kustomizer:deselect';
|
|
1957
|
+
}
|
|
1958
|
+
/** Iframe → Parent */
|
|
1959
|
+
interface ReadyMessage {
|
|
1960
|
+
type: 'kustomizer:ready';
|
|
1961
|
+
}
|
|
1962
|
+
interface ElementClickedMessage {
|
|
1963
|
+
type: 'kustomizer:element-clicked';
|
|
1964
|
+
elementId: string;
|
|
1965
|
+
sectionId: string;
|
|
1966
|
+
}
|
|
1967
|
+
interface ElementHoverMessage {
|
|
1968
|
+
type: 'kustomizer:element-hover';
|
|
1969
|
+
elementId: string | null;
|
|
1970
|
+
}
|
|
1971
|
+
interface ElementMovedMessage {
|
|
1972
|
+
type: 'kustomizer:element-moved';
|
|
1973
|
+
elementId: string;
|
|
1974
|
+
newIndex: number;
|
|
1975
|
+
targetSectionId?: string;
|
|
1976
|
+
}
|
|
2198
1977
|
/**
|
|
2199
|
-
*
|
|
2200
|
-
*
|
|
1978
|
+
* Manages postMessage communication between the editor (parent) and the
|
|
1979
|
+
* storefront preview (iframe).
|
|
2201
1980
|
*/
|
|
2202
|
-
declare
|
|
1981
|
+
declare class IframeBridgeService implements OnDestroy {
|
|
1982
|
+
private readonly zone;
|
|
1983
|
+
private iframe;
|
|
1984
|
+
private origin;
|
|
1985
|
+
private readonly messages$;
|
|
1986
|
+
private readonly messageHandler;
|
|
1987
|
+
constructor();
|
|
1988
|
+
ngOnDestroy(): void;
|
|
1989
|
+
/**
|
|
1990
|
+
* Connect to an iframe element. Must be called after the iframe loads.
|
|
1991
|
+
*/
|
|
1992
|
+
connect(iframe: HTMLIFrameElement, origin: string): void;
|
|
1993
|
+
/**
|
|
1994
|
+
* Disconnect from the current iframe.
|
|
1995
|
+
*/
|
|
1996
|
+
disconnect(): void;
|
|
1997
|
+
sendPageUpdate(sections: EditorSection[]): void;
|
|
1998
|
+
sendSelectElement(elementId: string): void;
|
|
1999
|
+
sendDeselect(): void;
|
|
2000
|
+
onReady(): Observable<void>;
|
|
2001
|
+
onElementClicked(): Observable<{
|
|
2002
|
+
elementId: string;
|
|
2003
|
+
sectionId: string;
|
|
2004
|
+
}>;
|
|
2005
|
+
onElementHover(): Observable<string | null>;
|
|
2006
|
+
onElementMoved(): Observable<{
|
|
2007
|
+
elementId: string;
|
|
2008
|
+
newIndex: number;
|
|
2009
|
+
targetSectionId?: string;
|
|
2010
|
+
}>;
|
|
2011
|
+
private send;
|
|
2012
|
+
private handleMessage;
|
|
2013
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<IframeBridgeService, never>;
|
|
2014
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<IframeBridgeService>;
|
|
2015
|
+
}
|
|
2203
2016
|
|
|
2204
2017
|
declare class DragDropService {
|
|
2205
2018
|
private readonly store;
|
|
@@ -2231,5 +2044,5 @@ declare class VisualEditor {
|
|
|
2231
2044
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<VisualEditor, "lib-visual-editor", never, {}, {}, never, never, true, never>;
|
|
2232
2045
|
}
|
|
2233
2046
|
|
|
2234
|
-
export {
|
|
2235
|
-
export type {
|
|
2047
|
+
export { BlockTreeItemComponent, CREATE_METAFIELD_DEFINITION_MUTATION, ComponentRegistryService, DEFAULT_ROUTER_NAVIGATION_CONFIG, DEFAULT_VISUAL_EDITOR_CONFIG, DELETE_METAFIELDS_MUTATION, DELETE_METAFIELD_DEFINITION_MUTATION, DefaultRouterNavigationService, DragDropService, DynamicRendererComponent, EDITOR_COMPONENT_DEFINITIONS, FILES_QUERY, GET_METAFIELD_DEFINITION_QUERY, GET_SHOP_ID_QUERY, GET_SHOP_METAFIELD_QUERY, INDEX_KEY, IframeBridgeService, InputPageLoadingStrategy, MAX_METAFIELD_SIZE, ManifestLoaderService, NAMESPACE, PageLoadingStrategy, PageManagerComponent, PageService, PageShopifyRepository, PageStorefrontRepository, ROUTER_NAVIGATION_CONFIG, RoutePageLoadingStrategy, SET_METAFIELD_MUTATION, SHOPIFY_CONFIG, STOREFRONT_CONFIG, STOREFRONT_URL, ShopifyFilePickerComponent, ShopifyFilesService, ShopifyGraphQLClient, ShopifyMetafieldRepository, SlotRendererComponent, StorefrontGraphQLClient, StorefrontMetafieldRepository, USE_IN_MEMORY_PAGES, VISUAL_EDITOR_CONFIG, VISUAL_EDITOR_FEATURE_KEY, VisualEditor, VisualEditorActions, VisualEditorComponent, VisualEditorFacade, VisualEditorNavigation, initialVisualEditorState, provideEditorComponents, provideVisualEditor, provideVisualEditorStore, selectBlocksForSection, selectBlocksForSlot, selectCanRedo, selectCanUndo, selectCurrentPage, selectCurrentPageId, selectCurrentPageSlug, selectCurrentPageStatus, selectCurrentPageTitle, selectCurrentPageVersion, selectDraggedElementId, selectElementById, selectHistory, selectHistoryIndex, selectHistoryLength, selectIsDirty, selectIsDragging, selectIsPageLoaded, selectLastAction, selectSectionById, selectSections, selectSelectedBlock, selectSelectedBlockSlotName, selectSelectedElement, selectSelectedElementId, selectSelectedElementType, selectSelectedSection, selectSelectedSectionId, selectSelectedSectionType, selectVisualEditorState, visualEditorReducer };
|
|
2048
|
+
export type { BlockPickerTarget, BlockTreeContext, ComponentCategory, ComponentDefinition, ComponentManifest, ComponentManifestEntry, ComponentPreset, ConfirmDialogOptions, CreatePageRequest, DeselectMessage, DragItem, DragItemKind, DropTarget, DropZone, EditorElement, EditorSection, ElementClickedMessage, ElementHoverMessage, ElementMovedMessage, HistoryEntry, Metafield, Page, PageContext, PageIndexEntry, PageStatus, PageSummary, PageUpdateMessage, PagesIndex, PresetBlockConfig, PropCondition, PropSchema, PropSchemaMap, PropType, PropValidation, PublishPageRequest, ReadyMessage, ResolvedPreset, RouterNavigationConfig, SelectElementMessage, SelectOption, ShopifyConfig, ShopifyFile, ShopifyFilesPage, SlotConstraints, SlotDefinition, StorefrontConfig, UpdatePageRequest, VisualEditorConfig, VisualEditorNavigationTarget, VisualEditorState };
|