@transcend-io/airgap.js-types 6.5.0 → 6.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.yarn/sdks/eslint/package.json +6 -0
  2. package/.yarn/sdks/prettier/package.json +6 -0
  3. package/.yarn/sdks/typescript/package.json +6 -0
  4. package/LICENSE +21 -0
  5. package/build/core.d.ts +375 -0
  6. package/build/core.d.ts.map +1 -0
  7. package/build/core.js +133 -0
  8. package/build/core.js.map +1 -0
  9. package/{src/enums/index.ts → build/enums/index.d.ts} +1 -0
  10. package/build/enums/index.d.ts.map +1 -0
  11. package/build/enums/index.js +16 -0
  12. package/build/enums/index.js.map +1 -0
  13. package/build/enums/privacyRegime.d.ts +16 -0
  14. package/build/enums/privacyRegime.d.ts.map +1 -0
  15. package/build/enums/privacyRegime.js +20 -0
  16. package/build/enums/privacyRegime.js.map +1 -0
  17. package/build/enums/purpose.d.ts +60 -0
  18. package/build/enums/purpose.d.ts.map +1 -0
  19. package/build/enums/purpose.js +47 -0
  20. package/build/enums/purpose.js.map +1 -0
  21. package/build/enums/viewState.d.ts +53 -0
  22. package/build/enums/viewState.d.ts.map +1 -0
  23. package/build/enums/viewState.js +45 -0
  24. package/build/enums/viewState.js.map +1 -0
  25. package/build/index.d.ts +4 -0
  26. package/build/index.d.ts.map +1 -0
  27. package/build/index.js +16 -0
  28. package/build/index.js.map +1 -0
  29. package/build/tsbuildinfo +1 -0
  30. package/build/ui.d.ts +109 -0
  31. package/build/ui.d.ts.map +1 -0
  32. package/build/ui.js +63 -0
  33. package/build/ui.js.map +1 -0
  34. package/package.json +35 -11
  35. package/.depcheckrc +0 -1
  36. package/.github/PULL_REQUEST_TEMPLATE.md +0 -34
  37. package/.vscode/settings.json +0 -6
  38. package/src/core.ts +0 -351
  39. package/src/enums/privacyRegime.ts +0 -15
  40. package/src/enums/purpose.ts +0 -62
  41. package/src/enums/viewState.ts +0 -67
  42. package/src/index.ts +0 -1
  43. package/src/type-utils.ts +0 -110
  44. package/src/ui.ts +0 -92
  45. package/tsconfig.json +0 -40
package/package.json CHANGED
@@ -2,24 +2,48 @@
2
2
  "author": "Transcend Inc.",
3
3
  "name": "@transcend-io/airgap.js-types",
4
4
  "description": "TypeScript types for airgap.js interoperability with custom consent UIs",
5
- "version": "6.5.0",
5
+ "version": "6.8.2",
6
+ "homepage": "https://github.com/transcend-io/airgap.js-types",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/transcend-io/airgap.js-types.git"
10
+ },
6
11
  "license": "MIT",
7
- "main": "src/index",
8
- "type": "module",
12
+ "main": "build/index",
13
+ "files": [
14
+ "build/**/*",
15
+ "package.json"
16
+ ],
9
17
  "scripts": {
10
- "build": "tsc --build",
11
- "clean": "tsc --build --clean",
12
- "lint": "eslint src --ext .ts",
13
- "test": "echo \"Error: no test specified\" && exit 1 # TODO"
18
+ "update:sdks": "yarn set version from sources && yarn sdks base",
19
+ "update:deps": "yarn upgrade-interactive && yarn update:sdks",
20
+ "build": "yarn pnpify tsc --build",
21
+ "clean": "yarn pnpify tsc --build --clean",
22
+ "lint": "yarn pnpify eslint src --ext .ts",
23
+ "prepublish": "yarn build",
24
+ "test": "echo 'no tests'"
14
25
  },
15
26
  "dependencies": {
27
+ "@transcend-io/type-utils": "^1.0.4",
16
28
  "fp-ts": "^2.11.4",
17
29
  "io-ts": "^2.2.16",
18
- "io-ts-types": "^0.5.14",
19
30
  "tslib": "^2.3.0"
20
31
  },
