@reactionary/source 0.0.30 → 0.0.32

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.
Files changed (119) hide show
  1. package/CLAUDE.md +11 -0
  2. package/core/package.json +1 -1
  3. package/core/src/cache/cache-evaluation.interface.ts +19 -0
  4. package/core/src/cache/cache.interface.ts +38 -0
  5. package/core/src/cache/noop-cache.ts +42 -0
  6. package/core/src/cache/redis-cache.ts +55 -22
  7. package/core/src/client/client-builder.ts +63 -0
  8. package/core/src/client/client.ts +27 -3
  9. package/core/src/decorators/trpc.decorators.ts +144 -0
  10. package/core/src/index.ts +6 -1
  11. package/core/src/providers/analytics.provider.ts +3 -6
  12. package/core/src/providers/base.provider.ts +13 -63
  13. package/core/src/providers/cart.provider.ts +10 -6
  14. package/core/src/providers/identity.provider.ts +8 -5
  15. package/core/src/providers/inventory.provider.ts +5 -6
  16. package/core/src/providers/price.provider.ts +6 -6
  17. package/core/src/providers/product.provider.ts +6 -6
  18. package/core/src/providers/search.provider.ts +6 -6
  19. package/core/src/schemas/mutations/base.mutation.ts +0 -1
  20. package/core/src/schemas/mutations/cart.mutation.ts +0 -6
  21. package/core/src/schemas/mutations/identity.mutation.ts +0 -5
  22. package/core/src/schemas/mutations/product.mutation.ts +0 -1
  23. package/core/src/schemas/queries/base.query.ts +0 -1
  24. package/core/src/schemas/queries/cart.query.ts +1 -3
  25. package/core/src/schemas/queries/identity.query.ts +1 -3
  26. package/core/src/schemas/queries/inventory.query.ts +0 -1
  27. package/core/src/schemas/queries/price.query.ts +0 -3
  28. package/core/src/schemas/queries/product.query.ts +2 -7
  29. package/core/src/schemas/queries/search.query.ts +0 -3
  30. package/examples/node/package.json +1 -5
  31. package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +97 -0
  32. package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +84 -0
  33. package/examples/node/src/basic/basic-node-setup.spec.ts +40 -0
  34. package/otel/src/index.ts +3 -0
  35. package/otel/src/trace-decorator.ts +246 -0
  36. package/package.json +2 -1
  37. package/providers/algolia/src/core/initialize.ts +11 -9
  38. package/providers/algolia/src/providers/product.provider.ts +44 -11
  39. package/providers/algolia/src/providers/search.provider.ts +47 -66
  40. package/providers/commercetools/src/core/client.ts +0 -1
  41. package/providers/commercetools/src/core/initialize.ts +28 -24
  42. package/providers/commercetools/src/providers/cart.provider.ts +58 -89
  43. package/providers/commercetools/src/providers/identity.provider.ts +34 -50
  44. package/providers/commercetools/src/providers/inventory.provider.ts +16 -38
  45. package/providers/commercetools/src/providers/price.provider.ts +30 -35
  46. package/providers/commercetools/src/providers/product.provider.ts +48 -38
  47. package/providers/commercetools/src/providers/search.provider.ts +32 -47
  48. package/providers/commercetools/src/schema/capabilities.schema.ts +1 -1
  49. package/providers/fake/package.json +1 -0
  50. package/providers/fake/src/core/initialize.ts +17 -14
  51. package/providers/fake/src/index.ts +4 -0
  52. package/providers/fake/src/providers/analytics.provider.ts +19 -0
  53. package/providers/fake/src/providers/cart.provider.ts +107 -0
  54. package/providers/fake/src/providers/identity.provider.ts +78 -67
  55. package/providers/fake/src/providers/inventory.provider.ts +54 -0
  56. package/providers/fake/src/providers/price.provider.ts +60 -0
  57. package/providers/fake/src/providers/product.provider.ts +53 -49
  58. package/providers/fake/src/providers/search.provider.ts +15 -33
  59. package/providers/posthog/src/core/initialize.ts +6 -4
  60. package/trpc/__mocks__/superjson.js +25 -0
  61. package/trpc/jest.config.ts +14 -0
  62. package/trpc/package.json +2 -1
  63. package/trpc/src/client.ts +176 -0
  64. package/trpc/src/index.ts +35 -62
  65. package/trpc/src/integration.spec.ts +216 -0
  66. package/trpc/src/server.ts +123 -0
  67. package/trpc/src/transparent-client.spec.ts +160 -0
  68. package/trpc/src/types.ts +142 -0
  69. package/trpc/tsconfig.json +3 -0
  70. package/trpc/tsconfig.lib.json +2 -1
  71. package/trpc/tsconfig.spec.json +15 -0
  72. package/tsconfig.base.json +0 -2
  73. package/core/src/cache/caching-strategy.ts +0 -25
  74. package/examples/angular/e2e/example.spec.ts +0 -9
  75. package/examples/angular/eslint.config.mjs +0 -41
  76. package/examples/angular/playwright.config.ts +0 -38
  77. package/examples/angular/project.json +0 -86
  78. package/examples/angular/public/favicon.ico +0 -0
  79. package/examples/angular/src/app/app.component.html +0 -6
  80. package/examples/angular/src/app/app.component.scss +0 -22
  81. package/examples/angular/src/app/app.component.ts +0 -14
  82. package/examples/angular/src/app/app.config.ts +0 -16
  83. package/examples/angular/src/app/app.routes.ts +0 -25
  84. package/examples/angular/src/app/cart/cart.component.html +0 -4
  85. package/examples/angular/src/app/cart/cart.component.scss +0 -14
  86. package/examples/angular/src/app/cart/cart.component.ts +0 -73
  87. package/examples/angular/src/app/identity/identity.component.html +0 -6
  88. package/examples/angular/src/app/identity/identity.component.scss +0 -18
  89. package/examples/angular/src/app/identity/identity.component.ts +0 -49
  90. package/examples/angular/src/app/product/product.component.html +0 -14
  91. package/examples/angular/src/app/product/product.component.scss +0 -11
  92. package/examples/angular/src/app/product/product.component.ts +0 -42
  93. package/examples/angular/src/app/search/search.component.html +0 -35
  94. package/examples/angular/src/app/search/search.component.scss +0 -129
  95. package/examples/angular/src/app/search/search.component.ts +0 -50
  96. package/examples/angular/src/app/services/product.service.ts +0 -35
  97. package/examples/angular/src/app/services/search.service.ts +0 -48
  98. package/examples/angular/src/app/services/trpc.client.ts +0 -27
  99. package/examples/angular/src/index.html +0 -13
  100. package/examples/angular/src/main.ts +0 -7
  101. package/examples/angular/src/styles.scss +0 -17
  102. package/examples/angular/src/test-setup.ts +0 -6
  103. package/examples/angular/tsconfig.app.json +0 -10
  104. package/examples/angular/tsconfig.editor.json +0 -6
  105. package/examples/angular/tsconfig.json +0 -32
  106. package/examples/node/src/initialize-algolia.spec.ts +0 -29
  107. package/examples/node/src/initialize-commercetools.spec.ts +0 -31
  108. package/examples/node/src/initialize-extended-providers.spec.ts +0 -38
  109. package/examples/node/src/initialize-mixed-providers.spec.ts +0 -36
  110. package/examples/node/src/providers/custom-algolia-product.provider.ts +0 -18
  111. package/examples/node/src/schemas/custom-product.schema.ts +0 -8
  112. package/examples/trpc-node/.env.example +0 -52
  113. package/examples/trpc-node/eslint.config.mjs +0 -3
  114. package/examples/trpc-node/project.json +0 -61
  115. package/examples/trpc-node/src/assets/.gitkeep +0 -0
  116. package/examples/trpc-node/src/main.ts +0 -59
  117. package/examples/trpc-node/src/router-instance.ts +0 -52
  118. package/examples/trpc-node/tsconfig.app.json +0 -9
  119. package/examples/trpc-node/tsconfig.json +0 -13
