diff --git a/apps/no-framework/index.ts b/apps/no-framework/index.ts new file mode 100644 index 0000000..9ea66d3 --- /dev/null +++ b/apps/no-framework/index.ts @@ -0,0 +1,128 @@ +// This is the only import for user code. +import { + SpanContext, + TextMapPropagator, + trace as tracing, + context as contextApi, + propagation as propagationApi, + defaultTextMapGetter, +} from "@opentelemetry/api"; + +// All these imports are for SDK configuration, not user code. +import { + AlwaysOnSampler, + BasicTracerProvider, + RandomIdGenerator, + SimpleSpanProcessor, + SpanExporter, +} from "@opentelemetry/sdk-trace-base"; +import { AsyncLocalStorageContextManager } from "@opentelemetry/context-async-hooks"; +import { Resource } from "@opentelemetry/resources"; +import { createExportTraceServiceRequest } from "@opentelemetry/otlp-transformer"; + +function bridgeGetContext(): { + rootSpanContext: SpanContext | undefined; +} { + return { + rootSpanContext: { + traceId: "1111c0c11d8d177d28240e9eb0521111", + spanId: "1111c0c11d8d1111", + traceFlags: 1, + isRemote: true, + }, + }; +} + +// This is SDK code. A normal user code doesn't write it, but it calls some +// SDK configuration, such as `registerOTel` from `@vercel/otel`. +function setupTelemetry() { + // OTEL calls this "resource", while others (such as DataDog) call it "service". + const resource = new Resource({ + "service.name": "my-app", + "node.env": process.env.NODE_ENV, + env: "development", + }); + + const idGenerator = new RandomIdGenerator(); + const contextManager = new AsyncLocalStorageContextManager(); + + const spanExporter: SpanExporter = { + export: (spans, resultCallback) => { + // Converts a Span to IResourceSpans > IScopeSpans > ISpan structure, which + // is OTLP format. It's can be directly serialized to JSON or converted + // to Protobuf. + const resourceSpans = createExportTraceServiceRequest(spans, { + // Uses hex-encoding trace and span IDs. Otherwise, base64 is used. + useHex: true, + // Uses `{high, low}` format for timestamps. Otherwise, `unixNanon` is used. + useLongBits: true, + }); + console.log("[TEL]", JSON.stringify(resourceSpans)); + resultCallback({ code: 0, error: undefined }); + }, + shutdown: () => { + return Promise.resolve(); + }, + }; + + const propagator: TextMapPropagator = { + inject: () => undefined, + fields: () => [], + + extract: (context, carrier, getter) => { + const { rootSpanContext } = bridgeGetContext(); + if (rootSpanContext) { + return tracing.setSpanContext(context, rootSpanContext); + } + return context; + }, + }; + + const tracerProvider = new BasicTracerProvider({ + resource, + idGenerator, + sampler: new AlwaysOnSampler(), + }); + + // Simplification. A SimpleSpanProcessor would almost never be used in a real + // case for exporting. + tracerProvider.addSpanProcessor(new SimpleSpanProcessor(spanExporter)); + + tracerProvider.register({ contextManager, propagator }); +} + +function callFramework(userHandler: () => Promise) { + // Extract the propagated trace context from the request and call the user handler + // in this context. + // Next.js already does this! + const req = {}; + const getter = defaultTextMapGetter; + const active = contextApi.active(); + const context = propagationApi.extract(active, {}, getter); + return contextApi.with(context, userHandler); +} + +setupTelemetry(); + +// User code. It only uses `@opentelemetry/api` APIs. +async function handler() { + const tracer = tracing.getTracer("app"); + return tracer.startActiveSpan( + "handler", + { attributes: { route: "/api/handler" } }, + async (span) => { + await tracer.startActiveSpan("slowOperation", async (span) => { + span.setAttribute("operation", "sleep"); + await new Promise((resolve) => setTimeout(resolve, 1000)); + span.end(); + }); + span.end(); + return "Hello world!"; + } + ); +} + +// Bridge calls the user/framework code. +void callFramework(handler).then((result) => { + console.log("Complete. Result = [", result, "]"); +}); diff --git a/apps/no-framework/package.json b/apps/no-framework/package.json new file mode 100644 index 0000000..ed91a93 --- /dev/null +++ b/apps/no-framework/package.json @@ -0,0 +1,25 @@ +{ + "name": "no-framework", + "version": "0.1.0", + "private": true, + "scripts": { + "type-check": "tsc --noEmit", + "dev": "tsx watch ./index.ts", + "prod": "tsx ./index.ts" + }, + "dependencies": { + "@opentelemetry/api": "^1.7.0", + "@opentelemetry/context-async-hooks": "^1.19.0", + "@opentelemetry/otlp-transformer": "^0.46.0", + "@opentelemetry/resources": "^1.19.0", + "@opentelemetry/sdk-trace-base": "^1.19.0" + }, + "devDependencies": { + "@types/node": "^20", + "autoprefixer": "^10.0.1", + "eslint": "^8", + "eslint-config-next": "14.2.1-canary.7", + "tsx": "^4.6.2", + "typescript": "^5" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0fd4f7d..2c35721 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,43 @@ importers: specifier: ^1.11.3 version: 1.11.3 + apps/no-framework: + dependencies: + '@opentelemetry/api': + specifier: ^1.7.0 + version: 1.7.0 + '@opentelemetry/context-async-hooks': + specifier: ^1.19.0 + version: 1.24.1(@opentelemetry/api@1.7.0) + '@opentelemetry/otlp-transformer': + specifier: ^0.46.0 + version: 0.46.0(@opentelemetry/api@1.7.0) + '@opentelemetry/resources': + specifier: ^1.19.0 + version: 1.24.1(@opentelemetry/api@1.7.0) + '@opentelemetry/sdk-trace-base': + specifier: ^1.19.0 + version: 1.24.1(@opentelemetry/api@1.7.0) + devDependencies: + '@types/node': + specifier: ^20 + version: 20.11.0 + autoprefixer: + specifier: ^10.0.1 + version: 10.4.16(postcss@8.4.33) + eslint: + specifier: ^8 + version: 8.40.0 + eslint-config-next: + specifier: 14.2.1-canary.7 + version: 14.2.1-canary.7(eslint@8.40.0)(typescript@5.3.3) + tsx: + specifier: ^4.6.2 + version: 4.7.0 + typescript: + specifier: ^5 + version: 5.3.3 + apps/sample: dependencies: '@opentelemetry/api': @@ -1138,7 +1175,6 @@ packages: dependencies: eslint: 8.40.0 eslint-visitor-keys: 3.4.3 - dev: false /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} @@ -1173,7 +1209,6 @@ packages: /@eslint/js@8.40.0: resolution: {integrity: sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false /@eslint/js@8.56.0: resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} @@ -1202,6 +1237,7 @@ packages: /@humanwhocodes/config-array@0.11.13: resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 @@ -1215,6 +1251,7 @@ packages: /@humanwhocodes/object-schema@2.0.1: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + deprecated: Use @eslint/object-schema instead /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -1479,7 +1516,6 @@ packages: '@opentelemetry/api': '>=1.0.0 <1.9.0' dependencies: '@opentelemetry/api': 1.7.0 - dev: true /@opentelemetry/core@1.19.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-w42AukJh3TP8R0IZZOVJVM/kMWu8g+lm4LzT70WtuKqhwq7KVhcDzZZuZinWZa6TtQCl7Smt2wolEYzpHabOgw==} @@ -1498,7 +1534,6 @@ packages: dependencies: '@opentelemetry/api': 1.7.0 '@opentelemetry/semantic-conventions': 1.24.1 - dev: true /@opentelemetry/exporter-trace-otlp-grpc@0.51.1(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-P9+Hkszih95ITvldGZ+kXvj9HpD1QfS+PwooyHK72GYA+Bgm+yUSAsDkUkDms8+s9HW6poxURv3LcjaMuBBpVQ==} @@ -1729,7 +1764,6 @@ packages: '@opentelemetry/api': 1.7.0 '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.7.0) '@opentelemetry/semantic-conventions': 1.24.1 - dev: true /@opentelemetry/sdk-logs@0.46.0(@opentelemetry/api-logs@0.46.0)(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-Knlyk4+G72uEzNh6GRN1Fhmrj+/rkATI5/lOrevN7zRDLgp4kfyZBGGoWk7w+qQjlYvwhIIdPVxlIcipivdZIg==} @@ -1824,7 +1858,6 @@ packages: '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.7.0) '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.7.0) '@opentelemetry/semantic-conventions': 1.24.1 - dev: true /@opentelemetry/sdk-trace-node@1.24.1(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-/FZX8uWaGIAwsDhqI8VvQ+qWtfMNlXjaFYGc+vmxgdRFppCSSIRwrPyIhJO1qx61okyYhoyxVEZAfoiNxrfJCg==} @@ -1848,7 +1881,6 @@ packages: /@opentelemetry/semantic-conventions@1.24.1: resolution: {integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==} engines: {node: '>=14'} - dev: true /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -2217,7 +2249,27 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: false + + /@typescript-eslint/parser@6.17.0(eslint@8.40.0)(typescript@5.3.3): + resolution: {integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.17.0 + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.17.0 + debug: 4.3.4 + eslint: 8.40.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true /@typescript-eslint/parser@6.17.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==} @@ -2246,7 +2298,6 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - dev: false /@typescript-eslint/scope-manager@6.17.0: resolution: {integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==} @@ -2279,7 +2330,6 @@ packages: /@typescript-eslint/types@5.62.0: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false /@typescript-eslint/types@6.17.0: resolution: {integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==} @@ -2305,7 +2355,6 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: false /@typescript-eslint/typescript-estree@6.17.0(typescript@5.3.3): resolution: {integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==} @@ -2355,7 +2404,6 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - dev: false /@typescript-eslint/visitor-keys@6.17.0: resolution: {integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==} @@ -2708,7 +2756,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.22.2 - caniuse-lite: 1.0.30001574 + caniuse-lite: 1.0.30001579 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -2775,7 +2823,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001574 + caniuse-lite: 1.0.30001579 electron-to-chromium: 1.4.621 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) @@ -2831,12 +2879,8 @@ packages: engines: {node: '>=6'} dev: true - /caniuse-lite@1.0.30001574: - resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==} - /caniuse-lite@1.0.30001579: resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==} - dev: false /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3399,6 +3443,31 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + /eslint-config-next@14.2.1-canary.7(eslint@8.40.0)(typescript@5.3.3): + resolution: {integrity: sha512-slRghf2Et8m8ubUd4Cry8n5c5tya8JWzLGilzW3kfDNMpFtndwDzsUsGfcBs/3q+IdGJq3Uhx4yv3m7ypy9E7g==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 14.2.1-canary.7 + '@rushstack/eslint-patch': 1.6.1 + '@typescript-eslint/parser': 6.17.0(eslint@8.40.0)(typescript@5.3.3) + eslint: 8.40.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.40.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.40.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.40.0) + eslint-plugin-react: 7.33.2(eslint@8.40.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.40.0) + typescript: 5.3.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-config-next@14.2.1-canary.7(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-slRghf2Et8m8ubUd4Cry8n5c5tya8JWzLGilzW3kfDNMpFtndwDzsUsGfcBs/3q+IdGJq3Uhx4yv3m7ypy9E7g==} peerDependencies: @@ -3472,7 +3541,29 @@ packages: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - dev: false + + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.40.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.15.0 + eslint: 8.40.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.40.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.40.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} @@ -3550,7 +3641,36 @@ packages: eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.1)(eslint@8.40.0) transitivePeerDependencies: - supports-color - dev: false + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.40.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.17.0(eslint@8.40.0)(typescript@5.3.3) + debug: 3.2.7 + eslint: 8.40.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.40.0) + transitivePeerDependencies: + - supports-color + dev: true /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} @@ -3626,7 +3746,41 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: false + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.40.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.17.0(eslint@8.40.0)(typescript@5.3.3) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.40.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.40.0) + hasown: 2.0.0 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} @@ -3707,7 +3861,6 @@ packages: minimatch: 3.1.2 object.entries: 1.1.7 object.fromentries: 2.0.7 - dev: false /eslint-plugin-jsx-a11y@6.8.0(eslint@8.56.0): resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} @@ -3785,7 +3938,6 @@ packages: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: eslint: 8.40.0 - dev: false /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} @@ -3819,7 +3971,6 @@ packages: resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.10 - dev: false /eslint-plugin-react@7.33.2(eslint@8.56.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} @@ -3970,7 +4121,6 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: false /eslint@8.56.0: resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} @@ -4821,7 +4971,6 @@ packages: /js-sdsl@4.4.2: resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} - dev: false /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -7084,7 +7233,6 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -7098,7 +7246,6 @@ packages: dependencies: tslib: 1.14.1 typescript: 5.3.3 - dev: false /tsx@4.7.0: resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==}