@sentry/junior 0.16.0 → 0.17.0

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.
@@ -5,7 +5,7 @@ import {
5
5
  getPluginSkillRoots,
6
6
  logInfo,
7
7
  logWarn
8
- } from "./chunk-RUC2V7Q7.js";
8
+ } from "./chunk-DTOS5CG4.js";
9
9
  import {
10
10
  skillRoots
11
11
  } from "./chunk-RBB2MZAN.js";
@@ -47,7 +47,7 @@ var LEGACY_KEY_MAP = {
47
47
  steps: "app.ai.steps",
48
48
  toolCalls: "app.ai.tool_calls",
49
49
  toolResults: "app.ai.tool_results",
50
- finishReason: "app.ai.finish_reason",
50
+ finishReason: "gen_ai.response.finish_reasons",
51
51
  sources: "app.ai.sources",
52
52
  generatedFiles: "app.ai.generated_files",
53
53
  resultFiles: "app.ai.result_files",
@@ -301,7 +301,9 @@ function mergeAttributes(...maps) {
301
301
  if (!map) continue;
302
302
  for (const [rawKey, rawValue] of Object.entries(map)) {
303
303
  const key = normalizeAttributeKey(rawKey);
304
- const value = sanitizeValue(rawValue);
304
+ const value = sanitizeValue(
305
+ key === "gen_ai.response.finish_reasons" && typeof rawValue === "string" && rawValue.trim() ? [rawValue] : rawValue
306
+ );
305
307
  if (value !== void 0) {
306
308
  merged[key] = value;
307
309
  }
@@ -2,7 +2,7 @@ import {
2
2
  getPluginRuntimeDependencies,
3
3
  getPluginRuntimePostinstall,
4
4
  withSpan
5
- } from "./chunk-RUC2V7Q7.js";
5
+ } from "./chunk-DTOS5CG4.js";
6
6
 
7
7
  // src/chat/state/adapter.ts
8
8
  import { createMemoryState } from "@chat-adapter/state-memory";
package/dist/cli/check.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  parseSkillFile
3
- } from "../chunk-ZU6X5ZGL.js";
3
+ } from "../chunk-4XWTSMRF.js";
4
4
  import {
5
5
  parsePluginManifest
6
- } from "../chunk-RUC2V7Q7.js";
6
+ } from "../chunk-DTOS5CG4.js";
7
7
  import "../chunk-Z3YD6NHK.js";
8
8
  import "../chunk-RBB2MZAN.js";
9
9
  import "../chunk-2KG3PWR4.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  disconnectStateAdapter,
3
3
  resolveRuntimeDependencySnapshot
4
- } from "../chunk-3JKW7ISL.js";
4
+ } from "../chunk-XYOKYK6U.js";
5
5
  import {
6
6
  getPluginProviders,
7
7
  getPluginRuntimeDependencies,
8
8
  getPluginRuntimePostinstall
9
- } from "../chunk-RUC2V7Q7.js";
9
+ } from "../chunk-DTOS5CG4.js";
10
10
  import "../chunk-Z3YD6NHK.js";
11
11
  import "../chunk-RBB2MZAN.js";
12
12
  import "../chunk-2KG3PWR4.js";