@@ -1,129 +0,0 @@
1
- :host {
2
- display: grid;
3
- gap: 0.5rem;
4
- grid-template-columns: 300px 1fr;
5
- color: rgb(205, 214, 244);
6
- }
7
-
8
- details[open] {
9
- summary:after {
10
- content: '-';
11
- }
12
- }
13
-
14
- details {
15
- position: relative;
16
- background: rgb(49, 50, 68);
17
- border-radius: 0.5rem;
18
- }
19
-
20
- summary {
21
- font-weight: bold;
22
- text-transform: capitalize;
23
- list-style: none;
24
- padding: 0.5rem;
25
-
26
- &::-webkit-details-marker {
27
- display: none;
28
- }
29
-
30
- &::after {
31
- position: absolute;
32
- top: 0.5rem;
33
- right: 0.5rem;
34
- content: '+';
35
- line-height: 1;
36
- }
37
- }
38
-
39
- aside {
40
- display: grid;
41
- grid-template-columns: 1fr;
42
- grid-auto-rows: min-content;
43
- gap: 0.25rem;
44
-
45
- .content {
46
- display: grid;
47
- grid-template-columns: 1fr min-content min-content;
48
- grid-auto-rows: min-content;
49
- padding: 0.5rem;
50
- gap: 0.5rem;
51
-
52
- label {
53
- grid-column: span 3;
54
- display: grid;
55
- grid-template-columns: subgrid;
56
- align-items: center;
57
- gap: 0.5rem;
58
-
59
- input {
60
- width: 1.5rem;
61
- height: 1.5rem;
62
- background: rgb(147, 153, 178);
63
- border-radius: 0.125rem;
64
-
65
- &:checked {
66
- background: rgb(137, 220, 235);
67
- }
68
- }
69
- }
70
- }
71
- }
72
-
73
- section {
74
- justify-content: center;
75
- display: grid;
76
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
77
- grid-auto-rows: min-content;
78
- gap: 0.5rem;
79
- }
80
-
81
- article {
82
- background: rgb(49, 50, 68);
83
- border-radius: 0.25rem;
84
- display: grid;
85
- grid-template-columns: 1fr;
86
- grid-template-rows: 1fr min-content;
87
- gap: 1rem;
88
-
89
- h3 {
90
- line-height: 1.2;
91
- font-size: 1rem;
92
- text-align: center;
93
- margin-bottom: 1rem;
94
- }
95
-
96
- img {
97
- object-fit: contain;
98
- border-radius: inherit;
99
- max-width: 100%;
100
- width: 100%;
101
- }
102
- }
103
-
104
- footer {
105
- grid-column: 2;
106
- margin: 0.5rem;
107
- gap: 0.25rem;
108
- display: grid;
109
- grid-template-columns: min-content min-content;
110
- align-items: center;
111
- justify-content: center;
112
- }
113
-
114
- button {
115
- display: grid;
116
- justify-content: center;
117
- align-items: center;
118
-
119
- height: 3rem;
120
- background: rgb(49, 50, 68);
121
- color: rgb(205, 214, 244);
122
- aspect-ratio: 1 / 1;
123
- border-radius: 0.25rem;
124
-
125
- &:disabled {
126
- opacity: 0.5;
127
- }
128
- }
129
-
@@ -1,50 +0,0 @@
1
- import { Component, computed, inject } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { SearchService } from '../services/search.service';
4
- import { FacetValueIdentifier } from '@reactionary/core';
5
- import { RouterModule } from '@angular/router';
6
- import { TRPC } from '../services/trpc.client';
7
-
8
- @Component({
9
- selector: 'app-search',
10
- imports: [CommonModule, RouterModule],
11
- templateUrl: './search.component.html',
12
- styleUrl: './search.component.scss',
13
- })
14
- export class SearchComponent {
15
- protected service = inject(SearchService);
16
- protected client = inject(TRPC);
17
-
18
- protected hasNext = computed(() => {
19
- return this.service.page() >= (this.service.search()?.pages || 0) - 1;
20
- });
21
-
22
- protected hasPrevious = computed(() => {
23
- return !(this.service.page() > 0);
24
- });
25
-
26
- protected previousPage() {
27
- this.service.page.update((old) => old - 1);
28
- }
29
-
30
- protected nextPage() {
31
- this.service.page.update((old) => old + 1);
32
- }
33
-
34
- protected toggleFacet(value: FacetValueIdentifier) {
35
- this.service.facets.update((old) => {
36
- const existingIndex = old.findIndex(
37
- (x) => JSON.stringify(x) === JSON.stringify(value)
38
- );
39
-
40
- if (existingIndex > -1) {
41
- const updated = [...old];
42
- updated.splice(existingIndex, 1);
43
-
44
- return updated;
45
- } else {
46
- return [...old, value];
47
- }
48
- });
49
- }
50
- }
@@ -1,35 +0,0 @@
1
- import { inject, Injectable, resource } from '@angular/core';
2
- import { TRPC } from './trpc.client';
3
- import { ActivationEnd, Router } from '@angular/router';
4
- import { toSignal } from '@angular/core/rxjs-interop';
5
- import { filter, map } from 'rxjs';
6
-
7
- @Injectable({
8
- providedIn: 'root',
9
- })
10
- export class ProductService {
11
- protected client = inject(TRPC);
12
- protected router = inject(Router);
13
- protected slug = toSignal(
14
- this.router.events.pipe(filter(x => x instanceof ActivationEnd), map(x => x.snapshot.params['slug'])),
15
- { initialValue: '' }
16
- );
17
-
18
- public productResource = resource({
19
- request: () => ({
20
- slug: this.slug(),
21
- }),
22
- loader: async ({ request }) => {
23
- if (request.slug) {
24
- const results = await this.client.client.product.query([{
25
- query: 'slug',
26
- slug: request.slug,
27
- }]);
28
-
29
- return results[0];
30
- } else {
31
- return undefined;
32
- }
33
- },
34
- });
35
- }
@@ -1,48 +0,0 @@
1
- import { inject, Injectable, linkedSignal, resource, signal } from '@angular/core';
2
- import { FacetValueIdentifier, SearchResult } from '@reactionary/core';
3
- import { TRPC } from './trpc.client';
4
-
5
- @Injectable({
6
- providedIn: 'root',
7
- })
8
- export class SearchService {
9
- protected client = inject(TRPC);
10
-
11
- public pageSize = signal(20);
12
- public page = signal(0);
13
- public term = signal('glass');
14
- public facets = signal(new Array<FacetValueIdentifier>());
15
-
16
- protected searchResource = resource({
17
- request: () => ({
18
- pageSize: this.pageSize(),
19
- page: this.page(),
20
- term: this.term(),
21
- facets: this.facets(),
22
- }),
23
- loader: async ({ request }) => {
24
- const result = await this.client.client.search.query([{
25
- query: 'term',
26
- search: {
27
- ...request
28
- }
29
- }]);
30
-
31
- return result[0];
32
- },
33
- });
34
-
35
- public search = linkedSignal<
36
- SearchResult | undefined,
37
- SearchResult | undefined
38
- >({
39
- source: () => this.searchResource.value(),
40
- computation: (source, previous) => {
41
- if (source) {
42
- return source;
43
- }
44
-
45
- return previous?.value;
46
- },
47
- }).asReadonly();
48
- }
@@ -1,27 +0,0 @@
1
- import { Injectable } from "@angular/core";
2
- import { createTRPCClient, httpBatchLink } from "@trpc/client";
3
-
4
- // FIXME: move the router to a buildable library, to allow importing it
5
- // eslint-disable-next-line @nx/enforce-module-boundaries
6
- import type { RouterType } from '../../../../trpc-node/src/router-instance';
7
- import superjson from "superjson";
8
-
9
- @Injectable({
10
- providedIn: 'root',
11
- })
12
- export class TRPC {
13
- public client = createTRPCClient<RouterType>({
14
- links: [
15
- httpBatchLink({
16
- url: 'http://localhost:3000/trpc',
17
- transformer: superjson,
18
- fetch(url, options) {
19
- return fetch(url, {
20
- ...options,
21
- credentials: 'include',
22
- });
23
- },
24
- }),
25
- ],
26
- });
27
- }
@@ -1,13 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <title>examples-angular</title>
6
- <base href="/" />
7
- <meta name="viewport" content="width=device-width, initial-scale=1" />
8
- <link rel="icon" type="image/x-icon" href="favicon.ico" />
9
- </head>
10
- <body>
11
- <app-root></app-root>
12
- </body>
13
- </html>
@@ -1,7 +0,0 @@
1
- import { bootstrapApplication } from '@angular/platform-browser';
2
- import { appConfig } from './app/app.config';
3
- import { AppComponent } from './app/app.component';
4
-
5
- bootstrapApplication(AppComponent, appConfig).catch((err) =>
6
- console.error(err)
7
- );
@@ -1,17 +0,0 @@
1
- a,
2
- input,
3
- h3,
4
- button {
5
- all: unset;
6
- box-sizing: border-box;
7
- }
8
-
9
- * {
10
- box-sizing: border-box;
11
- }
12
-
13
- body {
14
- margin: 0;
15
- padding: 0;
16
- background: rgb(17, 17, 27);
17
- }
@@ -1,6 +0,0 @@
1
- import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone';
2
-
3
- setupZoneTestEnv({
4
- errorOnUnknownElements: true,
5
- errorOnUnknownProperties: true,
6
- });
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "../../dist/out-tsc",
5
- "types": ["node"]
6
- },
7
- "files": ["src/main.ts"],
8
- "include": ["src/**/*.d.ts"],
9
- "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"]
10
- }
@@ -1,6 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "include": ["src/**/*.ts"],
4
- "compilerOptions": {},
5
- "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"]
6
- }
@@ -1,32 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2022",
4
- "esModuleInterop": true,
5
- "forceConsistentCasingInFileNames": true,
6
- "strict": true,
7
- "noImplicitOverride": true,
8
- "noPropertyAccessFromIndexSignature": true,
9
- "noImplicitReturns": true,
10
- "noFallthroughCasesInSwitch": true
11
- },
12
- "files": [],
13
- "include": [],
14
- "references": [
15
- {
16
- "path": "./tsconfig.editor.json"
17
- },
18
- {
19
- "path": "./tsconfig.app.json"
20
- },
21
- {
22
- "path": "./tsconfig.spec.json"
23
- }
24
- ],
25
- "extends": "../../tsconfig.base.json",
26
- "angularCompilerOptions": {
27
- "enableI18nLegacyMessageIdFormat": false,
28
- "strictInjectionParameters": true,
29
- "strictInputAccessModifiers": true,
30
- "strictTemplates": true
31
- }
32
- }
@@ -1,29 +0,0 @@
1
- import { buildClient } from '@reactionary/core';
2
- import { withAlgoliaCapabilities } from '@reactionary/provider-algolia';
3
-
4
- describe('initialize algolia', () => {
5
- it('should be able to search against algolia', async () => {
6
- const client = buildClient([
7
- withAlgoliaCapabilities(
8
- {
9
- apiKey: process.env['ALGOLIA_API_KEY'] || '',
10
- appId: process.env['ALGOLIA_APP_ID'] || '',
11
- indexName: process.env['ALGOLIA_INDEX'] || '',
12
- },
13
- { product: true, search: true }
14
- ),
15
- ]);
16
-
17
- expect(client.search).toBeDefined();
18
-
19
- const result = await client.search.get({
20
- term: 'glass',
21
- page: 0,
22
- pageSize: 10,
23
- facets: []
24
- });
25
-
26
- expect(result.identifier.term).toBe('glass');
27
- expect(result.products.length).toBeGreaterThan(0);
28
- });
29
- });
@@ -1,31 +0,0 @@
1
- import { buildClient } from '@reactionary/core';
2
- import { withCommercetoolsCapabilities } from '@reactionary/provider-commercetools';
3
-
4
- describe('initialize commercetools', () => {
5
- it('should be able to search against commercetools', async () => {
6
- const client = buildClient([
7
- withCommercetoolsCapabilities(
8
- {
9
- apiUrl: process.env['COMMERCETOOLS_API_URL'] || '',
10
- authUrl: process.env['COMMERCETOOLS_AUTH_URL'] || '',
11
- clientId: process.env['COMMERCETOOLS_CLIENT_ID'] || '',
12
- clientSecret: process.env['COMMERCETOOLS_CLIENT_SECRET'] || '',
13
- projectKey: process.env['COMMERCETOOLS_PROJECT_KEY'] || '',
14
- },
15
- { product: true, search: true }
16
- ),
17
- ]);
18
-
19
- expect(client.search).toBeDefined();
20
-
21
- const result = await client.search.get({
22
- term: 'glass',
23
- page: 0,
24
- pageSize: 10,
25
- facets: []
26
- });
27
-
28
- expect(result.identifier.term).toBe('glass');
29
- expect(result.products.length).toBeGreaterThan(0);
30
- });
31
- });
@@ -1,38 +0,0 @@
1
- import { buildClient, Session } from '@reactionary/core';
2
- import { CustomAlgoliaProductProvider } from './providers/custom-algolia-product.provider';
3
-
4
-
5
- describe('initialize extended providers', () => {
6
- it('should be able to extend a provider with a custom schema with a default value', async () => {
7
- const session: Session = {
8
- id: '1234',
9
- identity: {
10
- id: '1234',
11
- issued: new Date(),
12
- expiry: new Date(),
13
- token: '',
14
- type: 'Anonymous'
15
- }
16
- }
17
-
18
- const provider = new CustomAlgoliaProductProvider({
19
- apiKey: process.env['ALGOLIA_API_KEY'] || '',
20
- appId: process.env['ALGOLIA_APP_ID'] || '',
21
- indexName: process.env['ALGOLIA_INDEX'] || '',
22
- });
23
-
24
- const client = buildClient([
25
- {
26
- product: provider
27
- }
28
- ]);
29
-
30
- const product = await client.product.query([{
31
- id: '4d28f98d-c446-446e-b59a-d9f718e5b98a',
32
- query: 'id'
33
- }], session);
34
-
35
- expect(product[0].gtin).toBe('missingggg');
36
- expect(product[0].name).toBe('SUNNAI GLASS BOWL');
37
- });
38
- });
@@ -1,36 +0,0 @@
1
- import { buildClient } from '@reactionary/core';
2
- import { withAlgoliaCapabilities } from '@reactionary/provider-algolia';
3
- import { withCommercetoolsCapabilities } from '@reactionary/provider-commercetools';
4
-
5
- describe('initialize mixed providers', () => {
6
- it('should be able to handle a mixture of providers', async () => {
7
- const client = buildClient([
8
- withAlgoliaCapabilities(
9
- {
10
- apiKey: process.env['ALGOLIA_API_KEY'] || '',
11
- appId: process.env['ALGOLIA_APP_ID'] || '',
12
- indexName: process.env['ALGOLIA_INDEX'] || '',
13
- },
14
- { search: true }
15
- ),
16
- withCommercetoolsCapabilities(
17
- {
18
- apiUrl: process.env['COMMERCETOOLS_API_URL'] || '',
19
- authUrl: process.env['COMMERCETOOLS_AUTH_URL'] || '',
20
- clientId: process.env['COMMERCETOOLS_CLIENT_ID'] || '',
21
- clientSecret: process.env['COMMERCETOOLS_CLIENT_SECRET'] || '',
22
- projectKey: process.env['COMMERCETOOLS_PROJECT_KEY'] || '',
23
- },
24
- { product: true }
25
- ),
26
- ]);
27
-
28
- const search = await client.search.get({ term: 'glass', page: 0, pageSize: 10, facets: [] });
29
-
30
- expect(search.products.length).toBeGreaterThan(0);
31
-
32
- const product = await client.product.get({ id: search.products[0].identifier.key });
33
-
34
- expect(product.identifier.key).toBe(search.products[0].identifier.key);
35
- });
36
- });
@@ -1,18 +0,0 @@
1
- import { AlgoliaConfiguration, AlgoliaProductProvider } from '@reactionary/provider-algolia';
2
- import { CustomProduct, CustomProductSchema } from '../schemas/custom-product.schema';
3
- import { ProductMutationSchema, ProductQuerySchema } from '@reactionary/core';
4
-
5
- export class CustomAlgoliaProductProvider extends AlgoliaProductProvider<CustomProduct> {
6
- constructor(config: AlgoliaConfiguration) {
7
- super(config, CustomProductSchema, ProductQuerySchema, ProductMutationSchema);
8
- }
9
-
10
- public parse(data: any): CustomProduct {
11
- const result = super.newModel();
12
-
13
- result.gtin = data.ean8 ?? data.ean13 ?? data.partNumber ?? 'missingggg';
14
- result.name = result.name.toUpperCase();
15
-
16
- return result;
17
- }
18
- }
@@ -1,8 +0,0 @@
1
- import { z } from 'zod';
2
- import { ProductSchema } from '@reactionary/core';
3
-
4
- export const CustomProductSchema = ProductSchema.extend({
5
- gtin: z.string().min(8),
6
- });
7
-
8
- export type CustomProduct = z.infer<typeof CustomProductSchema>;
@@ -1,52 +0,0 @@
1
- # OpenTelemetry Configuration (Standard Environment Variables)
2
- # See: https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/
3
- # ============================
4
-
5
- # Service identification
6
- OTEL_SERVICE_NAME=reactionary-trpc-example
7
- OTEL_SERVICE_VERSION=1.0.0
8
-
9
- # Traces exporter: console | otlp | otlp/http | none
10
- OTEL_TRACES_EXPORTER=console
11
-
12
- # Metrics exporter: console | otlp | otlp/http | none
13
- OTEL_METRICS_EXPORTER=console
14
-
15
- # For OTLP exporters (e.g., Honeycomb, Jaeger, Grafana)
16
- # OTEL_EXPORTER_OTLP_ENDPOINT=https://api.honeycomb.io
17
- # OTEL_EXPORTER_OTLP_HEADERS=x-honeycomb-team=your-api-key
18
- # OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
19
-
20
- # Or use specific endpoints for traces/metrics
21
- # OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://api.honeycomb.io/v1/traces
22
- # OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=https://api.honeycomb.io/v1/metrics
23
-
24
- # For local Jaeger
25
- # OTEL_TRACES_EXPORTER=otlp
26
- # OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
27
-
28
- # Debug logging
29
- # OTEL_LOG_LEVEL=debug
30
-
31
- # Metrics export interval (milliseconds)
32
- OTEL_METRIC_EXPORT_INTERVAL=60000
33
-
34
- # Session Store Configuration
35
- # ============================
36
- SESSION_STORE_REDIS_CONNECTION=redis://localhost:6379
37
- SESSION_STORE_SECRET=your-session-secret-here
38
-
39
- # Provider API Keys
40
- # ==================
41
- ALGOLIA_API_KEY=your-algolia-api-key
42
- ALGOLIA_APP_ID=your-algolia-app-id
43
- ALGOLIA_INDEX=your-algolia-index
44
-
45
- COMMERCETOOLS_API_URL=https://api.commercetools.com
46
- COMMERCETOOLS_AUTH_URL=https://auth.commercetools.com
47
- COMMERCETOOLS_CLIENT_ID=your-client-id
48
- COMMERCETOOLS_CLIENT_SECRET=your-client-secret
49
- COMMERCETOOLS_PROJECT_KEY=your-project-key
50
-
51
- POSTHOG_API_KEY=your-posthog-api-key
52
- POSTHOG_HOST=https://app.posthog.com
@@ -1,3 +0,0 @@
1
- import baseConfig from '../../eslint.config.mjs';
2
-
3
- export default [...baseConfig];
@@ -1,61 +0,0 @@
1
- {
2
- "name": "trpc-node",
3
- "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
- "sourceRoot": "examples/trpc-node/src",
5
- "projectType": "application",
6
- "tags": [],
7
- "targets": {
8
- "build": {
9
- "executor": "@nx/esbuild:esbuild",
10
- "outputs": ["{options.outputPath}"],
11
- "defaultConfiguration": "production",
12
- "options": {
13
- "platform": "node",
14
- "outputPath": "dist/examples/trpc-node",
15
- "format": ["esm"],
16
- "bundle": true,
17
- "main": "examples/trpc-node/src/main.ts",
18
- "tsConfig": "examples/trpc-node/tsconfig.app.json",
19
- "assets": ["examples/trpc-node/src/assets"],
20
- "generatePackageJson": true,
21
- "esbuildOptions": {
22
- "sourcemap": true,
23
- "outExtension": {
24
- ".js": ".js"
25
- }
26
- }
27
- },
28
- "configurations": {
29
- "development": {},
30
- "production": {
31
- "esbuildOptions": {
32
- "sourcemap": false,
33
- "outExtension": {
34
- ".js": ".js"
35
- }
36
- }
37
- }
38
- }
39
- },
40
- "serve": {
41
- "executor": "@nx/js:node",
42
- "defaultConfiguration": "development",
43
- "dependsOn": [
44
- "build"
45
- ],
46
- "options": {
47
- "buildTarget": "trpc-node:build",
48
- "runBuildTargetDependencies": false
49
- },
50
- "configurations": {
51
- "development": {
52
- "buildTarget": "trpc-node:build:development"
53
- },
54
- "production": {
55
- "buildTarget": "trpc-node:build:production"
56
- }
57
- },
58
- "continuous": true
59
- }
60
- }
61
- }
File without changes