@appbuildersph/core 0.0.1 → 0.0.3

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/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # @appbuildersph/core
2
+
3
+ The Trust, Identity, Monitoring & AI SDK for Modern Applications — a single
4
+ `AppBuilders.init()` call wires up identity, logging, notifications, the
5
+ verified badge, and (opt-in) app health watching.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @appbuildersph/core
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```ts
16
+ import { AppBuilders } from "@appbuildersph/core";
17
+
18
+ AppBuilders.init({
19
+ appName: "My App",
20
+ organization: "Acme Inc",
21
+ developer: "jane@acme.com",
22
+ environment: "production", // defaults to NODE_ENV-derived value
23
+
24
+ // feature flags — see table below for defaults
25
+ identity: true,
26
+ logger: true,
27
+ notifications: true,
28
+ badge: true,
29
+ watcher: false,
30
+
31
+ plugins: [
32
+ {
33
+ name: "my-plugin",
34
+ setup: ({ config, registerHook }) => {
35
+ registerHook("incident", (incident) => console.error("incident!", incident));
36
+ },
37
+ },
38
+ ],
39
+ });
40
+
41
+ AppBuilders.verify(); // true once identity is generated
42
+ AppBuilders.identity().get(); // IdentitySnapshot | null
43
+ AppBuilders.logger()?.info("server started");
44
+ await AppBuilders.notifications()?.success("Deployed", "v1.2.3 is live");
45
+ AppBuilders.badge(); // Badge | null — auto-mounted on init() in a browser
46
+ AppBuilders.watcher()?.health(); // only non-null if `watcher: true` (auto-started)
47
+
48
+ AppBuilders.shutdown(); // stops the watcher and unmounts the badge
49
+ ```
50
+
51
+ ## Feature flags
52
+
53
+ | Config key | Default | Package |
54
+ | ---------------- | ------- | ----------------------------------------------- |
55
+ | `identity` | `true` | built-in (application identity + verification hash) |
56
+ | `logger` | `true` | [`@appbuildersph/logger`](../logger) |
57
+ | `notifications` | `true` | [`@appbuildersph/notifications`](../notifications) |
58
+ | `badge` | `true` | [`@appbuildersph/badge`](../badge) |
59
+ | `watcher` | `false` | [`@appbuildersph/watcher`](../watcher) — opt-in since it starts an interval timer and installs process crash hooks |
60
+
61
+ Each accessor (`logger()`, `notifications()`, `badge()`, `watcher()`) returns
62
+ `null` if its flag is disabled — always guard with `?.` or a null check.
63
+
64
+ ## Plugins
65
+
66
+ `plugins` is a list of `{ name, setup(ctx) }` objects run once during
67
+ `init()`. `ctx.registerHook(event, handler)` subscribes to internal events —
68
+ currently `"incident"` and `"metrics"`, both emitted by the watcher when
69
+ enabled.
70
+
71
+ ## Identity
72
+
73
+ Every app gets a signed `IdentitySnapshot` (uuid, org/developer, environment,
74
+ git commit/branch, hostname, a SHA-256 verification hash) unless
75
+ `identity: false`. See `AppBuilders.identity()` for `get()`, `refresh()`,
76
+ `verify()`, and `export()` (JSON string).
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":"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","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.3",
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.3",
21
+ "@appbuildersph/badge": "0.1.1",
22
+ "@appbuildersph/watcher": "0.0.3",
23
+ "@appbuildersph/notifications": "0.0.3",
24
+ "@appbuildersph/logger": "0.0.3"
21
25
  },
22
26
  "devDependencies": {
23
27
  "tsup": "^8.3.5",