package/dist/nitro.js CHANGED
@@ -4,56 +4,62 @@ import {
4
4
  import "./chunk-2KG3PWR4.js";
5
5
 
6
6
  // src/nitro.ts
7
- import { cpSync, existsSync, mkdirSync, readdirSync } from "fs";
7
+ import path3 from "path";
8
+
9
+ // src/build/rolldown-workarounds.ts
10
+ function applyRolldownTreeshakeWorkaround(nitro) {
11
+ nitro.options.rolldownConfig = {
12
+ ...nitro.options.rolldownConfig,
13
+ treeshake: {
14
+ ...nitro.options.rolldownConfig?.treeshake,
15
+ moduleSideEffects: true
16
+ }
17
+ };
18
+ }
19
+
20
+ // src/build/copy-build-content.ts
21
+ import { cpSync, existsSync as existsSync2, mkdirSync, readdirSync } from "fs";
22
+ import path2 from "path";
23
+
24
+ // src/build/glob-to-regex.ts
25
+ function globToRegex(pattern) {
26
+ const escaped = pattern.replace(/[\\^$+?.()|[\]{}]/g, "\\$&").replace(/\*/g, ".*");
27
+ return new RegExp(`^${escaped}$`);
28
+ }
29
+
30
+ // src/build/resolve-package.ts
31
+ import { existsSync } from "fs";
8
32
  import path from "path";
9
33
  import { fileURLToPath } from "url";
10
- function juniorNitro(options = {}) {
11
- return {
12
- nitro: {
13
- setup(nitro) {
14
- const cwd = path.resolve(
15
- options.cwd ?? nitro.options.rootDir ?? process.cwd()
16
- );
17
- nitro.options.vercel ??= {};
18
- nitro.options.vercel.functions ??= {};
19
- nitro.options.vercel.functions.maxDuration ??= options.maxDuration ?? 800;
20
- nitro.options.rolldownConfig = {
21
- ...nitro.options.rolldownConfig,
22
- treeshake: {
23
- ...nitro.options.rolldownConfig?.treeshake,
24
- moduleSideEffects: true
25
- }
26
- };
27
- nitro.options.virtual["#junior/config"] = `export const pluginPackages = ${JSON.stringify(options.pluginPackages ?? [])};`;
28
- nitro.hooks.hook("compiled", () => {
29
- copyAppAndPluginContent(
30
- cwd,
31
- nitro.options.output.serverDir,
32
- options.pluginPackages
33
- );
34
- copyIncludedFiles(
35
- nitro.options.output.serverDir,
36
- options.includeFiles
37
- );
38
- });
39
- }
34
+ function resolvePackageDir(pkgName) {
35
+ try {
36
+ const resolved = import.meta.resolve(pkgName);
37
+ const entry = resolved.startsWith("file://") ? fileURLToPath(resolved) : resolved;
38
+ let dir = path.dirname(entry);
39
+ while (dir !== path.dirname(dir)) {
40
+ if (existsSync(path.join(dir, "package.json"))) return dir;
41
+ dir = path.dirname(dir);
40
42
  }
41
- };
43
+ } catch {
44
+ }
45
+ return void 0;
42
46
  }
47
+
48
+ // src/build/copy-build-content.ts
43
49
  function copyAppAndPluginContent(cwd, serverRoot, pluginPackages) {
44
- copyIfExists(path.join(cwd, "app"), path.join(serverRoot, "app"));
50
+ copyIfExists(path2.join(cwd, "app"), path2.join(serverRoot, "app"));
45
51
  const packagedContent = discoverInstalledPluginPackageContent(cwd, {
46
52
  packageNames: pluginPackages
47
53
  });
48
54
  for (const root of packagedContent.manifestRoots) {
49
- if (existsSync(path.join(root, "plugin.yaml"))) {
50
- const relative = path.relative(cwd, root);
51
- if (!relative || path.isAbsolute(relative) || relative.startsWith("..")) {
55
+ if (existsSync2(path2.join(root, "plugin.yaml"))) {
56
+ const relative = path2.relative(cwd, root);
57
+ if (!relative || path2.isAbsolute(relative) || relative.startsWith("..")) {
52
58
  continue;
53
59
  }
54
60
  copyIfExists(
55
- path.join(root, "plugin.yaml"),
56
- path.join(serverRoot, relative, "plugin.yaml")
61
+ path2.join(root, "plugin.yaml"),
62
+ path2.join(serverRoot, relative, "plugin.yaml")
57
63
  );
58
64
  continue;
59
65
  }
@@ -63,19 +69,6 @@ function copyAppAndPluginContent(cwd, serverRoot, pluginPackages) {
63
69
  copyRootIntoServerOutput(cwd, serverRoot, root);
64
70
  }
65
71
  }
66
- function resolvePackageDir(pkgName) {
67
- try {
68
- const resolved = import.meta.resolve(pkgName);
69
- const entry = resolved.startsWith("file://") ? fileURLToPath(resolved) : resolved;
70
- let dir = path.dirname(entry);
71
- while (dir !== path.dirname(dir)) {
72
- if (existsSync(path.join(dir, "package.json"))) return dir;
73
- dir = path.dirname(dir);
74
- }
75
- } catch {
76
- }
77
- return void 0;
78
- }
79
72
  function copyIncludedFiles(serverRoot, patterns) {
80
73
  if (!patterns?.length) return;
81
74
  for (const pattern of patterns) {
@@ -83,38 +76,70 @@ function copyIncludedFiles(serverRoot, patterns) {
83
76
  const parts = normalized.split("/");
84
77
  const pkgName = parts[0].startsWith("@") ? `${parts[0]}/${parts[1]}` : parts[0];
85
78
  const subpath = parts.slice(pkgName.includes("/") ? 2 : 1).join("/");
86
- const fileGlob = path.basename(subpath);
87
- const subDir = path.dirname(subpath);
79
+ const fileGlob = path2.basename(subpath);
80
+ const subDir = path2.dirname(subpath);
88
81
  const pkgDir = resolvePackageDir(pkgName);
89
82
  if (!pkgDir) continue;
90
- const sourceDir = path.join(pkgDir, subDir);
91
- if (!existsSync(sourceDir)) continue;
83
+ const sourceDir = path2.join(pkgDir, subDir);
84
+ if (!existsSync2(sourceDir)) continue;
92
85
  const entries = readdirSync(sourceDir);
93
- const re = fileGlob.includes("*") ? new RegExp(
94
- `^${fileGlob.replace(/[\\^$+?.()|[\]{}]/g, "\\$&").replace(/\*/g, ".*")}$`
95
- ) : null;
86
+ const re = fileGlob.includes("*") ? globToRegex(fileGlob) : null;
96
87
  for (const entry of entries) {
97
88
  if (re ? !re.test(entry) : entry !== fileGlob) continue;
98
89
  copyIfExists(
99
- path.join(sourceDir, entry),
100
- path.join(serverRoot, "node_modules", pkgName, subDir, entry)
90
+ path2.join(sourceDir, entry),
91
+ path2.join(serverRoot, "node_modules", pkgName, subDir, entry)
101
92
  );
102
93
  }
103
94
  }
104
95
  }
105
96
  function copyIfExists(source, target) {
106
- if (!existsSync(source)) {
97
+ if (!existsSync2(source)) {
107
98
  return;
108
99
  }
109
- mkdirSync(path.dirname(target), { recursive: true });
100
+ mkdirSync(path2.dirname(target), { recursive: true });
110
101
  cpSync(source, target, { recursive: true });
111
102
  }
112
103
  function copyRootIntoServerOutput(cwd, serverRoot, root) {
113
- const relative = path.relative(cwd, root);
114
- if (!relative || path.isAbsolute(relative) || relative.startsWith("..")) {
104
+ const relative = path2.relative(cwd, root);
105
+ if (!relative || path2.isAbsolute(relative) || relative.startsWith("..")) {
115
106
  return;
116
107
  }
117
- copyIfExists(root, path.join(serverRoot, relative));
108
+ copyIfExists(root, path2.join(serverRoot, relative));
109
+ }
110
+
111
+ // src/build/virtual-config.ts
112
+ function injectVirtualConfig(nitro, pluginPackages) {
113
+ nitro.options.virtual["#junior/config"] = `export const pluginPackages = ${JSON.stringify(pluginPackages)};`;
114
+ }
115
+
116
+ // src/nitro.ts
117
+ function juniorNitro(options = {}) {
118
+ return {
119
+ nitro: {
120
+ setup(nitro) {
121
+ const cwd = path3.resolve(
122
+ options.cwd ?? nitro.options.rootDir ?? process.cwd()
123
+ );
124
+ nitro.options.vercel ??= {};
125
+ nitro.options.vercel.functions ??= {};
126
+ nitro.options.vercel.functions.maxDuration ??= options.maxDuration ?? 800;
127
+ applyRolldownTreeshakeWorkaround(nitro);
128
+ injectVirtualConfig(nitro, options.pluginPackages ?? []);
129
+ nitro.hooks.hook("compiled", () => {
130
+ copyAppAndPluginContent(
131
+ cwd,
132
+ nitro.options.output.serverDir,
133
+ options.pluginPackages
134
+ );
135
+ copyIncludedFiles(
136
+ nitro.options.output.serverDir,
137
+ options.includeFiles
138
+ );
139
+ });
140
+ }
141
+ }
142
+ };
118
143
  }
119
144
  export {
120
145
  juniorNitro
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/junior",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -46,8 +46,10 @@
46
46
  "devDependencies": {
47
47
  "@sentry/node": "^10.46.0",
48
48
  "@types/node": "^25.5.0",
49
+ "dependency-cruiser": "^17.3.10",
49
50
  "msw": "^2.12.14",
50
51
  "nitro": "3.0.260311-beta",
52
+ "oxlint": "^1.58.0",
51
53
  "tsup": "^8.5.1",
52
54
  "typescript": "^5.9.3",
53
55
  "vercel": "^50.37.3",
@@ -55,9 +57,12 @@
55
57
  },
56
58
  "scripts": {
57
59
  "build": "tsup",
58
- "test": "pnpm run test:slack-boundary && vitest run",
60
+ "lint": "oxlint --config .oxlintrc.json --quiet --import-plugin --node-plugin --vitest-plugin src tests scripts bin tsup.config.ts",
61
+ "lint:fix": "oxlint --config .oxlintrc.json --quiet --import-plugin --node-plugin --vitest-plugin --fix src tests scripts bin tsup.config.ts",
62
+ "test": "pnpm run test:slack-boundary && pnpm run test:arch-boundary && vitest run",
59
63
  "test:watch": "vitest",
60
64
  "test:slack-boundary": "node scripts/check-slack-test-boundary.mjs",
65
+ "test:arch-boundary": "depcruise --config .dependency-cruiser.mjs src/chat",
61
66
  "typecheck": "tsc --noEmit",
62
67
  "skills:check": "node scripts/check-skills.mjs"
63
68
  }