21
32
  "devDependencies": {
22
- "@types/node": "^14.14.31",
23
- "typescript": "^4.3.5"
24
- }
33
+ "@typescript-eslint/eslint-plugin": "^5.1.0",
34
+ "@typescript-eslint/parser": "^5.1.0",
35
+ "@yarnpkg/pnpify": "^3.1.0-rc.2",
36
+ "@yarnpkg/sdks": "^2.5.0-rc.2",
37
+ "depcheck": "^1.4.2",
38
+ "eslint": "^7.30.0",
39
+ "eslint-config-airbnb-base": "^14.2.1",
40
+ "eslint-import-resolver-typescript": "^2.5.0",
41
+ "eslint-plugin-eslint-comments": "^3.2.0",
42
+ "eslint-plugin-import": "2.25.2",
43
+ "eslint-plugin-jsdoc": "^36.1.1",
44
+ "prettier": "^2.4.1",
45
+ "ts-node": "^10.4.0",
46
+ "typescript": "^4.4.4"
47
+ },
48
+ "packageManager": "yarn@3.1.1"
25
49
  }
package/.depcheckrc DELETED
@@ -1 +0,0 @@
1
- ignores: ["@transcend-io/airgap.js-types", "tslib"]
@@ -1,34 +0,0 @@
1
- ## Related Issues
2
-
3
- - _[none]_
4
-
5
- ## Public Changelog
6
-
7
- <!--- If you have changes in this section, please make sure https://docs.transcend.io is also up-to-date. -->
8
- <!-- Please adhere to the style guide here https://www.notion.so/transcend/Style-Guide-Change-Logs-70a661461ca64b2b9ffc7bcfc91856c9 -->
9
-
10
- _[none]_
11
-
12
- ## Internal Changelog
13
-
14
- _[none]_
15
-
16
- ## Security Implications
17
-
18
- _[none]_
19
-
20
- ## System Availability
21
-
22
- _[none]_
23
-
24
- <!---
25
-
26
- ## Eng Announcements
27
-
28
- - _[none]_
29
-
30
- ## Release Manual Tests
31
-
32
- - _[none]_
33
-
34
- -->
@@ -1,6 +0,0 @@
1
- {
2
- "cSpell.words": [
3
- "airgap",
4
- "Optionalize"
5
- ]
6
- }
package/src/core.ts DELETED
@@ -1,351 +0,0 @@
1
- // external
2
- import * as t from 'io-ts';
3
-
4
- // main
5
- import { valuesOf } from './type-utils';
6
-
7
- // local
8
- import { ConfigurablePurpose, PrivacyRegimeEnum, SpecialTrackingPurpose } from './enums';
9
-
10
- /* eslint-disable max-lines */
11
-
12
- /** Transcend logger items */
13
- export type LogItem = {
14
- /** Log item content */
15
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
- content: any;
17
- /** Log item styles */
18
- styles: string[];
19
- };
20
-
21
- /** Transcend logger entry tag */
22
- export type LogTag = LogItem & {
23
- /** Log tag content must be a string */
24
- content: string;
25
- /** Log tags must have only one style */
26
- styles: string[1];
27
- };
28
-
29
- /** Transcend logger entry message */
30
- export type LogMessage = LogItem;
31
-
32
- /** Console-safe log levels */
33
- export const ConsoleSafeLogLevel = t.keyof({
34
- info: null,
35
- log: null,
36
- warn: null,
37
- debug: null,
38
- error: null,
39
- trace: null,
40
- // meta-levels:
41
- group: null,
42
- groupCollapsed: null,
43
- groupEnd: null,
44
- });
45
-
46
- /** Override type */
47
- export type ConsoleSafeLogLevel = t.TypeOf<typeof ConsoleSafeLogLevel>;
48
-
49
- /** Airgap log levels */
50
- export const LogLevel = t.union([ConsoleSafeLogLevel, t.literal('fatal')]);
51
- /** Override type */
52
- export type LogLevel = t.TypeOf<typeof LogLevel>;
53
-
54
- /** Airgap logger entry types */
55
- export type LogEntryType = LogLevel;
56
-
57
- /** Airgap logger entries */
58
- export type LogEntry = {
59
- /** Log entry tag */
60
- tag: LogTag;
61
- /** Log entry message */
62
- message: LogMessage;
63
- };
64
-
65
- /**
66
- * Log emitter function
67
- */
68
- export type LogEmitter = ((...entries: any[]) => void) & {
69
- /** Styled log emitter function */
70
- styled(styles?: null | string | string[], ...entries: any[]): void;
71
- };
72
-
73
- /** Transcend Logger API */
74
- export type Logger = {
75
- /**
76
- * Set log tag during callback execution or from
77
- * this point on if no callback is provided.
78
- */
79
- tag(logTag: string, callback?: () => any): void;
80
- } & {
81
- /** Log emitter (e.g. `logger.log()`) */
82
- [method in LogLevel]: LogEmitter;
83
- };
84
-
85
- /** AirgapAuth auth options */
86
- export type AirgapAuthMap = {
87
- /** A `load` event from a just-loaded airgap.js script element (which implies auth by being loaded before airgap.js) */
88
- load?: Event;
89
- /** A user-initiated interaction event that was just dispatched. */
90
- interaction?: UIEvent;
91
- /** Automatically reload the page if needed to remove CSP. `false` by default. */
92
- autoReload?: boolean;
93
- };
94
-
95
- /** Airgap authorization proof */
96
- export type AirgapAuth =
97
- | null
98
- | AirgapAuthMap
99
- /** A user-initiated interaction event that was just dispatched. */
100
- | UIEvent
101
- /** A `load` event from a just-loaded airgap.js script element (which implies auth by being loaded before airgap.js) */
102
- | Event;
103
-
104
- /** A boolean value represented as either `'on'` or `'off'` */
105
- export const BooleanString = t.keyof({
106
- on: null,
107
- off: null,
108
- });
109
- /** Type override */
110
- export type BooleanString = t.TypeOf<typeof BooleanString>;
111
-
112
- /** Potentially applicable data privacy legal regimes */
113
- export const PrivacyRegime = valuesOf(PrivacyRegimeEnum);
114
-
115
- /** type overload */
116
- export type PrivacyRegime = t.TypeOf<typeof PrivacyRegime>;
117
-
118
- /** airgap.js API */
119
- export type AirgapAPI = Readonly<{
120
- /** Airgap ready event subscriber */
121
- ready(callback: (airgap: AirgapAPI) => void): void;
122
- /** Enqueue cross-domain data sync across all airgap bundle domains */
123
- sync(): Promise<void>;
124
- /** Resolve airgap request overrides for a URL */
125
- resolve(url: Stringifiable): string;
126
- /** Get tracking consent */
127
- getConsent(): TrackingConsentDetails;
128
- /** Set tracking consent */
129
- setConsent(
130
- /** Airgap auth proof */
131
- auth: AirgapAuth,
132
- /** The tracking consent options. */
133
- consent: TrackingConsent,
134
- ): boolean;
135
- /** Consents the user to all tracking purposes (requires recent UI interaction) */
136
- optIn(
137
- /** Airgap auth proof */
138
- auth: AirgapAuth,
139
- ): boolean;
140
- /** Revokes consent for all tracking purposes (requires recent UI interaction) */
141
- optOut(
142
- /** Airgap auth proof */
143
- auth: AirgapAuth,
144
- ): boolean;
145
- /** Returns true if the user is fully-opted in to all first-order tracking purposes */
146
- isOptedIn(): boolean;
147
- /** Returns true if the user is fully-opted out to all first-order tracking purposes */
148
- isOptedOut(): boolean;
149
- /** Get initialized tracking purposes config */
150
- getPurposeTypes(): TrackingPurposesTypes;
151
- /** Clear airgap queue & caches. Returns `true` on success. */
152
- clear(auth: AirgapAuth): boolean;
153
- /** Reset airgap queue and consent. Returns `true` on success. */
154
- reset(
155
- /** An airgap auth proof */
156
- auth: AirgapAuth,
157
- /** Automatically reload the page if needed to remove CSP. */
158
- autoReload?: boolean,
159
- ): boolean;
160
- /** Get a list of legal regimes that are potentially applicable to the user */
161
- getRegimes(): Promise<Set<PrivacyRegime>>;
162
- /** Get a list of detected active user agent privacy signals */
163
- getPrivacySignals(): Promise<Set<UserPrivacySignal>>;
164
- /** airgap.js version number */
165
- version: string;
166
- }> &
167
- EventTarget;
168
-
169
- /**
170
- * airgap.js event type
171
- */
172
- export type AirgapEventType = 'consent-change' | 'purpose-map-load';
173
-
174
- /** 'consent-change' custom event details */
175
- export type ConsentChangeEventDetails = {
176
- /** The old tracking consent */
177
- oldConsent: TrackingConsentDetails;
178
- /** The new tracking consent */
179
- consent: TrackingConsentDetails;
180
- /** The tracking consent diff (what's changed in the new consent) */
181
- changes: ConsentChange | null;
182
- };
183
-
184
- /** Removable process (can remove watchers, overrides, and protections) */
185
- export type Removable = {
186
- /** Remove/revoke process */
187
- remove(): void;
188
- };
189
-
190
- /** Any value which implements `toString()` */
191
- export type Stringifiable =
192
- | string
193
- | (string & {
194
- toString(): string;
195
- });
196
-
197
- /** Special `defaultConsent` automatic opt-out value for any potential reason */
198
- export const AutoOptOut = t.literal('Auto');
199
- /** Type override */
200
- export type AutoOptOut = t.TypeOf<typeof AutoOptOut>;
201
-
202
- /** Special `defaultConsent` automatic opt-out value for GDPR-protected users */
203
- export const AutoOptOutForGDPR = t.literal('AutoGDPR');
204
- /** Type override */
205
- export type AutoOptOutForGDPR = t.TypeOf<typeof AutoOptOutForGDPR>;
206
-
207
- /**
208
- * Special `defaultConsent` automatic opt-out value for users with DNT enabled.
209
- * Note that DNT is enabled by default for some browsers.
210
- */
211
- export const AutoOptOutForDNT = t.literal('AutoDNT');
212
- /** Type override */
213
- export type AutoOptOutForDNT = t.TypeOf<typeof AutoOptOutForDNT>;
214
-
215
- /**
216
- * Special `defaultConsent` automatic opt-out value for users with GPC enabled.
217
- */
218
- export const AutoOptOutForGPC = t.literal('AutoGPC');
219
- /** Type override */
220
- export type AutoOptOutForGPC = t.TypeOf<typeof AutoOptOutForGPC>;
221
-
222
- /** Potential values for `defaultConsent` config token list */
223
- export const DefaultConsentConfigValue = t.union([
224
- t.boolean,
225
- AutoOptOut,
226
- AutoOptOutForGDPR,
227
- AutoOptOutForDNT,
228
- AutoOptOutForGPC,
229
- BooleanString,
230
- ]);
231
- /** Type override */
232
- export type DefaultConsentConfigValue = t.TypeOf<
233
- typeof DefaultConsentConfigValue
234
- >;
235
-
236
- /** Tracking purpose metadata */
237
- export const TrackingPurposeDetails = t.intersection([
238
- t.type({
239
- /** Tracking purpose name */
240
- name: t.string,
241
- /** Tracking purpose description (used in Consent Manager UI) */
242
- description: t.string,
243
- /** Tracking purpose default consent (default: false) */
244
- defaultConsent: DefaultConsentConfigValue,
245
- /**
246
- * Is this a first-order tracking purpose? If false, this is a
247
- * second-order tracking purpose that should only be used for
248
- * request overrides.
249
- *
250
- * This parameter previously meant:
251
- * Show tracking purpose in consent manager UI.
252
- *
253
- * Default value: true
254
- */
255
- showInConsentManager: t.boolean,
256
- /** Allow user to configure their consent for this purpose (default: true) */
257
- configurable: t.boolean,
258
- /** Is tracking purpose "essential" - i.e. consent is mandatory / equivalent to 'essential' permission (default: false) */
259
- essential: t.boolean,
260
- }),
261
- t.partial({
262
- /** Tracking type */
263
- trackingType: valuesOf(ConfigurablePurpose),
264
- }),
265
- ]);
266
- /** Type override */
267
- export type TrackingPurposeDetails = t.TypeOf<typeof TrackingPurposeDetails>;
268
-
269
- /** Tracking purposes types configuration */
270
- export const TrackingPurposesTypes = t.record(t.string, TrackingPurposeDetails);
271
- /** Type override */
272
- export type TrackingPurposesTypes = t.TypeOf<typeof TrackingPurposesTypes>;
273
-
274
- /** Fully-resolved `defaultConsent` config */
275
- export const DefaultConsentConfig = t.record(
276
- t.string,
277
- DefaultConsentConfigValue,
278
- );
279
- /** Type override */
280
- export type DefaultConsentConfig = t.TypeOf<typeof DefaultConsentConfig>;
281
-
282
- /** Tracking purposes configuration */
283
- export const TrackingPurposesConfig = t.intersection([
284
- t.type({
285
- /** Inherit default tracking purposes config */
286
- useDefault: t.boolean,
287
- types: TrackingPurposesTypes,
288
- }),
289
- t.partial({
290
- defaultConsent: t.union([DefaultConsentConfigValue, DefaultConsentConfig]),
291
- }),
292
- ]);
293
-
294
- /** Type override */
295
- export type TrackingPurposesConfig = {
296
- /** Inherit default tracking purposes config (Functional, Advertising, Analytics) */
297
- useDefault: boolean;
298
- /** Tracking purpose types */
299
- types: TrackingPurposesTypes;
300
- /** Default consent states (takes precedence over `TrackingPurposesTypes[purpose].defaultConsent`) */
301
- defaultConsent?: DefaultConsentConfigValue | DefaultConsentConfig;
302
- };
303
-
304
- /** Tracking purpose consent config */
305
- export type TrackingConsent = {
306
- /** Consent to tracking for essential purposes */
307
- Essential?: true;
308
- /** Unknown (unable to be directly consented) */
309
- Unknown?: false;
310
- /** Custom tracking purpose */
311
- [purpose: string]: boolean | undefined;
312
- };
313
-
314
- /** Tracking purpose consent config with timestamp & auth metadata */
315
- export type TrackingConsentDetails = {
316
- /** Tracking consent config */
317
- purposes: TrackingConsent;
318
- /** Consent last-modified timestamp (ISO 8601) */
319
- timestamp: string;
320
- };
321
-
322
- /** Tracking purpose */
323
- export const TrackingPurpose = t.union([
324
- t.keyof(SpecialTrackingPurpose),
325
- t.string,
326
- ]);
327
-
328
- /** Type override */
329
- export type TrackingPurpose = t.TypeOf<typeof TrackingPurpose>;
330
-
331
- /** Tracking purposes */
332
- export type TrackingPurposes = Set<TrackingPurpose>;
333
-
334
- /** User-configurable user agent privacy signal */
335
- export const UserPrivacySignal = t.union([
336
- /** Global Privacy Control */
337
- t.literal('GPC'),
338
- /** Do Not Track */
339
- t.literal('DNT'),
340
- ]);
341
-
342
- /** type overload */
343
- export type UserPrivacySignal = t.TypeOf<typeof UserPrivacySignal>;
344
-
345
- /** Tracking consent change diffs */
346
- export const ConsentChange = t.record(TrackingPurpose, t.boolean);
347
-
348
- /** type overload */
349
- export type ConsentChange = t.TypeOf<typeof ConsentChange>;
350
-
351
- /* eslint-enable max-lines */
@@ -1,15 +0,0 @@
1
- /** Potentially applicable data privacy legal regimes */
2
- export enum PrivacyRegimeEnum {
3
- /** Unable to determine any applicable regimes */
4
- Unknown = 'Unknown',
5
- /** California Privacy Rights Act (and CCPA: California Consumer Privacy Act) */
6
- CPRA = 'CPRA',
7
- /** EU General Data Protection Regulation */
8
- GDPR = 'GDPR',
9
- /** Brazil Lei Geral de Proteção de Dados (General Personal Data Protection Law) */
10
- LGPD = 'LGPD',
11
- /** Virginia Consumer Data Protection Act */
12
- CDPA = 'CDPA',
13
- /** Colorado Privacy Act */
14
- CPA = 'CPA',
15
- }
@@ -1,62 +0,0 @@
1
- // main
2
- import { makeEnum } from '../type-utils';
3
-
4
- /**
5
- * The options for the type of purpose that airgap classifies requests into
6
- */
7
- export const SpecialTrackingPurpose = makeEnum({
8
- /** The request has an unknown tracking purpose */
9
- Unknown: 'Unknown',
10
- /** The request is necessary for the essential features of the website */
11
- Essential: 'Essential',
12
- });
13
-
14
- /** Type override */
15
- export type SpecialTrackingPurpose =
16
- typeof SpecialTrackingPurpose[keyof typeof SpecialTrackingPurpose];
17
-
18
- /**
19
- * Possible values for the default consent that can be given to a tracking purpose
20
- */
21
- export const DefaultConsentValue = makeEnum({
22
- /** Tracking purpose is NOT consented to by default */
23
- Off: 'off',
24
- /**
25
- * Tracking purpose is consented to by default, unless user is protected by GDPR
26
- * or has DNT or GPC enabled
27
- */
28
- Auto: 'Auto',
29
- });
30
-
31
- /** Type override */
32
- export type DefaultConsentValue =
33
- typeof DefaultConsentValue[keyof typeof DefaultConsentValue];
34
-
35
- /**
36
- * Purposes that can be configured
37
- */
38
- export const ConfigurablePurpose = makeEnum({
39
- /** SaaS tools used for advertising purposes */
40
- Advertising: 'Advertising',
41
- /** SaaS tools used for analytics purposes */
42
- Analytics: 'Analytics',
43
- /** SaaS tools used for functional purposes */
44
- Functional: 'Functional',
45
- /** SaaS tools used for selling personal information */
46
- SaleOfInfo: 'SaleOfInfo',
47
- });
48
-
49
- /** Type override */
50
- export type ConfigurablePurpose =
51
- typeof ConfigurablePurpose[keyof typeof ConfigurablePurpose];
52
-
53
- /**
54
- * Purposes used by the purpose map
55
- */
56
- export const Purpose = makeEnum({
57
- ...SpecialTrackingPurpose,
58
- ...ConfigurablePurpose,
59
- });
60
-
61
- /** Type override */
62
- export type Purpose = typeof Purpose[keyof typeof Purpose];
@@ -1,67 +0,0 @@
1
- // main
2
- import { makeEnum } from '../type-utils';
3
-
4
- /**
5
- * Consent Manager view states that can be used at launch
6
- */
7
- export const InitialViewState = makeEnum({
8
- /* expanded and showing quick select options */
9
- QuickOptions: 'QuickOptions',
10
- /* accept all or more options */
11
- AcceptAll: 'AcceptAll',
12
- /* data collection notice with do not sell */
13
- NoticeAndDoNotSell: 'NoticeAndDoNotSell',
14
- /* hidden */
15
- Hidden: 'Hidden',
16
- });
17
-
18
- /**
19
- * Type override
20
- */
21
- export type InitialViewState =
22
- typeof InitialViewState[keyof typeof InitialViewState];
23
-
24
- /**
25
- * Consent Manager view states that can be navigated to after initial view state
26
- */
27
- export const DeepViewState = makeEnum({
28
- /* expanded and showing full checkbox options */
29
- CompleteOptions: 'CompleteOptions',
30
- /* language options */
31
- LanguageOptions: 'LanguageOptions',
32
- });
33
-
34
- /**
35
- * Type override
36
- */
37
- export type DeepViewState = typeof DeepViewState[keyof typeof DeepViewState];
38
-
39
- /**
40
- * Consent Manager view states after it's been dismissed
41
- */
42
- export const DismissedViewState = makeEnum({
43
- /* showing and collapsed */
44
- Collapsed: 'Collapsed',
45
- /* closed */
46
- Closed: 'Closed',
47
- });
48
-
49
- /**
50
- * Type override
51
- */
52
- export type DismissedViewState =
53
- typeof DismissedViewState[keyof typeof DismissedViewState];
54
-
55
- /**
56
- * All possible view states of the Consent Manager
57
- */
58
- export const ViewState = {
59
- ...InitialViewState,
60
- ...DeepViewState,
61
- ...DismissedViewState,
62
- };
63
-
64
- /**
65
- * Type override
66
- */
67
- export type ViewState = InitialViewState | DeepViewState | DismissedViewState;
package/src/index.ts DELETED
@@ -1 +0,0 @@
1
- export * from './core';