@appbuildersph/core 0.0.1 → 0.0.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.
package/dist/index.cjs CHANGED
@@ -1,10 +1,14 @@
1
1
  'use strict';
2
2
 
3
+ var badge = require('@appbuildersph/badge');
4
+ var logger = require('@appbuildersph/logger');
5
+ var notifications = require('@appbuildersph/notifications');
6
+ var watcher = require('@appbuildersph/watcher');
3
7
  var crypto = require('crypto');
4
8
  var os = require('os');
5
9
  var shared = require('@appbuildersph/shared');
6
10
 
7
- // src/identity.ts
11
+ // src/app-builders.ts
8
12
  function createIdentitySnapshot(config) {
9
13
  const timestamp = shared.nowIso();
10
14
  const environment = config.environment ?? shared.resolveEnvironment();
@@ -27,15 +31,69 @@ function createIdentitySnapshot(config) {
27
31
  return { ...base, verificationHash };
28
32
  }
29
33
 
34
+ // src/hooks.ts
35
+ function createHookRegistry() {
36
+ const handlers = /* @__PURE__ */ new Map();
37
+ return {
38
+ register(event, handler) {
39
+ const existing = handlers.get(event);
40
+ if (existing) {
41
+ existing.push(handler);
42
+ } else {
43
+ handlers.set(event, [handler]);
44
+ }
45
+ },
46
+ emit(event, ...args) {
47
+ for (const handler of handlers.get(event) ?? []) {
48
+ handler(...args);
49
+ }
50
+ }
51
+ };
52
+ }
53
+
30
54
  // src/app-builders.ts
31
55
  var AppBuildersInstance = class {
32
56
  config;
33
57
  identitySnapshot = null;
58
+ loggerInstance = null;
59
+ notificationCenter = null;
60
+ watcherInstance = null;
61
+ badgeInstance = null;
62
+ hooks = createHookRegistry();
34
63
  constructor(config) {
35
64
  this.config = config;
36
65
  if (config.identity ?? true) {
37
66
  this.identitySnapshot = createIdentitySnapshot(config);
38
67
  }
68
+ if (config.logger ?? true) {
69
+ this.loggerInstance = new logger.Logger();
70
+ }
71
+ if (config.notifications ?? true) {
72
+ this.notificationCenter = new notifications.NotificationCenter();
73
+ }
74
+ if (config.badge ?? true) {
75
+ this.badgeInstance = new badge.Badge(
76
+ {
77
+ appName: config.appName,
78
+ organization: config.organization,
79
+ developer: config.developer,
80
+ environment: config.environment,
81
+ verified: this.identitySnapshot !== null
82
+ },
83
+ config.badge
84
+ );
85
+ this.badgeInstance.mount();
86
+ }
87
+ if (config.watcher) {
88
+ this.watcherInstance = new watcher.Watcher({
89
+ onIncident: (incident) => this.hooks.emit("incident", incident),
90
+ onMetrics: (snapshot) => this.hooks.emit("metrics", snapshot)
91
+ });
92
+ this.watcherInstance.start();
93
+ }
94
+ for (const plugin of config.plugins ?? []) {
95
+ plugin.setup({ config, registerHook: this.hooks.register });
96
+ }
39
97
  }
40
98
  identity() {
41
99
  return {
@@ -48,9 +106,25 @@ var AppBuildersInstance = class {
48
106
  export: () => JSON.stringify(this.identitySnapshot, null, 2)
49
107
  };
50
108
  }
109
+ logger() {
110
+ return this.loggerInstance;
111
+ }
112
+ notifications() {
113
+ return this.notificationCenter;
114
+ }
115
+ watcher() {
116
+ return this.watcherInstance;
117
+ }
118
+ badge() {
119
+ return this.badgeInstance;
120
+ }
51
121
  verify() {
52
122
  return this.identitySnapshot !== null;
53
123
  }
124
+ shutdown() {
125
+ this.watcherInstance?.stop();
126
+ this.badgeInstance?.unmount();
127
+ }
54
128
  };
55
129
  var instance = null;
56
130
  function init(config) {
@@ -68,7 +142,12 @@ function getInstance() {
68
142
  var AppBuilders = {
69
143
  init,
70
144
  verify: () => getInstance().verify(),
71
- identity: () => getInstance().identity()
145
+ identity: () => getInstance().identity(),
146
+ logger: () => getInstance().logger(),
147
+ notifications: () => getInstance().notifications(),
148
+ watcher: () => getInstance().watcher(),
149
+ badge: () => getInstance().badge(),
150
+ shutdown: () => getInstance().shutdown()
72
151
  };
73
152
 
74
153
  exports.AppBuilders = AppBuilders;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/identity.ts","../src/app-builders.ts","../src/index.ts"],"names":["nowIso","resolveEnvironment","randomUUID","hostname","createHash"],"mappings":";;;;;;;AAKO,SAAS,uBAAuB,MAAA,EAA6C;AAClF,EAAA,MAAM,YAAYA,aAAA,EAAO;AACzB,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,IAAeC,yBAAA,EAAmB;AAE7D,EAAA,MAAM,IAAA,GAAmD;AAAA,IACvD,SAASC,iBAAA,EAAW;AAAA,IACpB,aAAaA,iBAAA,EAAW;AAAA,IACxB,aAAa,MAAA,CAAO,SAAA;AAAA,IACpB,gBAAgB,MAAA,CAAO,YAAA;AAAA,IACvB,UAAUC,WAAA,EAAS;AAAA,IACnB,MAAA,EAAQ,QAAQ,GAAA,CAAI,kBAAA;AAAA,IACpB,WAAA;AAAA,IACA,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,QAAQ,GAAA,CAAI,qBAAA;AAAA,IACjD,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,QAAQ,GAAA,CAAI,qBAAA;AAAA,IACjD,WAAA,EAAa,QAAQ,GAAA,CAAI,YAAA;AAAA,IACzB,cAAA,EAAgB,QAAQ,GAAA,CAAI,mBAAA;AAAA,IAC5B,kBAAA,EAAoB,OAAA,CAAQ,GAAA,CAAI,MAAA,GAAS,QAAA,GAAW,MAAA;AAAA,IACpD;AAAA,GACF;AAEA,EAAA,MAAM,gBAAA,GAAmBC,iBAAA,CAAW,QAAQ,CAAA,CACzC,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAC3B,MAAA,CAAO,KAAK,CAAA;AAEf,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,gBAAA,EAAiB;AACrC;;;AC3BO,IAAM,sBAAN,MAA0B;AAAA,EACtB,MAAA;AAAA,EACD,gBAAA,GAA4C,IAAA;AAAA,EAEpD,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAI,MAAA,CAAO,YAAY,IAAA,EAAM;AAC3B,MAAA,IAAA,CAAK,gBAAA,GAAmB,uBAAuB,MAAM,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,MAA+B,IAAA,CAAK,gBAAA;AAAA,MACzC,SAAS,MAAwB;AAC/B,QAAA,IAAA,CAAK,gBAAA,GAAmB,sBAAA,CAAuB,IAAA,CAAK,MAAM,CAAA;AAC1D,QAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACd,CAAA;AAAA,MACA,MAAA,EAAQ,MAAe,IAAA,CAAK,gBAAA,KAAqB,IAAA;AAAA,MACjD,QAAQ,MAAc,IAAA,CAAK,UAAU,IAAA,CAAK,gBAAA,EAAkB,MAAM,CAAC;AAAA,KACrE;AAAA,EACF;AAAA,EAEA,MAAA,GAAkB;AAChB,IAAA,OAAO,KAAK,gBAAA,KAAqB,IAAA;AAAA,EACnC;AACF,CAAA;AAEA,IAAI,QAAA,GAAuC,IAAA;AAEpC,SAAS,KAAK,MAAA,EAAgD;AACnE,EAAA,QAAA,GAAW,IAAI,oBAAoB,MAAM,CAAA;AACzC,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,WAAA,GAAmC;AACjD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AC5CO,IAAM,WAAA,GAAc;AAAA,EACzB,IAAA;AAAA,EACA,MAAA,EAAQ,MAAM,WAAA,EAAY,CAAE,MAAA,EAAO;AAAA,EACnC,QAAA,EAAU,MAAM,WAAA,EAAY,CAAE,QAAA;AAChC","file":"index.cjs","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { hostname } from \"node:os\";\nimport type { AppBuildersConfig, IdentitySnapshot } from \"@appbuildersph/shared\";\nimport { nowIso, resolveEnvironment } from \"@appbuildersph/shared\";\n\nexport function createIdentitySnapshot(config: AppBuildersConfig): IdentitySnapshot {\n const timestamp = nowIso();\n const environment = config.environment ?? resolveEnvironment();\n\n const base: Omit<IdentitySnapshot, \"verificationHash\"> = {\n appUuid: randomUUID(),\n projectUuid: randomUUID(),\n developerId: config.developer,\n organizationId: config.organization,\n hostname: hostname(),\n domain: process.env.APPBUILDERS_DOMAIN,\n environment,\n gitCommit: process.env.GIT_COMMIT ?? process.env.VERCEL_GIT_COMMIT_SHA,\n gitBranch: process.env.GIT_BRANCH ?? process.env.VERCEL_GIT_COMMIT_REF,\n buildNumber: process.env.BUILD_NUMBER,\n packageVersion: process.env.npm_package_version,\n deploymentProvider: process.env.VERCEL ? \"vercel\" : undefined,\n timestamp,\n };\n\n const verificationHash = createHash(\"sha256\")\n .update(JSON.stringify(base))\n .digest(\"hex\");\n\n return { ...base, verificationHash };\n}\n","import type { AppBuildersConfig, IdentitySnapshot } from \"@appbuildersph/shared\";\nimport { createIdentitySnapshot } from \"./identity.js\";\n\nexport class AppBuildersInstance {\n readonly config: AppBuildersConfig;\n private identitySnapshot: IdentitySnapshot | null = null;\n\n constructor(config: AppBuildersConfig) {\n this.config = config;\n\n if (config.identity ?? true) {\n this.identitySnapshot = createIdentitySnapshot(config);\n }\n }\n\n identity() {\n return {\n get: (): IdentitySnapshot | null => this.identitySnapshot,\n refresh: (): IdentitySnapshot => {\n this.identitySnapshot = createIdentitySnapshot(this.config);\n return this.identitySnapshot;\n },\n verify: (): boolean => this.identitySnapshot !== null,\n export: (): string => JSON.stringify(this.identitySnapshot, null, 2),\n };\n }\n\n verify(): boolean {\n return this.identitySnapshot !== null;\n }\n}\n\nlet instance: AppBuildersInstance | null = null;\n\nexport function init(config: AppBuildersConfig): AppBuildersInstance {\n instance = new AppBuildersInstance(config);\n return instance;\n}\n\nexport function getInstance(): AppBuildersInstance {\n if (!instance) {\n throw new Error(\n \"@appbuildersph/core: AppBuilders.init() must be called before using the SDK.\",\n );\n }\n return instance;\n}\n","import { init, getInstance } from \"./app-builders.js\";\n\nexport const AppBuilders = {\n init,\n verify: () => getInstance().verify(),\n identity: () => getInstance().identity(),\n};\n\nexport type { AppBuildersInstance } from \"./app-builders.js\";\nexport * from \"@appbuildersph/shared\";\n"]}
1
+ {"version":3,"sources":["../src/identity.ts","../src/hooks.ts","../src/app-builders.ts","../src/index.ts"],"names":["nowIso","resolveEnvironment","randomUUID","hostname","createHash","Logger","NotificationCenter","Badge","Watcher"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { hostname } from \"node:os\";\nimport type { AppBuildersConfig, IdentitySnapshot } from \"@appbuildersph/shared\";\nimport { nowIso, resolveEnvironment } from \"@appbuildersph/shared\";\n\nexport function createIdentitySnapshot(config: AppBuildersConfig): IdentitySnapshot {\n const timestamp = nowIso();\n const environment = config.environment ?? resolveEnvironment();\n\n const base: Omit<IdentitySnapshot, \"verificationHash\"> = {\n appUuid: randomUUID(),\n projectUuid: randomUUID(),\n developerId: config.developer,\n organizationId: config.organization,\n hostname: hostname(),\n domain: process.env.APPBUILDERS_DOMAIN,\n environment,\n gitCommit: process.env.GIT_COMMIT ?? process.env.VERCEL_GIT_COMMIT_SHA,\n gitBranch: process.env.GIT_BRANCH ?? process.env.VERCEL_GIT_COMMIT_REF,\n buildNumber: process.env.BUILD_NUMBER,\n packageVersion: process.env.npm_package_version,\n deploymentProvider: process.env.VERCEL ? \"vercel\" : undefined,\n timestamp,\n };\n\n const verificationHash = createHash(\"sha256\")\n .update(JSON.stringify(base))\n .digest(\"hex\");\n\n return { ...base, verificationHash };\n}\n","export interface HookRegistry {\n register: (event: string, handler: (...args: unknown[]) => void) => void;\n emit: (event: string, ...args: unknown[]) => void;\n}\n\nexport function createHookRegistry(): HookRegistry {\n const handlers = new Map<string, Array<(...args: unknown[]) => void>>();\n\n return {\n register(event, handler) {\n const existing = handlers.get(event);\n if (existing) {\n existing.push(handler);\n } else {\n handlers.set(event, [handler]);\n }\n },\n emit(event, ...args) {\n for (const handler of handlers.get(event) ?? []) {\n handler(...args);\n }\n },\n };\n}\n","import type { AppBuildersConfig, IdentitySnapshot } from \"@appbuildersph/shared\";\nimport { Badge } from \"@appbuildersph/badge\";\nimport { Logger } from \"@appbuildersph/logger\";\nimport { NotificationCenter } from \"@appbuildersph/notifications\";\nimport { Watcher } from \"@appbuildersph/watcher\";\nimport { createIdentitySnapshot } from \"./identity.js\";\nimport { createHookRegistry } from \"./hooks.js\";\n\nexport class AppBuildersInstance {\n readonly config: AppBuildersConfig;\n private identitySnapshot: IdentitySnapshot | null = null;\n private readonly loggerInstance: Logger | null = null;\n private readonly notificationCenter: NotificationCenter | null = null;\n private readonly watcherInstance: Watcher | null = null;\n private readonly badgeInstance: Badge | null = null;\n private readonly hooks = createHookRegistry();\n\n constructor(config: AppBuildersConfig) {\n this.config = config;\n\n if (config.identity ?? true) {\n this.identitySnapshot = createIdentitySnapshot(config);\n }\n\n if (config.logger ?? true) {\n this.loggerInstance = new Logger();\n }\n\n if (config.notifications ?? true) {\n this.notificationCenter = new NotificationCenter();\n }\n\n if (config.badge ?? true) {\n this.badgeInstance = new Badge(\n {\n appName: config.appName,\n organization: config.organization,\n developer: config.developer,\n environment: config.environment,\n verified: this.identitySnapshot !== null,\n },\n config.badge,\n );\n this.badgeInstance.mount();\n }\n\n if (config.watcher) {\n this.watcherInstance = new Watcher({\n onIncident: (incident) => this.hooks.emit(\"incident\", incident),\n onMetrics: (snapshot) => this.hooks.emit(\"metrics\", snapshot),\n });\n this.watcherInstance.start();\n }\n\n for (const plugin of config.plugins ?? []) {\n plugin.setup({ config, registerHook: this.hooks.register });\n }\n }\n\n identity() {\n return {\n get: (): IdentitySnapshot | null => this.identitySnapshot,\n refresh: (): IdentitySnapshot => {\n this.identitySnapshot = createIdentitySnapshot(this.config);\n return this.identitySnapshot;\n },\n verify: (): boolean => this.identitySnapshot !== null,\n export: (): string => JSON.stringify(this.identitySnapshot, null, 2),\n };\n }\n\n logger(): Logger | null {\n return this.loggerInstance;\n }\n\n notifications(): NotificationCenter | null {\n return this.notificationCenter;\n }\n\n watcher(): Watcher | null {\n return this.watcherInstance;\n }\n\n badge(): Badge | null {\n return this.badgeInstance;\n }\n\n verify(): boolean {\n return this.identitySnapshot !== null;\n }\n\n shutdown(): void {\n this.watcherInstance?.stop();\n this.badgeInstance?.unmount();\n }\n}\n\nlet instance: AppBuildersInstance | null = null;\n\nexport function init(config: AppBuildersConfig): AppBuildersInstance {\n instance = new AppBuildersInstance(config);\n return instance;\n}\n\nexport function getInstance(): AppBuildersInstance {\n if (!instance) {\n throw new Error(\n \"@appbuildersph/core: AppBuilders.init() must be called before using the SDK.\",\n );\n }\n return instance;\n}\n","import { init, getInstance } from \"./app-builders.js\";\n\nexport const AppBuilders = {\n init,\n verify: () => getInstance().verify(),\n identity: () => getInstance().identity(),\n logger: () => getInstance().logger(),\n notifications: () => getInstance().notifications(),\n watcher: () => getInstance().watcher(),\n badge: () => getInstance().badge(),\n shutdown: () => getInstance().shutdown(),\n};\n\nexport type { AppBuildersInstance } from \"./app-builders.js\";\nexport * from \"@appbuildersph/shared\";\n"]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,11 @@
1
+ import * as _appbuildersph_badge from '@appbuildersph/badge';
2
+ import { Badge } from '@appbuildersph/badge';
3
+ import * as _appbuildersph_watcher from '@appbuildersph/watcher';
4
+ import { Watcher } from '@appbuildersph/watcher';
5
+ import * as _appbuildersph_notifications from '@appbuildersph/notifications';
6
+ import { NotificationCenter } from '@appbuildersph/notifications';
7
+ import * as _appbuildersph_logger from '@appbuildersph/logger';
8
+ import { Logger } from '@appbuildersph/logger';
1
9
  import * as _appbuildersph_shared from '@appbuildersph/shared';
2
10
  import { AppBuildersConfig, IdentitySnapshot } from '@appbuildersph/shared';
3
11
  export * from '@appbuildersph/shared';
@@ -5,6 +13,11 @@ export * from '@appbuildersph/shared';
5
13
  declare class AppBuildersInstance {
6
14
  readonly config: AppBuildersConfig;
7
15
  private identitySnapshot;
16
+ private readonly loggerInstance;
17
+ private readonly notificationCenter;
18
+ private readonly watcherInstance;
19
+ private readonly badgeInstance;
20
+ private readonly hooks;
8
21
  constructor(config: AppBuildersConfig);
9
22
  identity(): {
10
23
  get: () => IdentitySnapshot | null;
@@ -12,7 +25,12 @@ declare class AppBuildersInstance {
12
25
  verify: () => boolean;
13
26
  export: () => string;
14
27
  };
28
+ logger(): Logger | null;
29
+ notifications(): NotificationCenter | null;
30
+ watcher(): Watcher | null;
31
+ badge(): Badge | null;
15
32
  verify(): boolean;
33
+ shutdown(): void;
16
34
  }
17
35
  declare function init(config: AppBuildersConfig): AppBuildersInstance;
18
36
 
@@ -25,6 +43,11 @@ declare const AppBuilders: {
25
43
  verify: () => boolean;
26
44
  export: () => string;
27
45
  };
46
+ logger: () => _appbuildersph_logger.Logger | null;
47
+ notifications: () => _appbuildersph_notifications.NotificationCenter | null;
48
+ watcher: () => _appbuildersph_watcher.Watcher | null;
49
+ badge: () => _appbuildersph_badge.Badge | null;
50
+ shutdown: () => void;
28
51
  };
29
52
 
30
53
  export { AppBuilders, AppBuildersInstance };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,11 @@
1
+ import * as _appbuildersph_badge from '@appbuildersph/badge';
2
+ import { Badge } from '@appbuildersph/badge';
3
+ import * as _appbuildersph_watcher from '@appbuildersph/watcher';
4
+ import { Watcher } from '@appbuildersph/watcher';
5
+ import * as _appbuildersph_notifications from '@appbuildersph/notifications';
6
+ import { NotificationCenter } from '@appbuildersph/notifications';
7
+ import * as _appbuildersph_logger from '@appbuildersph/logger';
8
+ import { Logger } from '@appbuildersph/logger';
1
9
  import * as _appbuildersph_shared from '@appbuildersph/shared';
2
10
  import { AppBuildersConfig, IdentitySnapshot } from '@appbuildersph/shared';
3
11
  export * from '@appbuildersph/shared';
@@ -5,6 +13,11 @@ export * from '@appbuildersph/shared';
5
13
  declare class AppBuildersInstance {
6
14
  readonly config: AppBuildersConfig;
7
15
  private identitySnapshot;
16
+ private readonly loggerInstance;
17
+ private readonly notificationCenter;
18
+ private readonly watcherInstance;
19
+ private readonly badgeInstance;
20
+ private readonly hooks;
8
21
  constructor(config: AppBuildersConfig);
9
22
  identity(): {
10
23
  get: () => IdentitySnapshot | null;
@@ -12,7 +25,12 @@ declare class AppBuildersInstance {
12
25
  verify: () => boolean;
13
26
  export: () => string;
14
27
  };
28
+ logger(): Logger | null;
29
+ notifications(): NotificationCenter | null;
30
+ watcher(): Watcher | null;
31
+ badge(): Badge | null;
15
32
  verify(): boolean;
33
+ shutdown(): void;
16
34
  }
17
35
  declare function init(config: AppBuildersConfig): AppBuildersInstance;
18
36
 
@@ -25,6 +43,11 @@ declare const AppBuilders: {
25
43
  verify: () => boolean;
26
44
  export: () => string;
27
45
  };
46
+ logger: () => _appbuildersph_logger.Logger | null;
47
+ notifications: () => _appbuildersph_notifications.NotificationCenter | null;
48
+ watcher: () => _appbuildersph_watcher.Watcher | null;
49
+ badge: () => _appbuildersph_badge.Badge | null;
50
+ shutdown: () => void;
28
51
  };
29
52
 
30
53
  export { AppBuilders, AppBuildersInstance };
package/dist/index.js CHANGED
@@ -1,9 +1,13 @@
1
+ import { Badge } from '@appbuildersph/badge';
2
+ import { Logger } from '@appbuildersph/logger';
3
+ import { NotificationCenter } from '@appbuildersph/notifications';
4
+ import { Watcher } from '@appbuildersph/watcher';
1
5
  import { randomUUID, createHash } from 'crypto';
2
6
  import { hostname } from 'os';
3
7
  import { nowIso, resolveEnvironment } from '@appbuildersph/shared';
4
8
  export * from '@appbuildersph/shared';
5
9
 
6
- // src/identity.ts
10
+ // src/app-builders.ts
7
11
  function createIdentitySnapshot(config) {
8
12
  const timestamp = nowIso();
9
13
  const environment = config.environment ?? resolveEnvironment();
@@ -26,15 +30,69 @@ function createIdentitySnapshot(config) {
26
30
  return { ...base, verificationHash };
27
31
  }
28
32
 
33
+ // src/hooks.ts
34
+ function createHookRegistry() {
35
+ const handlers = /* @__PURE__ */ new Map();
36
+ return {
37
+ register(event, handler) {
38
+ const existing = handlers.get(event);
39
+ if (existing) {
40
+ existing.push(handler);
41
+ } else {
42
+ handlers.set(event, [handler]);
43
+ }
44
+ },
45
+ emit(event, ...args) {
46
+ for (const handler of handlers.get(event) ?? []) {
47
+ handler(...args);
48
+ }
49
+ }
50
+ };
51
+ }
52
+
29
53
  // src/app-builders.ts
30
54
  var AppBuildersInstance = class {
31
55
  config;
32
56
  identitySnapshot = null;
57
+ loggerInstance = null;
58
+ notificationCenter = null;
59
+ watcherInstance = null;
60
+ badgeInstance = null;
61
+ hooks = createHookRegistry();
33
62
  constructor(config) {
34
63
  this.config = config;
35
64
  if (config.identity ?? true) {
36
65
  this.identitySnapshot = createIdentitySnapshot(config);
37
66
  }
67
+ if (config.logger ?? true) {
68
+ this.loggerInstance = new Logger();
69
+ }
70
+ if (config.notifications ?? true) {
71
+ this.notificationCenter = new NotificationCenter();
72
+ }
73
+ if (config.badge ?? true) {
74
+ this.badgeInstance = new Badge(
75
+ {
76
+ appName: config.appName,
77
+ organization: config.organization,
78
+ developer: config.developer,
79
+ environment: config.environment,
80
+ verified: this.identitySnapshot !== null
81
+ },
82
+ config.badge
83
+ );
84
+ this.badgeInstance.mount();
85
+ }
86
+ if (config.watcher) {
87
+ this.watcherInstance = new Watcher({
88
+ onIncident: (incident) => this.hooks.emit("incident", incident),
89
+ onMetrics: (snapshot) => this.hooks.emit("metrics", snapshot)
90
+ });
91
+ this.watcherInstance.start();
92
+ }
93
+ for (const plugin of config.plugins ?? []) {
94
+ plugin.setup({ config, registerHook: this.hooks.register });
95
+ }
38
96
  }
39
97
  identity() {
40
98
  return {
@@ -47,9 +105,25 @@ var AppBuildersInstance = class {
47
105
  export: () => JSON.stringify(this.identitySnapshot, null, 2)
48
106
  };
49
107
  }
108
+ logger() {
109
+ return this.loggerInstance;
110
+ }
111
+ notifications() {
112
+ return this.notificationCenter;
113
+ }
114
+ watcher() {
115
+ return this.watcherInstance;
116
+ }
117
+ badge() {
118
+ return this.badgeInstance;
119
+ }
50
120
  verify() {
51
121
  return this.identitySnapshot !== null;
52
122
  }
123
+ shutdown() {
124
+ this.watcherInstance?.stop();
125
+ this.badgeInstance?.unmount();
126
+ }
53
127
  };
54
128
  var instance = null;
55
129
  function init(config) {
@@ -67,7 +141,12 @@ function getInstance() {
67
141
  var AppBuilders = {
68
142
  init,
69
143
  verify: () => getInstance().verify(),
70
- identity: () => getInstance().identity()
144
+ identity: () => getInstance().identity(),
145
+ logger: () => getInstance().logger(),
146
+ notifications: () => getInstance().notifications(),
147
+ watcher: () => getInstance().watcher(),
148
+ badge: () => getInstance().badge(),
149
+ shutdown: () => getInstance().shutdown()
71
150
  };
72
151
 
73
152
  export { AppBuilders };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/identity.ts","../src/app-builders.ts","../src/index.ts"],"names":[],"mappings":";;;;;;AAKO,SAAS,uBAAuB,MAAA,EAA6C;AAClF,EAAA,MAAM,YAAY,MAAA,EAAO;AACzB,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,kBAAA,EAAmB;AAE7D,EAAA,MAAM,IAAA,GAAmD;AAAA,IACvD,SAAS,UAAA,EAAW;AAAA,IACpB,aAAa,UAAA,EAAW;AAAA,IACxB,aAAa,MAAA,CAAO,SAAA;AAAA,IACpB,gBAAgB,MAAA,CAAO,YAAA;AAAA,IACvB,UAAU,QAAA,EAAS;AAAA,IACnB,MAAA,EAAQ,QAAQ,GAAA,CAAI,kBAAA;AAAA,IACpB,WAAA;AAAA,IACA,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,QAAQ,GAAA,CAAI,qBAAA;AAAA,IACjD,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,QAAQ,GAAA,CAAI,qBAAA;AAAA,IACjD,WAAA,EAAa,QAAQ,GAAA,CAAI,YAAA;AAAA,IACzB,cAAA,EAAgB,QAAQ,GAAA,CAAI,mBAAA;AAAA,IAC5B,kBAAA,EAAoB,OAAA,CAAQ,GAAA,CAAI,MAAA,GAAS,QAAA,GAAW,MAAA;AAAA,IACpD;AAAA,GACF;AAEA,EAAA,MAAM,gBAAA,GAAmB,UAAA,CAAW,QAAQ,CAAA,CACzC,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAC3B,MAAA,CAAO,KAAK,CAAA;AAEf,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,gBAAA,EAAiB;AACrC;;;AC3BO,IAAM,sBAAN,MAA0B;AAAA,EACtB,MAAA;AAAA,EACD,gBAAA,GAA4C,IAAA;AAAA,EAEpD,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAI,MAAA,CAAO,YAAY,IAAA,EAAM;AAC3B,MAAA,IAAA,CAAK,gBAAA,GAAmB,uBAAuB,MAAM,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,MAA+B,IAAA,CAAK,gBAAA;AAAA,MACzC,SAAS,MAAwB;AAC/B,QAAA,IAAA,CAAK,gBAAA,GAAmB,sBAAA,CAAuB,IAAA,CAAK,MAAM,CAAA;AAC1D,QAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACd,CAAA;AAAA,MACA,MAAA,EAAQ,MAAe,IAAA,CAAK,gBAAA,KAAqB,IAAA;AAAA,MACjD,QAAQ,MAAc,IAAA,CAAK,UAAU,IAAA,CAAK,gBAAA,EAAkB,MAAM,CAAC;AAAA,KACrE;AAAA,EACF;AAAA,EAEA,MAAA,GAAkB;AAChB,IAAA,OAAO,KAAK,gBAAA,KAAqB,IAAA;AAAA,EACnC;AACF,CAAA;AAEA,IAAI,QAAA,GAAuC,IAAA;AAEpC,SAAS,KAAK,MAAA,EAAgD;AACnE,EAAA,QAAA,GAAW,IAAI,oBAAoB,MAAM,CAAA;AACzC,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,WAAA,GAAmC;AACjD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AC5CO,IAAM,WAAA,GAAc;AAAA,EACzB,IAAA;AAAA,EACA,MAAA,EAAQ,MAAM,WAAA,EAAY,CAAE,MAAA,EAAO;AAAA,EACnC,QAAA,EAAU,MAAM,WAAA,EAAY,CAAE,QAAA;AAChC","file":"index.js","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { hostname } from \"node:os\";\nimport type { AppBuildersConfig, IdentitySnapshot } from \"@appbuildersph/shared\";\nimport { nowIso, resolveEnvironment } from \"@appbuildersph/shared\";\n\nexport function createIdentitySnapshot(config: AppBuildersConfig): IdentitySnapshot {\n const timestamp = nowIso();\n const environment = config.environment ?? resolveEnvironment();\n\n const base: Omit<IdentitySnapshot, \"verificationHash\"> = {\n appUuid: randomUUID(),\n projectUuid: randomUUID(),\n developerId: config.developer,\n organizationId: config.organization,\n hostname: hostname(),\n domain: process.env.APPBUILDERS_DOMAIN,\n environment,\n gitCommit: process.env.GIT_COMMIT ?? process.env.VERCEL_GIT_COMMIT_SHA,\n gitBranch: process.env.GIT_BRANCH ?? process.env.VERCEL_GIT_COMMIT_REF,\n buildNumber: process.env.BUILD_NUMBER,\n packageVersion: process.env.npm_package_version,\n deploymentProvider: process.env.VERCEL ? \"vercel\" : undefined,\n timestamp,\n };\n\n const verificationHash = createHash(\"sha256\")\n .update(JSON.stringify(base))\n .digest(\"hex\");\n\n return { ...base, verificationHash };\n}\n","import type { AppBuildersConfig, IdentitySnapshot } from \"@appbuildersph/shared\";\nimport { createIdentitySnapshot } from \"./identity.js\";\n\nexport class AppBuildersInstance {\n readonly config: AppBuildersConfig;\n private identitySnapshot: IdentitySnapshot | null = null;\n\n constructor(config: AppBuildersConfig) {\n this.config = config;\n\n if (config.identity ?? true) {\n this.identitySnapshot = createIdentitySnapshot(config);\n }\n }\n\n identity() {\n return {\n get: (): IdentitySnapshot | null => this.identitySnapshot,\n refresh: (): IdentitySnapshot => {\n this.identitySnapshot = createIdentitySnapshot(this.config);\n return this.identitySnapshot;\n },\n verify: (): boolean => this.identitySnapshot !== null,\n export: (): string => JSON.stringify(this.identitySnapshot, null, 2),\n };\n }\n\n verify(): boolean {\n return this.identitySnapshot !== null;\n }\n}\n\nlet instance: AppBuildersInstance | null = null;\n\nexport function init(config: AppBuildersConfig): AppBuildersInstance {\n instance = new AppBuildersInstance(config);\n return instance;\n}\n\nexport function getInstance(): AppBuildersInstance {\n if (!instance) {\n throw new Error(\n \"@appbuildersph/core: AppBuilders.init() must be called before using the SDK.\",\n );\n }\n return instance;\n}\n","import { init, getInstance } from \"./app-builders.js\";\n\nexport const AppBuilders = {\n init,\n verify: () => getInstance().verify(),\n identity: () => getInstance().identity(),\n};\n\nexport type { AppBuildersInstance } from \"./app-builders.js\";\nexport * from \"@appbuildersph/shared\";\n"]}
1
+ {"version":3,"sources":["../src/identity.ts","../src/hooks.ts","../src/app-builders.ts","../src/index.ts"],"names":[],"mappings":";;;;;;;;;;AAKO,SAAS,uBAAuB,MAAA,EAA6C;AAClF,EAAA,MAAM,YAAY,MAAA,EAAO;AACzB,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,kBAAA,EAAmB;AAE7D,EAAA,MAAM,IAAA,GAAmD;AAAA,IACvD,SAAS,UAAA,EAAW;AAAA,IACpB,aAAa,UAAA,EAAW;AAAA,IACxB,aAAa,MAAA,CAAO,SAAA;AAAA,IACpB,gBAAgB,MAAA,CAAO,YAAA;AAAA,IACvB,UAAU,QAAA,EAAS;AAAA,IACnB,MAAA,EAAQ,QAAQ,GAAA,CAAI,kBAAA;AAAA,IACpB,WAAA;AAAA,IACA,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,QAAQ,GAAA,CAAI,qBAAA;AAAA,IACjD,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,QAAQ,GAAA,CAAI,qBAAA;AAAA,IACjD,WAAA,EAAa,QAAQ,GAAA,CAAI,YAAA;AAAA,IACzB,cAAA,EAAgB,QAAQ,GAAA,CAAI,mBAAA;AAAA,IAC5B,kBAAA,EAAoB,OAAA,CAAQ,GAAA,CAAI,MAAA,GAAS,QAAA,GAAW,MAAA;AAAA,IACpD;AAAA,GACF;AAEA,EAAA,MAAM,gBAAA,GAAmB,UAAA,CAAW,QAAQ,CAAA,CACzC,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAC3B,MAAA,CAAO,KAAK,CAAA;AAEf,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,gBAAA,EAAiB;AACrC;;;ACzBO,SAAS,kBAAA,GAAmC;AACjD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAiD;AAEtE,EAAA,OAAO;AAAA,IACL,QAAA,CAAS,OAAO,OAAA,EAAS;AACvB,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACnC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,CAAC,OAAO,CAAC,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA,IAAA,CAAK,UAAU,IAAA,EAAM;AACnB,MAAA,KAAA,MAAW,WAAW,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,IAAK,EAAC,EAAG;AAC/C,QAAA,OAAA,CAAQ,GAAG,IAAI,CAAA;AAAA,MACjB;AAAA,IACF;AAAA,GACF;AACF;;;ACfO,IAAM,sBAAN,MAA0B;AAAA,EACtB,MAAA;AAAA,EACD,gBAAA,GAA4C,IAAA;AAAA,EACnC,cAAA,GAAgC,IAAA;AAAA,EAChC,kBAAA,GAAgD,IAAA;AAAA,EAChD,eAAA,GAAkC,IAAA;AAAA,EAClC,aAAA,GAA8B,IAAA;AAAA,EAC9B,QAAQ,kBAAA,EAAmB;AAAA,EAE5C,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAI,MAAA,CAAO,YAAY,IAAA,EAAM;AAC3B,MAAA,IAAA,CAAK,gBAAA,GAAmB,uBAAuB,MAAM,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,MAAA,CAAO,UAAU,IAAA,EAAM;AACzB,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,MAAA,EAAO;AAAA,IACnC;AAEA,IAAA,IAAI,MAAA,CAAO,iBAAiB,IAAA,EAAM;AAChC,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAI,kBAAA,EAAmB;AAAA,IACnD;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EAAM;AACxB,MAAA,IAAA,CAAK,gBAAgB,IAAI,KAAA;AAAA,QACvB;AAAA,UACE,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,cAAc,MAAA,CAAO,YAAA;AAAA,UACrB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,QAAA,EAAU,KAAK,gBAAA,KAAqB;AAAA,SACtC;AAAA,QACA,MAAA,CAAO;AAAA,OACT;AACA,MAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,IAC3B;AAEA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,OAAA,CAAQ;AAAA,QACjC,YAAY,CAAC,QAAA,KAAa,KAAK,KAAA,CAAM,IAAA,CAAK,YAAY,QAAQ,CAAA;AAAA,QAC9D,WAAW,CAAC,QAAA,KAAa,KAAK,KAAA,CAAM,IAAA,CAAK,WAAW,QAAQ;AAAA,OAC7D,CAAA;AACD,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,IAC7B;AAEA,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG;AACzC,MAAA,MAAA,CAAO,MAAM,EAAE,MAAA,EAAQ,cAAc,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,MAA+B,IAAA,CAAK,gBAAA;AAAA,MACzC,SAAS,MAAwB;AAC/B,QAAA,IAAA,CAAK,gBAAA,GAAmB,sBAAA,CAAuB,IAAA,CAAK,MAAM,CAAA;AAC1D,QAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACd,CAAA;AAAA,MACA,MAAA,EAAQ,MAAe,IAAA,CAAK,gBAAA,KAAqB,IAAA;AAAA,MACjD,QAAQ,MAAc,IAAA,CAAK,UAAU,IAAA,CAAK,gBAAA,EAAkB,MAAM,CAAC;AAAA,KACrE;AAAA,EACF;AAAA,EAEA,MAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,aAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA,EAEA,OAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,MAAA,GAAkB;AAChB,IAAA,OAAO,KAAK,gBAAA,KAAqB,IAAA;AAAA,EACnC;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,iBAAiB,IAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,eAAe,OAAA,EAAQ;AAAA,EAC9B;AACF,CAAA;AAEA,IAAI,QAAA,GAAuC,IAAA;AAEpC,SAAS,KAAK,MAAA,EAAgD;AACnE,EAAA,QAAA,GAAW,IAAI,oBAAoB,MAAM,CAAA;AACzC,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,WAAA,GAAmC;AACjD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AC7GO,IAAM,WAAA,GAAc;AAAA,EACzB,IAAA;AAAA,EACA,MAAA,EAAQ,MAAM,WAAA,EAAY,CAAE,MAAA,EAAO;AAAA,EACnC,QAAA,EAAU,MAAM,WAAA,EAAY,CAAE,QAAA,EAAS;AAAA,EACvC,MAAA,EAAQ,MAAM,WAAA,EAAY,CAAE,MAAA,EAAO;AAAA,EACnC,aAAA,EAAe,MAAM,WAAA,EAAY,CAAE,aAAA,EAAc;AAAA,EACjD,OAAA,EAAS,MAAM,WAAA,EAAY,CAAE,OAAA,EAAQ;AAAA,EACrC,KAAA,EAAO,MAAM,WAAA,EAAY,CAAE,KAAA,EAAM;AAAA,EACjC,QAAA,EAAU,MAAM,WAAA,EAAY,CAAE,QAAA;AAChC","file":"index.js","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { hostname } from \"node:os\";\nimport type { AppBuildersConfig, IdentitySnapshot } from \"@appbuildersph/shared\";\nimport { nowIso, resolveEnvironment } from \"@appbuildersph/shared\";\n\nexport function createIdentitySnapshot(config: AppBuildersConfig): IdentitySnapshot {\n const timestamp = nowIso();\n const environment = config.environment ?? resolveEnvironment();\n\n const base: Omit<IdentitySnapshot, \"verificationHash\"> = {\n appUuid: randomUUID(),\n projectUuid: randomUUID(),\n developerId: config.developer,\n organizationId: config.organization,\n hostname: hostname(),\n domain: process.env.APPBUILDERS_DOMAIN,\n environment,\n gitCommit: process.env.GIT_COMMIT ?? process.env.VERCEL_GIT_COMMIT_SHA,\n gitBranch: process.env.GIT_BRANCH ?? process.env.VERCEL_GIT_COMMIT_REF,\n buildNumber: process.env.BUILD_NUMBER,\n packageVersion: process.env.npm_package_version,\n deploymentProvider: process.env.VERCEL ? \"vercel\" : undefined,\n timestamp,\n };\n\n const verificationHash = createHash(\"sha256\")\n .update(JSON.stringify(base))\n .digest(\"hex\");\n\n return { ...base, verificationHash };\n}\n","export interface HookRegistry {\n register: (event: string, handler: (...args: unknown[]) => void) => void;\n emit: (event: string, ...args: unknown[]) => void;\n}\n\nexport function createHookRegistry(): HookRegistry {\n const handlers = new Map<string, Array<(...args: unknown[]) => void>>();\n\n return {\n register(event, handler) {\n const existing = handlers.get(event);\n if (existing) {\n existing.push(handler);\n } else {\n handlers.set(event, [handler]);\n }\n },\n emit(event, ...args) {\n for (const handler of handlers.get(event) ?? []) {\n handler(...args);\n }\n },\n };\n}\n","import type { AppBuildersConfig, IdentitySnapshot } from \"@appbuildersph/shared\";\nimport { Badge } from \"@appbuildersph/badge\";\nimport { Logger } from \"@appbuildersph/logger\";\nimport { NotificationCenter } from \"@appbuildersph/notifications\";\nimport { Watcher } from \"@appbuildersph/watcher\";\nimport { createIdentitySnapshot } from \"./identity.js\";\nimport { createHookRegistry } from \"./hooks.js\";\n\nexport class AppBuildersInstance {\n readonly config: AppBuildersConfig;\n private identitySnapshot: IdentitySnapshot | null = null;\n private readonly loggerInstance: Logger | null = null;\n private readonly notificationCenter: NotificationCenter | null = null;\n private readonly watcherInstance: Watcher | null = null;\n private readonly badgeInstance: Badge | null = null;\n private readonly hooks = createHookRegistry();\n\n constructor(config: AppBuildersConfig) {\n this.config = config;\n\n if (config.identity ?? true) {\n this.identitySnapshot = createIdentitySnapshot(config);\n }\n\n if (config.logger ?? true) {\n this.loggerInstance = new Logger();\n }\n\n if (config.notifications ?? true) {\n this.notificationCenter = new NotificationCenter();\n }\n\n if (config.badge ?? true) {\n this.badgeInstance = new Badge(\n {\n appName: config.appName,\n organization: config.organization,\n developer: config.developer,\n environment: config.environment,\n verified: this.identitySnapshot !== null,\n },\n config.badge,\n );\n this.badgeInstance.mount();\n }\n\n if (config.watcher) {\n this.watcherInstance = new Watcher({\n onIncident: (incident) => this.hooks.emit(\"incident\", incident),\n onMetrics: (snapshot) => this.hooks.emit(\"metrics\", snapshot),\n });\n this.watcherInstance.start();\n }\n\n for (const plugin of config.plugins ?? []) {\n plugin.setup({ config, registerHook: this.hooks.register });\n }\n }\n\n identity() {\n return {\n get: (): IdentitySnapshot | null => this.identitySnapshot,\n refresh: (): IdentitySnapshot => {\n this.identitySnapshot = createIdentitySnapshot(this.config);\n return this.identitySnapshot;\n },\n verify: (): boolean => this.identitySnapshot !== null,\n export: (): string => JSON.stringify(this.identitySnapshot, null, 2),\n };\n }\n\n logger(): Logger | null {\n return this.loggerInstance;\n }\n\n notifications(): NotificationCenter | null {\n return this.notificationCenter;\n }\n\n watcher(): Watcher | null {\n return this.watcherInstance;\n }\n\n badge(): Badge | null {\n return this.badgeInstance;\n }\n\n verify(): boolean {\n return this.identitySnapshot !== null;\n }\n\n shutdown(): void {\n this.watcherInstance?.stop();\n this.badgeInstance?.unmount();\n }\n}\n\nlet instance: AppBuildersInstance | null = null;\n\nexport function init(config: AppBuildersConfig): AppBuildersInstance {\n instance = new AppBuildersInstance(config);\n return instance;\n}\n\nexport function getInstance(): AppBuildersInstance {\n if (!instance) {\n throw new Error(\n \"@appbuildersph/core: AppBuilders.init() must be called before using the SDK.\",\n );\n }\n return instance;\n}\n","import { init, getInstance } from \"./app-builders.js\";\n\nexport const AppBuilders = {\n init,\n verify: () => getInstance().verify(),\n identity: () => getInstance().identity(),\n logger: () => getInstance().logger(),\n notifications: () => getInstance().notifications(),\n watcher: () => getInstance().watcher(),\n badge: () => getInstance().badge(),\n shutdown: () => getInstance().shutdown(),\n};\n\nexport type { AppBuildersInstance } from \"./app-builders.js\";\nexport * from \"@appbuildersph/shared\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appbuildersph/core",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "The Trust, Identity, Monitoring & AI SDK for Modern Applications.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -17,7 +17,11 @@
17
17
  "dist"
18
18
  ],
19
19
  "dependencies": {
20
- "@appbuildersph/shared": "0.0.1"
20
+ "@appbuildersph/shared": "0.0.2",
21
+ "@appbuildersph/notifications": "0.0.2",
22
+ "@appbuildersph/badge": "0.1.0",
23
+ "@appbuildersph/watcher": "0.0.2",
24
+ "@appbuildersph/logger": "0.0.2"
21
25
  },
22
26
  "devDependencies": {
23
27
  "tsup": "^8.3.5",