@lasterp/shared 1.0.0-beta.2 → 1.0.0-beta.21

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.
@@ -1,29 +1,103 @@
1
1
  interface Item {
2
+ name: string;
3
+ image: string;
2
4
  item_code: string;
3
- area: string;
4
- model: string;
5
- region: string;
6
- grade: string;
7
- grade_issuer: string;
5
+ item_name: string;
6
+ item_group: string;
7
+ brand: string;
8
+ os: string;
9
+ release_year: string;
10
+ description: string;
11
+ attributes: string[];
12
+ storages: string[];
13
+ memories: string[];
14
+ colors: Colour2[];
15
+ screens: ScreenSpec[];
16
+ images: Image[];
17
+ height: number;
18
+ width: number;
19
+ weight: number;
20
+ }
21
+ interface Colour2 {
8
22
  color: string;
9
- storage: string;
10
- memory: string;
11
- connectivity: string;
12
- carrier_compatibility: string;
13
- }
14
- interface ItemVariant extends Item {
15
- item_variant: string;
23
+ hex: string;
24
+ color_system: string;
16
25
  }
17
26
  interface Model {
18
27
  model_number: string;
19
28
  sim_card_type: string;
20
29
  connectivity: string;
21
30
  }
22
- interface Colour {
31
+ interface ScreenSpec {
32
+ screen: string;
33
+ height: number;
34
+ width: number;
35
+ weight: number;
36
+ }
37
+ interface Image {
38
+ image: string;
23
39
  color: string;
24
- hex: string;
25
- color_system: string;
26
40
  }
41
+ import { z } from "zod";
42
+ declare const ATTRIBUTES: readonly ["Colour", "Storage", "Memory", "Screen"];
43
+ declare const colourFormSchema: z.ZodObject<{
44
+ color: z.ZodString;
45
+ color_hex: z.ZodOptional<z.ZodString>;
46
+ color_system: z.ZodOptional<z.ZodString>;
47
+ color_system_hex: z.ZodOptional<z.ZodString>;
48
+ images: z.ZodDefault<z.ZodArray<z.ZodString>>;
49
+ }, z.core.$strip>;
50
+ declare const screenFormSchema: z.ZodObject<{
51
+ screen: z.ZodString;
52
+ height: z.ZodOptional<z.ZodNumber>;
53
+ width: z.ZodOptional<z.ZodNumber>;
54
+ weight: z.ZodOptional<z.ZodNumber>;
55
+ }>;
56
+ declare const modelFormSchema: z.ZodObject<{
57
+ model: z.ZodString;
58
+ sim_card_type: z.ZodOptional<z.ZodString>;
59
+ connectivity: z.ZodArray<z.ZodString>;
60
+ }>;
61
+ declare const itemFormSchema: z.ZodObject<{
62
+ item_code: z.ZodString;
63
+ item_group: z.ZodOptional<z.ZodString>;
64
+ brand: z.ZodOptional<z.ZodString>;
65
+ os: z.ZodOptional<z.ZodString>;
66
+ release_year: z.ZodOptional<z.ZodNumber>;
67
+ attributes: z.ZodArray<z.ZodEnum<{
68
+ Colour: "Colour";
69
+ Storage: "Storage";
70
+ Memory: "Memory";
71
+ Screen: "Screen";
72
+ }>>;
73
+ colours: z.ZodArray<z.ZodObject<{
74
+ color: z.ZodString;
75
+ color_hex: z.ZodOptional<z.ZodString>;
76
+ color_system: z.ZodOptional<z.ZodString>;
77
+ color_system_hex: z.ZodOptional<z.ZodString>;
78
+ images: z.ZodDefault<z.ZodArray<z.ZodString>>;
79
+ }, z.core.$strip>>;
80
+ storages: z.ZodArray<z.ZodString>;
81
+ memories: z.ZodArray<z.ZodString>;
82
+ screens: z.ZodArray<z.ZodObject<{
83
+ screen: z.ZodString;
84
+ height: z.ZodOptional<z.ZodNumber>;
85
+ width: z.ZodOptional<z.ZodNumber>;
86
+ weight: z.ZodOptional<z.ZodNumber>;
87
+ }, z.core.$strip>>;
88
+ models: z.ZodArray<z.ZodObject<{
89
+ model: z.ZodString;
90
+ sim_card_type: z.ZodOptional<z.ZodString>;
91
+ connectivity: z.ZodArray<z.ZodString>;
92
+ }, z.core.$strip>>;
93
+ width: z.ZodOptional<z.ZodNumber>;
94
+ height: z.ZodOptional<z.ZodNumber>;
95
+ weight: z.ZodOptional<z.ZodNumber>;
96
+ }>;
97
+ type ColourForm = z.infer<typeof colourFormSchema>;
98
+ type ScreenForm = z.infer<typeof screenFormSchema>;
99
+ type ModelForm = z.infer<typeof modelFormSchema>;
100
+ type ItemForm = z.infer<typeof itemFormSchema>;
27
101
  interface Globals {
28
102
  header: Header;
29
103
  footer: Footer;
@@ -97,6 +171,15 @@ interface Page {
97
171
  hero?: Hero;
98
172
  blocks: Block[];
99
173
  }
174
+ interface WorkspaceSidebar {
175
+ label: string;
176
+ header_icon: string;
177
+ items: WorkspaceSidebarItem[];
178
+ }
179
+ interface WorkspaceSidebarItem {
180
+ label: string;
181
+ link_to: string;
182
+ }
100
183
  import { FrappeApp, FrappeAuth, FrappeCall } from "frappe-js-sdk";
101
184
  import { FrappeDB } from "frappe-js-sdk/lib/db";
102
185
  import { FrappeFileUpload } from "frappe-js-sdk/lib/file";
@@ -131,6 +214,26 @@ interface TokenParams {
131
214
  /** Type of token to be used for authentication */
132
215
  type: "Bearer" | "token";
133
216
  }
217
+ interface FrappeResult<T> {
218
+ message: T;
219
+ }
220
+ interface FrappeMeta {
221
+ fields: FrappeMetaField[];
222
+ permissions: {
223
+ can_select: boolean;
224
+ can_read: boolean;
225
+ can_write: boolean;
226
+ can_create: boolean;
227
+ can_delete: boolean;
228
+ };
229
+ }
230
+ interface FrappeMetaField {
231
+ label: string;
232
+ fieldname: string;
233
+ in_list_view: boolean;
234
+ read_only: boolean;
235
+ set_only_once: boolean;
236
+ }
134
237
  import { PropsWithChildren } from "react";
135
238
  type FrappeProviderProps = PropsWithChildren<{
136
239
  /** URL of the Frappe server
@@ -468,6 +571,7 @@ import { FrappeDoc as FrappeDoc2 } from "frappe-js-sdk/lib/db/types";
468
571
  * return <div>{data?.name} - {data?.email}</div>
469
572
  */
470
573
  declare const useFrappeGetDoc: <T = any>(doctype: string, name?: string, options?: {
574
+ enabled?: boolean;
471
575
  staleTime?: number;
472
576
  retry?: boolean | number;
473
577
  }) => {
@@ -586,6 +690,16 @@ declare const useFrappeUpdateDoc: <T = any>() => {
586
690
  isCompleted: boolean;
587
691
  reset: () => void;
588
692
  };
693
+ declare const useFrappeGetMeta: (doctype: string, options?: {
694
+ staleTime?: number;
695
+ retry?: boolean | number;
696
+ }) => {
697
+ data: FrappeMeta | undefined;
698
+ error: FrappeError | null;
699
+ isLoading: boolean;
700
+ isFetching: boolean;
701
+ refetch: () => void;
702
+ };
589
703
  interface VariantSelectorProps<T extends {
590
704
  id: string;
591
705
  specs: Record<string, string>;
@@ -611,6 +725,19 @@ declare const useVariantSelector: <T extends {
611
725
  id: string;
612
726
  specs: Record<string, string>;
613
727
  }>(props: VariantSelectorProps<T>) => VariantSelectorResult;
728
+ import { JSX, ReactNode } from "react";
729
+ import { StateStorage } from "zustand/middleware";
730
+ type TranslateFn = (message: string, replace?: (string | number)[]) => string;
731
+ interface LocaleProviderProps {
732
+ method: string;
733
+ language: string;
734
+ storage?: StateStorage;
735
+ children: ReactNode;
736
+ }
737
+ declare function LocaleProvider({ method, language, storage, children }: LocaleProviderProps): JSX.Element | null;
738
+ declare function useLocale(): {
739
+ __: TranslateFn;
740
+ };
614
741
  interface Category {
615
742
  name: string;
616
743
  }
@@ -620,7 +747,7 @@ interface Product {
620
747
  item_code: string;
621
748
  description: string;
622
749
  }
623
- interface ProductVariant extends ItemVariant {
750
+ interface ProductVariant {
624
751
  name: string;
625
752
  currency: string;
626
753
  rate: number;
@@ -640,16 +767,8 @@ interface ProductContext {
640
767
  specs: Record<string, string[]>;
641
768
  variants: ProductVariant[];
642
769
  models: Record<string, Model>;
643
- colors: Record<string, Colour>;
770
+ colors: Record<string, Colour2>;
644
771
  }
645
772
  import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
646
773
  declare function equalsIgnoreCase(str1: string, str2: string): boolean;
647
- import { JSX, ReactNode } from "react";
648
- interface ServerProviderProps {
649
- frappeUrl: string;
650
- siteName?: string;
651
- resource: string;
652
- children: ReactNode;
653
- }
654
- declare function ServerProvider({ frappeUrl, siteName, resource, children }: ServerProviderProps): JSX.Element;
655
- export { useVariantSelector, useSearch, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, ServerProvider, SearchResult, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Category, Brand, Block };
774
+ export { useVariantSelector, useSearch, useLocale, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetMeta, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, screenFormSchema, modelFormSchema, itemFormSchema, equalsIgnoreCase, decamelizeKeys, decamelize, colourFormSchema, camelizeKeys, camelize, WorkspaceSidebarItem, WorkspaceSidebar, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, SearchResult, ScreenSpec, ScreenForm, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, ModelForm, Model, LocaleProvider, ItemForm, Item, Image, Hero, Header, Globals, FrappeResult, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeMetaField, FrappeMeta, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, ColourForm, Colour2 as Colour, Category, Brand, Block, ATTRIBUTES };
@@ -1,29 +1,103 @@
1
1
  interface Item {
2
+ name: string;
3
+ image: string;
2
4
  item_code: string;
3
- area: string;
4
- model: string;
5
- region: string;
6
- grade: string;
7
- grade_issuer: string;
5
+ item_name: string;
6
+ item_group: string;
7
+ brand: string;
8
+ os: string;
9
+ release_year: string;
10
+ description: string;
11
+ attributes: string[];
12
+ storages: string[];
13
+ memories: string[];
14
+ colors: Colour2[];
15
+ screens: ScreenSpec[];
16
+ images: Image[];
17
+ height: number;
18
+ width: number;
19
+ weight: number;
20
+ }
21
+ interface Colour2 {
8
22
  color: string;
9
- storage: string;
10
- memory: string;
11
- connectivity: string;
12
- carrier_compatibility: string;
13
- }
14
- interface ItemVariant extends Item {
15
- item_variant: string;
23
+ hex: string;
24
+ color_system: string;
16
25
  }
17
26
  interface Model {
18
27
  model_number: string;
19
28
  sim_card_type: string;
20
29
  connectivity: string;
21
30
  }
22
- interface Colour {
31
+ interface ScreenSpec {
32
+ screen: string;
33
+ height: number;
34
+ width: number;
35
+ weight: number;
36
+ }
37
+ interface Image {
38
+ image: string;
23
39
  color: string;
24
- hex: string;
25
- color_system: string;
26
40
  }
41
+ import { z } from "zod";
42
+ declare const ATTRIBUTES: readonly ["Colour", "Storage", "Memory", "Screen"];
43
+ declare const colourFormSchema: z.ZodObject<{
44
+ color: z.ZodString;
45
+ color_hex: z.ZodOptional<z.ZodString>;
46
+ color_system: z.ZodOptional<z.ZodString>;
47
+ color_system_hex: z.ZodOptional<z.ZodString>;
48
+ images: z.ZodDefault<z.ZodArray<z.ZodString>>;
49
+ }, z.core.$strip>;
50
+ declare const screenFormSchema: z.ZodObject<{
51
+ screen: z.ZodString;
52
+ height: z.ZodOptional<z.ZodNumber>;
53
+ width: z.ZodOptional<z.ZodNumber>;
54
+ weight: z.ZodOptional<z.ZodNumber>;
55
+ }>;
56
+ declare const modelFormSchema: z.ZodObject<{
57
+ model: z.ZodString;
58
+ sim_card_type: z.ZodOptional<z.ZodString>;
59
+ connectivity: z.ZodArray<z.ZodString>;
60
+ }>;
61
+ declare const itemFormSchema: z.ZodObject<{
62
+ item_code: z.ZodString;
63
+ item_group: z.ZodOptional<z.ZodString>;
64
+ brand: z.ZodOptional<z.ZodString>;
65
+ os: z.ZodOptional<z.ZodString>;
66
+ release_year: z.ZodOptional<z.ZodNumber>;
67
+ attributes: z.ZodArray<z.ZodEnum<{
68
+ Colour: "Colour";
69
+ Storage: "Storage";
70
+ Memory: "Memory";
71
+ Screen: "Screen";
72
+ }>>;
73
+ colours: z.ZodArray<z.ZodObject<{
74
+ color: z.ZodString;
75
+ color_hex: z.ZodOptional<z.ZodString>;
76
+ color_system: z.ZodOptional<z.ZodString>;
77
+ color_system_hex: z.ZodOptional<z.ZodString>;
78
+ images: z.ZodDefault<z.ZodArray<z.ZodString>>;
79
+ }, z.core.$strip>>;
80
+ storages: z.ZodArray<z.ZodString>;
81
+ memories: z.ZodArray<z.ZodString>;
82
+ screens: z.ZodArray<z.ZodObject<{
83
+ screen: z.ZodString;
84
+ height: z.ZodOptional<z.ZodNumber>;
85
+ width: z.ZodOptional<z.ZodNumber>;
86
+ weight: z.ZodOptional<z.ZodNumber>;
87
+ }, z.core.$strip>>;
88
+ models: z.ZodArray<z.ZodObject<{
89
+ model: z.ZodString;
90
+ sim_card_type: z.ZodOptional<z.ZodString>;
91
+ connectivity: z.ZodArray<z.ZodString>;
92
+ }, z.core.$strip>>;
93
+ width: z.ZodOptional<z.ZodNumber>;
94
+ height: z.ZodOptional<z.ZodNumber>;
95
+ weight: z.ZodOptional<z.ZodNumber>;
96
+ }>;
97
+ type ColourForm = z.infer<typeof colourFormSchema>;
98
+ type ScreenForm = z.infer<typeof screenFormSchema>;
99
+ type ModelForm = z.infer<typeof modelFormSchema>;
100
+ type ItemForm = z.infer<typeof itemFormSchema>;
27
101
  interface Globals {
28
102
  header: Header;
29
103
  footer: Footer;
@@ -97,6 +171,15 @@ interface Page {
97
171
  hero?: Hero;
98
172
  blocks: Block[];
99
173
  }
174
+ interface WorkspaceSidebar {
175
+ label: string;
176
+ header_icon: string;
177
+ items: WorkspaceSidebarItem[];
178
+ }
179
+ interface WorkspaceSidebarItem {
180
+ label: string;
181
+ link_to: string;
182
+ }
100
183
  import { FrappeApp, FrappeAuth, FrappeCall } from "frappe-js-sdk";
101
184
  import { FrappeDB } from "frappe-js-sdk/lib/db";
102
185
  import { FrappeFileUpload } from "frappe-js-sdk/lib/file";
@@ -131,6 +214,26 @@ interface TokenParams {
131
214
  /** Type of token to be used for authentication */
132
215
  type: "Bearer" | "token";
133
216
  }
217
+ interface FrappeResult<T> {
218
+ message: T;
219
+ }
220
+ interface FrappeMeta {
221
+ fields: FrappeMetaField[];
222
+ permissions: {
223
+ can_select: boolean;
224
+ can_read: boolean;
225
+ can_write: boolean;
226
+ can_create: boolean;
227
+ can_delete: boolean;
228
+ };
229
+ }
230
+ interface FrappeMetaField {
231
+ label: string;
232
+ fieldname: string;
233
+ in_list_view: boolean;
234
+ read_only: boolean;
235
+ set_only_once: boolean;
236
+ }
134
237
  import { PropsWithChildren } from "react";
135
238
  type FrappeProviderProps = PropsWithChildren<{
136
239
  /** URL of the Frappe server
@@ -468,6 +571,7 @@ import { FrappeDoc as FrappeDoc2 } from "frappe-js-sdk/lib/db/types";
468
571
  * return <div>{data?.name} - {data?.email}</div>
469
572
  */
470
573
  declare const useFrappeGetDoc: <T = any>(doctype: string, name?: string, options?: {
574
+ enabled?: boolean;
471
575
  staleTime?: number;
472
576
  retry?: boolean | number;
473
577
  }) => {
@@ -586,6 +690,16 @@ declare const useFrappeUpdateDoc: <T = any>() => {
586
690
  isCompleted: boolean;
587
691
  reset: () => void;
588
692
  };
693
+ declare const useFrappeGetMeta: (doctype: string, options?: {
694
+ staleTime?: number;
695
+ retry?: boolean | number;
696
+ }) => {
697
+ data: FrappeMeta | undefined;
698
+ error: FrappeError | null;
699
+ isLoading: boolean;
700
+ isFetching: boolean;
701
+ refetch: () => void;
702
+ };
589
703
  interface VariantSelectorProps<T extends {
590
704
  id: string;
591
705
  specs: Record<string, string>;
@@ -611,6 +725,19 @@ declare const useVariantSelector: <T extends {
611
725
  id: string;
612
726
  specs: Record<string, string>;
613
727
  }>(props: VariantSelectorProps<T>) => VariantSelectorResult;
728
+ import { JSX, ReactNode } from "react";
729
+ import { StateStorage } from "zustand/middleware";
730
+ type TranslateFn = (message: string, replace?: (string | number)[]) => string;
731
+ interface LocaleProviderProps {
732
+ method: string;
733
+ language: string;
734
+ storage?: StateStorage;
735
+ children: ReactNode;
736
+ }
737
+ declare function LocaleProvider({ method, language, storage, children }: LocaleProviderProps): JSX.Element | null;
738
+ declare function useLocale(): {
739
+ __: TranslateFn;
740
+ };
614
741
  interface Category {
615
742
  name: string;
616
743
  }
@@ -620,7 +747,7 @@ interface Product {
620
747
  item_code: string;
621
748
  description: string;
622
749
  }
623
- interface ProductVariant extends ItemVariant {
750
+ interface ProductVariant {
624
751
  name: string;
625
752
  currency: string;
626
753
  rate: number;
@@ -640,16 +767,8 @@ interface ProductContext {
640
767
  specs: Record<string, string[]>;
641
768
  variants: ProductVariant[];
642
769
  models: Record<string, Model>;
643
- colors: Record<string, Colour>;
770
+ colors: Record<string, Colour2>;
644
771
  }
645
772
  import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
646
773
  declare function equalsIgnoreCase(str1: string, str2: string): boolean;
647
- import { JSX, ReactNode } from "react";
648
- interface ServerProviderProps {
649
- frappeUrl: string;
650
- siteName?: string;
651
- resource: string;
652
- children: ReactNode;
653
- }
654
- declare function ServerProvider({ frappeUrl, siteName, resource, children }: ServerProviderProps): JSX.Element;
655
- export { useVariantSelector, useSearch, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, ServerProvider, SearchResult, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Category, Brand, Block };
774
+ export { useVariantSelector, useSearch, useLocale, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetMeta, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, screenFormSchema, modelFormSchema, itemFormSchema, equalsIgnoreCase, decamelizeKeys, decamelize, colourFormSchema, camelizeKeys, camelize, WorkspaceSidebarItem, WorkspaceSidebar, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, SearchResult, ScreenSpec, ScreenForm, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, ModelForm, Model, LocaleProvider, ItemForm, Item, Image, Hero, Header, Globals, FrappeResult, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeMetaField, FrappeMeta, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, ColourForm, Colour2 as Colour, Category, Brand, Block, ATTRIBUTES };