@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 +76 -0
- package/dist/index.cjs +81 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +81 -2
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
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/
|
|
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;;;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;;;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,IAAIC,aAAA,EAAO;AAAA,IACnC;AAEA,IAAA,IAAI,MAAA,CAAO,iBAAiB,IAAA,EAAM;AAChC,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAIC,gCAAA,EAAmB;AAAA,IACnD;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EAAM;AACxB,MAAA,IAAA,CAAK,gBAAgB,IAAIC,WAAA;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,IAAIC,eAAA,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.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/
|
|
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.
|
|
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.
|
|
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",
|