devendra-skill-package 1.0.2
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/.github/skills/boiler-project-generator/SKILL.md +103 -0
- package/.github/skills/boiler-project-generator/assets/templates/android/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/angular/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/flutter/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/ios/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/react/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/api-setup.ts +76 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/component-primary-button.tsx +29 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/env-config.env +4 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/feature-auth-screen.tsx +45 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/feature-dashboard-screen.tsx +45 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/feature-profile-screen.tsx +45 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/hook-use-app-boot.ts +11 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/navigation-setup.tsx +25 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/project-structure.md +24 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/redux-hooks.ts +5 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/redux-session-slice.ts +29 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/redux-store.ts +15 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/theme-index.ts +23 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/utils-helpers.ts +7 -0
- package/.github/skills/boiler-project-generator/metadata.yaml +29 -0
- package/.github/skills/boiler-project-generator/references/android.md +19 -0
- package/.github/skills/boiler-project-generator/references/angular.md +14 -0
- package/.github/skills/boiler-project-generator/references/flutter.md +17 -0
- package/.github/skills/boiler-project-generator/references/ios.md +17 -0
- package/.github/skills/boiler-project-generator/references/react-native.md +103 -0
- package/.github/skills/boiler-project-generator/references/react.md +17 -0
- package/.github/skills/boiler-project-generator/scripts/angular.js +43 -0
- package/.github/skills/boiler-project-generator/scripts/generate-project.mjs +107 -0
- package/.github/skills/boiler-project-generator/scripts/init.js +105 -0
- package/.github/skills/boiler-project-generator/scripts/react-native.js +1041 -0
- package/.github/skills/boiler-project-generator/scripts/react.js +32 -0
- package/.github/skills/clean-architecture-generator/SKILL.md +235 -0
- package/.github/skills/clean-architecture-generator/references/architecture-core.md +126 -0
- package/.github/skills/clean-architecture-generator/references/platform-angular.md +374 -0
- package/.github/skills/clean-architecture-generator/references/platform-flutter.md +366 -0
- package/.github/skills/clean-architecture-generator/references/platform-react-native.md +590 -0
- package/.github/skills/clean-architecture-generator/references/platform-react.md +261 -0
- package/.github/skills/code-test-coverage-analyzer/SKILL.md +1358 -0
- package/.github/skills/code-test-coverage-analyzer/assets/config-questionnaire.md +118 -0
- package/.github/skills/code-test-coverage-analyzer/assets/conflict-resolution-protocol.md +99 -0
- package/.github/skills/code-test-coverage-analyzer/assets/coverage-calculation-rules.md +294 -0
- package/.github/skills/code-test-coverage-analyzer/assets/multi-strategy-search.md +145 -0
- package/.github/skills/code-test-coverage-analyzer/assets/output-file-contracts.md +651 -0
- package/.github/skills/code-test-coverage-analyzer/assets/status-definitions.md +273 -0
- package/.github/skills/code-test-coverage-analyzer/examples/example-invocation.md +208 -0
- package/.github/skills/code-test-coverage-analyzer/references/android-patterns.md +229 -0
- package/.github/skills/code-test-coverage-analyzer/references/angular-patterns.md +177 -0
- package/.github/skills/code-test-coverage-analyzer/references/backend-patterns.md +383 -0
- package/.github/skills/code-test-coverage-analyzer/references/flutter-patterns.md +254 -0
- package/.github/skills/code-test-coverage-analyzer/references/ios-patterns.md +228 -0
- package/.github/skills/code-test-coverage-analyzer/references/react-native-patterns.md +431 -0
- package/.github/skills/code-test-coverage-analyzer/references/react-patterns.md +206 -0
- package/.github/skills/code-test-coverage-analyzer/scripts/detect-platform.ps1 +261 -0
- package/.github/skills/code-test-coverage-analyzer/scripts/scan-repository.ps1 +242 -0
- package/.github/skills/code-test-coverage-analyzer/templates/brd-compliance-row.md +107 -0
- package/.github/skills/code-test-coverage-analyzer/templates/test-case-row.md +130 -0
- package/.github/skills/code-test-coverage-analyzer/templates/user-story-compliance-row.md +170 -0
- package/.github/skills/custom-font-integrator/SKILL.md +373 -0
- package/.github/skills/custom-font-integrator/assets/FontTestScreen.js +150 -0
- package/.github/skills/custom-font-integrator/references/example-info-plist.xml +21 -0
- package/.github/skills/custom-font-integrator/scripts/setup-fonts.sh +99 -0
- package/.github/skills/encryption-decryption-utility/Instructions.md +282 -0
- package/.github/skills/encryption-decryption-utility/README.md +222 -0
- package/.github/skills/encryption-decryption-utility/SKILL.md +645 -0
- package/.github/skills/encryption-decryption-utility/assets/encryption-config-template.json +13 -0
- package/.github/skills/encryption-decryption-utility/assets/platform-matrix.json +180 -0
- package/.github/skills/encryption-decryption-utility/metadata.yaml +51 -0
- package/.github/skills/encryption-decryption-utility/references/android-crypto.md +157 -0
- package/.github/skills/encryption-decryption-utility/references/angular-crypto.md +130 -0
- package/.github/skills/encryption-decryption-utility/references/approach-1-webcrypto.md +95 -0
- package/.github/skills/encryption-decryption-utility/references/approach-2-rsa-aes-cbc.md +111 -0
- package/.github/skills/encryption-decryption-utility/references/approach-3-aes-sharedkey.md +114 -0
- package/.github/skills/encryption-decryption-utility/references/architecture.md +233 -0
- package/.github/skills/encryption-decryption-utility/references/backend-alignment.md +506 -0
- package/.github/skills/encryption-decryption-utility/references/dependency-guidance.md +234 -0
- package/.github/skills/encryption-decryption-utility/references/ec-implementation.md +832 -0
- package/.github/skills/encryption-decryption-utility/references/error-handling-playbook.md +234 -0
- package/.github/skills/encryption-decryption-utility/references/flutter-crypto.md +105 -0
- package/.github/skills/encryption-decryption-utility/references/ios-crypto.md +338 -0
- package/.github/skills/encryption-decryption-utility/references/native-rsa-implementation.md +373 -0
- package/.github/skills/encryption-decryption-utility/references/node-crypto.md +86 -0
- package/.github/skills/encryption-decryption-utility/references/react-crypto.md +105 -0
- package/.github/skills/encryption-decryption-utility/references/react-native-crypto.md +1001 -0
- package/.github/skills/encryption-decryption-utility/references/react-web-crypto.md +668 -0
- package/.github/skills/encryption-decryption-utility/references/security-checklist.md +176 -0
- package/.github/skills/encryption-decryption-utility/references/web-crypto.md +74 -0
- package/.github/skills/encryption-decryption-utility/scripts/detect.js +128 -0
- package/.github/skills/encryption-decryption-utility/scripts/install.js +1713 -0
- package/.github/skills/encryption-decryption-utility/scripts/setup.js +800 -0
- package/.github/skills/encryption-decryption-utility/template.md +241 -0
- package/.github/skills/encryption-decryption-utility/templates/config-questionnaire.md +467 -0
- package/.github/skills/encryption-decryption-utility/templates/delivery-checklist.md +206 -0
- package/.github/skills/encryption-decryption-utility/templates/implementation-plan.md +304 -0
- package/.github/skills/feature-generator/SKILL.MD +2741 -0
- package/.github/skills/feature-generator/assets/fingerprint-schema.json +385 -0
- package/.github/skills/feature-generator/assets/spec-template.md +172 -0
- package/.github/skills/feature-generator/assets/transform-rules.json +82 -0
- package/.github/skills/feature-generator/references/api-envelope-patterns.md +327 -0
- package/.github/skills/feature-generator/references/screen-logic-patterns.md +399 -0
- package/.github/skills/feature-generator/references/state-library-patterns.md +464 -0
- package/.github/skills/figma-ui-mapper/README.md +34 -0
- package/.github/skills/figma-ui-mapper/SKILL.md +101 -0
- package/.github/skills/figma-ui-mapper/assets/templates/component-map-template.md +30 -0
- package/.github/skills/figma-ui-mapper/assets/templates/generation-report-template.md +49 -0
- package/.github/skills/figma-ui-mapper/metadata.yaml +22 -0
- package/.github/skills/figma-ui-mapper/references/android.md +11 -0
- package/.github/skills/figma-ui-mapper/references/angular.md +18 -0
- package/.github/skills/figma-ui-mapper/references/capacitor.md +18 -0
- package/.github/skills/figma-ui-mapper/references/common.md +23 -0
- package/.github/skills/figma-ui-mapper/references/expo.md +18 -0
- package/.github/skills/figma-ui-mapper/references/flutter.md +18 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/angular/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/capacitor/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/expo/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/flutter/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/ionic/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/kotlin-multiplatform/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/native-android/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/native-ios/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/next/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/nuxt/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/react/rules.md +19 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/react-native/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/svelte/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/vue/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/ionic.md +18 -0
- package/.github/skills/figma-ui-mapper/references/ios.md +11 -0
- package/.github/skills/figma-ui-mapper/references/kotlin-multiplatform.md +18 -0
- package/.github/skills/figma-ui-mapper/references/native-android.md +18 -0
- package/.github/skills/figma-ui-mapper/references/native-ios.md +18 -0
- package/.github/skills/figma-ui-mapper/references/next.md +18 -0
- package/.github/skills/figma-ui-mapper/references/nuxt.md +18 -0
- package/.github/skills/figma-ui-mapper/references/react-figma-guideline.md +21 -0
- package/.github/skills/figma-ui-mapper/references/react-native.md +18 -0
- package/.github/skills/figma-ui-mapper/references/react.md +18 -0
- package/.github/skills/figma-ui-mapper/references/script-usage.md +46 -0
- package/.github/skills/figma-ui-mapper/references/svelte.md +18 -0
- package/.github/skills/figma-ui-mapper/references/vue.md +18 -0
- package/.github/skills/figma-ui-mapper/references/workflow.md +74 -0
- package/.github/skills/figma-ui-mapper/scripts/generate-page-through-figma.js +635 -0
- package/.github/skills/figma-ui-mapper/scripts/generate-react-page-through-figma.js +4 -0
- package/.github/skills/frontend-task-breakdown/SKILL.md +734 -0
- package/.github/skills/md-file-converter/SKILL.md +291 -0
- package/.github/skills/md-file-converter/config/formats.json +114 -0
- package/.github/skills/md-file-converter/extractors/extract-docx.sh +120 -0
- package/.github/skills/md-file-converter/extractors/extract-eml.py +108 -0
- package/.github/skills/md-file-converter/extractors/extract-pdf.sh +97 -0
- package/.github/skills/md-file-converter/extractors/extract-pptx.py +143 -0
- package/.github/skills/md-file-converter/extractors/extract-xlsx.py +175 -0
- package/.github/skills/md-file-converter/scripts/check-tools.sh +47 -0
- package/.github/skills/md-file-converter/scripts/extract-archive.sh +83 -0
- package/.github/skills/md-file-converter/scripts/extract-ocr.sh +77 -0
- package/.github/skills/md-file-converter/scripts/get-metadata.sh +57 -0
- package/.github/skills/md-file-converter/templates/output.md +73 -0
- package/.github/skills/md-file-converter/templates/unsupported-object.md +6 -0
- package/.github/skills/mockAPI-contract-generator/SKILL.md +607 -0
- package/.github/skills/test-case-validator/CHANGELOG.md +155 -0
- package/.github/skills/test-case-validator/CONFIGURATION.md +130 -0
- package/.github/skills/test-case-validator/EXAMPLES.md +50 -0
- package/.github/skills/test-case-validator/QUALITY_SCORING.md +98 -0
- package/.github/skills/test-case-validator/README.md +111 -0
- package/.github/skills/test-case-validator/REPORT_TEMPLATE.md +116 -0
- package/.github/skills/test-case-validator/SKILL.md +209 -0
- package/.github/skills/test-case-validator/SYSTEM_PROMPT.md +127 -0
- package/.github/skills/test-case-validator/TRACEABILITY_ENGINE.md +152 -0
- package/.github/skills/test-case-validator/VALIDATION_RULES.md +411 -0
- package/.github/skills/test-case-validator/config/default.config.yaml +62 -0
- package/.github/skills/test-case-validator/docs/ARCHITECTURE.md +66 -0
- package/.github/skills/test-case-validator/docs/EXTENDING.md +85 -0
- package/.github/skills/test-case-validator/docs/FAQ.md +88 -0
- package/.github/skills/test-case-validator/docs/VERSIONING.md +55 -0
- package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/input-brd.md +43 -0
- package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/input-test-cases.csv +9 -0
- package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/input-user-story.md +29 -0
- package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/output-report.md +303 -0
- package/.github/skills/test-case-validator/examples/example-2-automated-frontend-suite/input-spec.md +43 -0
- package/.github/skills/test-case-validator/examples/example-2-automated-frontend-suite/input-test-files-index.md +56 -0
- package/.github/skills/test-case-validator/examples/example-2-automated-frontend-suite/output-report.md +274 -0
- package/.github/skills/test-case-validator/prompts/00-applicability-resolution.md +61 -0
- package/.github/skills/test-case-validator/prompts/01-extraction-user-story.md +58 -0
- package/.github/skills/test-case-validator/prompts/02-extraction-brd.md +64 -0
- package/.github/skills/test-case-validator/prompts/03-extraction-test-cases.md +92 -0
- package/.github/skills/test-case-validator/prompts/04-traceability-matrix.md +41 -0
- package/.github/skills/test-case-validator/prompts/05-coverage-analysis.md +46 -0
- package/.github/skills/test-case-validator/prompts/06-missing-scenario-detection.md +32 -0
- package/.github/skills/test-case-validator/prompts/07-duplicate-detection.md +36 -0
- package/.github/skills/test-case-validator/prompts/08-risk-analysis.md +39 -0
- package/.github/skills/test-case-validator/prompts/09-gated-wiring-validation.md +53 -0
- package/.github/skills/test-case-validator/prompts/10-observation-report.md +56 -0
- package/.github/skills/test-case-validator/prompts/11-final-report-assembly.md +57 -0
- package/.github/skills/test-case-validator/templates/coverage-table.md +25 -0
- package/.github/skills/test-case-validator/templates/executive-summary.md +38 -0
- package/.github/skills/test-case-validator/templates/final-summary-block.md +87 -0
- package/.github/skills/test-case-validator/templates/observation-entry.md +41 -0
- package/.github/skills/test-case-validator/templates/rtm-row.md +25 -0
- package/.github/skills/validation-engine-builder/README.md +50 -0
- package/.github/skills/validation-engine-builder/SKILL.md +241 -0
- package/.github/skills/validation-engine-builder/references/core.md +158 -0
- package/.github/skills/validation-engine-builder/references/platform-angular.md +166 -0
- package/.github/skills/validation-engine-builder/references/platform-flutter.md +118 -0
- package/.github/skills/validation-engine-builder/references/platform-react-native.md +170 -0
- package/.github/skills/validation-engine-builder/references/platform-react.md +94 -0
- package/.github/skills/validation-engine-builder/scripts/apply-to-project.js +80 -0
- package/.github/skills/validation-engine-builder/scripts/generate-angular.js +271 -0
- package/.github/skills/validation-engine-builder/scripts/generate-flutter.js +298 -0
- package/.github/skills/validation-engine-builder/scripts/generate-react-native.js +217 -0
- package/.github/skills/validation-engine-builder/scripts/generate-react.js +163 -0
- package/.github/skills/validation-engine-builder/scripts/install-deps.js +53 -0
- package/.github/skills/validation-engine-builder/scripts/shared/detect-platform.js +68 -0
- package/.github/skills/validation-engine-builder/scripts/shared/npm-deps.js +103 -0
- package/.github/skills/validation-engine-builder/scripts/shared/rhf-hook.js +43 -0
- package/.github/skills/validation-engine-builder/scripts/shared/ts-messages-regex.js +62 -0
- package/.github/skills/validation-engine-builder/scripts/shared/util.js +44 -0
- package/.github/skills/validation-engine-builder/scripts/shared/yup-schemas.js +80 -0
- package/.github/skills/validation-engine-builder/template.md +73 -0
- package/.github/skills/validation-engine-builder/templates/messages.json +22 -0
- package/.github/skills/validation-engine-builder/templates/regex.json +16 -0
- package/.github/skills/validation-engine-builder/templates/schemas.json +48 -0
- package/bin/index.js +145 -0
- package/package.json +22 -0
- package/readme.md +0 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# API Envelope Patterns Reference
|
|
2
|
+
|
|
3
|
+
Used by Phase 4.6 of feature-generator to generate the DataSource class body.
|
|
4
|
+
Select the pattern that matches `fingerprint.apiLib` + `fingerprint.envelopeStyle`.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Pattern 1 — Axios + mb-operationId envelope
|
|
9
|
+
|
|
10
|
+
**When**: `fingerprint.apiLib = "axios"` AND `fingerprint.envelopeStyle = "mb-operationId"`
|
|
11
|
+
|
|
12
|
+
This is the most common pattern in this repository. The request body is wrapped in a
|
|
13
|
+
`mb.rq.reqdata` envelope with an `operationId` field. The response is unwrapped from
|
|
14
|
+
`mb.rs.resdata` by the shared Axios response interceptor before it reaches the datasource.
|
|
15
|
+
|
|
16
|
+
### DataSource template
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { apiClient } from '<fingerprint.apiClientImport>';
|
|
20
|
+
import { <endpointConstantName>_ENDPOINTS } from './<screenName>Endpoints'; // screenName, not featureFolderName
|
|
21
|
+
import { mockConfig } from './mockConfig';
|
|
22
|
+
import type { Fetch<ScreenName>Params } from '<relative-path-to-domainRepo>';
|
|
23
|
+
import mockData from '<relative-path-to-mockJson>';
|
|
24
|
+
|
|
25
|
+
function delay(ms: number): Promise<void> {
|
|
26
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function buildEnvelope(operationId: string, reqdata: Record<string, unknown>): object {
|
|
30
|
+
return { mb: { operationId, rq: { reqdata } } };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class <ScreenName>ApiDataSource {
|
|
34
|
+
async fetch<ScreenName>(params: Fetch<ScreenName>Params): Promise<Record<string, unknown>> {
|
|
35
|
+
const { <OperationId> } = mockConfig.apis;
|
|
36
|
+
if (mockConfig.<fingerprint.mockGlobalFlag> || <OperationId>.mockEnabled) {
|
|
37
|
+
await delay(mockConfig.<fingerprint.mockDelayField>);
|
|
38
|
+
return mockData as Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
const body = buildEnvelope('<OperationId>', {
|
|
41
|
+
// Map camelCase params to API-casing from spec requestBody
|
|
42
|
+
ApiField: params.camelCaseParam,
|
|
43
|
+
});
|
|
44
|
+
const response = await apiClient.post<Record<string, unknown>>(
|
|
45
|
+
<endpointConstantName>_ENDPOINTS.FETCH,
|
|
46
|
+
body,
|
|
47
|
+
);
|
|
48
|
+
return response.data;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Endpoint constant template
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// Base URL is set in the shared apiClient. Path must NOT start with '/'.
|
|
57
|
+
export const <endpointConstantName>_ENDPOINTS = {
|
|
58
|
+
FETCH: 'api/v1/<service-path>/<OperationId>',
|
|
59
|
+
} as const;
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Notes
|
|
63
|
+
|
|
64
|
+
- The `buildEnvelope` function MUST use the exact field names detected in existing
|
|
65
|
+
datasource files. If the existing code uses `operationid` (lowercase i), use that.
|
|
66
|
+
- `response.data` is already the unwrapped `resdata` payload after the interceptor runs.
|
|
67
|
+
- `globalMockEnabled` check MUST appear BEFORE the per-API `mockEnabled` check.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Pattern 2 — Axios + mb-operationid-lowercase envelope
|
|
72
|
+
|
|
73
|
+
**When**: `fingerprint.apiLib = "axios"` AND `fingerprint.envelopeStyle = "mb-operationid-lowercase"`
|
|
74
|
+
|
|
75
|
+
Some services use `operationid` (all lowercase) in the envelope AND include additional
|
|
76
|
+
fields such as `reqtoken`, `appinfo`, and `deviceinfo`. Detected by reading the
|
|
77
|
+
`buildEnvelope` helper (or inline envelope construction) in existing datasource files.
|
|
78
|
+
|
|
79
|
+
**Detection rule**: If the existing buildEnvelope contains `reqtoken` or `appinfo` or
|
|
80
|
+
`deviceinfo`, those fields MUST be included verbatim in the generated code. Do NOT
|
|
81
|
+
simplify or omit them — the server will reject requests with missing fields.
|
|
82
|
+
|
|
83
|
+
### DataSource template
|
|
84
|
+
|
|
85
|
+
Same as Pattern 1 except the `buildEnvelope` function uses this shape:
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
function buildEnvelope(operationid: string, reqdata: Record<string, unknown>): object {
|
|
89
|
+
return {
|
|
90
|
+
mb: {
|
|
91
|
+
operationid, // lowercase 'i' — NOT operationId
|
|
92
|
+
reqtoken: null, // always null for client-originated requests
|
|
93
|
+
rq: {
|
|
94
|
+
appinfo: {
|
|
95
|
+
appId: 'APP_ID', // match exact key/value from detected file
|
|
96
|
+
appVersion: '1.0.0',
|
|
97
|
+
},
|
|
98
|
+
deviceinfo: {
|
|
99
|
+
deviceId: 'MOBILE-APP', // match exact value from detected file
|
|
100
|
+
deviceType: 'MOBILE',
|
|
101
|
+
},
|
|
102
|
+
reqdata,
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Important: always copy from detected source
|
|
110
|
+
|
|
111
|
+
After detection, open the file containing the existing `buildEnvelope` and copy its
|
|
112
|
+
entire function body. Do not reconstruct from memory. Differences in field names,
|
|
113
|
+
casing, or nesting will cause server-side validation failures.
|
|
114
|
+
|
|
115
|
+
If the envelope is inlined (not a helper function), find the `apiClient.post()` call
|
|
116
|
+
and copy the entire body literal.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Pattern 3 — Axios + no envelope (plain body)
|
|
121
|
+
|
|
122
|
+
**When**: `fingerprint.apiLib = "axios"` AND `fingerprint.envelopeStyle = "none"`
|
|
123
|
+
|
|
124
|
+
The request body is passed directly without any wrapper.
|
|
125
|
+
|
|
126
|
+
### DataSource template
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
import { apiClient } from '<fingerprint.apiClientImport>';
|
|
130
|
+
import { <endpointConstantName>_ENDPOINTS } from './<screenName>Endpoints'; // screenName, not featureFolderName
|
|
131
|
+
import { mockConfig } from './mockConfig';
|
|
132
|
+
import type { Fetch<ScreenName>Params } from '<relative-path-to-domainRepo>';
|
|
133
|
+
import mockData from '<relative-path-to-mockJson>';
|
|
134
|
+
|
|
135
|
+
function delay(ms: number): Promise<void> {
|
|
136
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export class <ScreenName>ApiDataSource {
|
|
140
|
+
async fetch<ScreenName>(params: Fetch<ScreenName>Params): Promise<Record<string, unknown>> {
|
|
141
|
+
const { <OperationId> } = mockConfig.apis;
|
|
142
|
+
if (mockConfig.<fingerprint.mockGlobalFlag> || <OperationId>.mockEnabled) {
|
|
143
|
+
await delay(mockConfig.<fingerprint.mockDelayField>);
|
|
144
|
+
return mockData as Record<string, unknown>;
|
|
145
|
+
}
|
|
146
|
+
const response = await apiClient.post<Record<string, unknown>>(
|
|
147
|
+
<endpointConstantName>_ENDPOINTS.FETCH,
|
|
148
|
+
{
|
|
149
|
+
// Flat request body — API field names from spec requestBody
|
|
150
|
+
ApiField: params.camelCaseParam,
|
|
151
|
+
},
|
|
152
|
+
);
|
|
153
|
+
return response.data;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Pattern 4 — Fetch API + no envelope
|
|
161
|
+
|
|
162
|
+
**When**: `fingerprint.apiLib = "fetch"` AND `fingerprint.envelopeStyle = "none"`
|
|
163
|
+
|
|
164
|
+
Uses the native `fetch()` API directly. No shared client file.
|
|
165
|
+
|
|
166
|
+
### DataSource template
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import type { Fetch<ScreenName>Params } from '<relative-path-to-domainRepo>';
|
|
170
|
+
import mockData from '<relative-path-to-mockJson>';
|
|
171
|
+
|
|
172
|
+
const BASE_URL = '<detected base URL from existing fetch calls>';
|
|
173
|
+
|
|
174
|
+
export class <ScreenName>ApiDataSource {
|
|
175
|
+
async fetch<ScreenName>(params: Fetch<ScreenName>Params): Promise<Record<string, unknown>> {
|
|
176
|
+
const response = await fetch(`${BASE_URL}/<spec.apiUrl>`, {
|
|
177
|
+
method: '<spec.httpMethod>',
|
|
178
|
+
headers: {
|
|
179
|
+
'Content-Type': 'application/json',
|
|
180
|
+
// Add headers matching existing fetch calls in the codebase
|
|
181
|
+
},
|
|
182
|
+
body: JSON.stringify({
|
|
183
|
+
ApiField: params.camelCaseParam,
|
|
184
|
+
}),
|
|
185
|
+
});
|
|
186
|
+
if (!response.ok) {
|
|
187
|
+
throw { statusCode: response.status, message: `HTTP ${response.status}` };
|
|
188
|
+
}
|
|
189
|
+
return response.json() as Promise<Record<string, unknown>>;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Notes
|
|
195
|
+
|
|
196
|
+
- Do NOT create a shared `fetch` wrapper if one does not already exist.
|
|
197
|
+
- Import any auth token injection from the detected token storage utility.
|
|
198
|
+
- For GET requests: omit `body`, append params as query string.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Pattern 5 — RTK Query
|
|
203
|
+
|
|
204
|
+
**When**: `fingerprint.apiLib = "rtk-query"`
|
|
205
|
+
|
|
206
|
+
RTK Query uses endpoint definitions, not classes. Generate an endpoint injected into
|
|
207
|
+
the existing base API slice.
|
|
208
|
+
|
|
209
|
+
### Endpoint template
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
// Injected into the existing base API slice detected by fingerprint.apiClientFile
|
|
213
|
+
|
|
214
|
+
import { baseApi } from '<fingerprint.apiClientImport>';
|
|
215
|
+
import type { <ScreenName>Item } from '<relative-path-to-domainModel>';
|
|
216
|
+
import { map<ScreenName>FromDto } from '<relative-path-to-mapper>';
|
|
217
|
+
|
|
218
|
+
export interface Fetch<ScreenName>Args {
|
|
219
|
+
// camelCase params from spec requestBody
|
|
220
|
+
clientCode: number;
|
|
221
|
+
sessionId: string;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export const <screenNameCamelCase>Api = baseApi.injectEndpoints({
|
|
225
|
+
endpoints: (builder) => ({
|
|
226
|
+
fetch<ScreenName>: builder.query<<ScreenName>Item[], Fetch<ScreenName>Args>({
|
|
227
|
+
query: (args) => ({
|
|
228
|
+
url: '<spec.apiUrl>',
|
|
229
|
+
method: '<spec.httpMethod>',
|
|
230
|
+
body: {
|
|
231
|
+
// API-casing from spec requestBody
|
|
232
|
+
ClientCode: args.clientCode,
|
|
233
|
+
SessionID: args.sessionId,
|
|
234
|
+
},
|
|
235
|
+
}),
|
|
236
|
+
transformResponse: (response: Record<string, unknown>) => {
|
|
237
|
+
const items = (response.Data ?? response.data ?? []) as Record<string, unknown>[];
|
|
238
|
+
return items.map(map<ScreenName>FromDto);
|
|
239
|
+
},
|
|
240
|
+
}),
|
|
241
|
+
}),
|
|
242
|
+
overrideExisting: false,
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
export const { useFetch<ScreenName>Query } = <screenNameCamelCase>Api;
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Notes
|
|
249
|
+
|
|
250
|
+
- There is NO slice file for RTK Query features — the thunk/selector is replaced by
|
|
251
|
+
the generated hook.
|
|
252
|
+
- Do NOT generate a separate datasource class. The endpoint builder is the datasource.
|
|
253
|
+
- Do NOT generate selectors — RTK Query hooks provide isLoading, data, error directly.
|
|
254
|
+
- The screen component uses `useFetch<ScreenName>Query(params)` instead of dispatching a thunk.
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Pattern 6 — React Query / TanStack Query
|
|
259
|
+
|
|
260
|
+
**When**: `fingerprint.apiLib = "react-query"`
|
|
261
|
+
|
|
262
|
+
React Query uses custom hooks with `useQuery` or `useMutation`.
|
|
263
|
+
|
|
264
|
+
### Query hook template
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
import { useQuery, type UseQueryResult } from '@tanstack/react-query';
|
|
268
|
+
import { apiClient } from '<fingerprint.apiClientImport>';
|
|
269
|
+
import type { <ScreenName>Item } from '<relative-path-to-domainModel>';
|
|
270
|
+
import { map<ScreenName>FromDto } from '<relative-path-to-mapper>';
|
|
271
|
+
|
|
272
|
+
// <screenNameCamelCase> = camelCase of screenName, e.g. TransactionHistory → transactionHistory
|
|
273
|
+
export const <screenNameCamelCase>QueryKeys = {
|
|
274
|
+
all: ['<screenNameCamelCase>'] as const,
|
|
275
|
+
list: (clientCode: number) => ['<screenNameCamelCase>', 'list', clientCode] as const,
|
|
276
|
+
} as const;
|
|
277
|
+
|
|
278
|
+
async function fetch<ScreenName>(params: {
|
|
279
|
+
clientCode: number;
|
|
280
|
+
sessionId: string;
|
|
281
|
+
}): Promise<<ScreenName>Item[]> {
|
|
282
|
+
const response = await apiClient.post<Record<string, unknown>>(
|
|
283
|
+
'<spec.apiUrl>',
|
|
284
|
+
{ ClientCode: params.clientCode, SessionID: params.sessionId },
|
|
285
|
+
);
|
|
286
|
+
const items = (response.data.Data ?? response.data.data ?? []) as Record<string, unknown>[];
|
|
287
|
+
return items.map(map<ScreenName>FromDto);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export function use<ScreenName>(params: {
|
|
291
|
+
clientCode: number;
|
|
292
|
+
sessionId: string;
|
|
293
|
+
}): UseQueryResult<<ScreenName>Item[]> {
|
|
294
|
+
return useQuery({
|
|
295
|
+
queryKey: <screenNameCamelCase>QueryKeys.list(params.clientCode),
|
|
296
|
+
queryFn: () => fetch<ScreenName>(params),
|
|
297
|
+
staleTime: 5 * 60 * 1000,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Notes
|
|
303
|
+
|
|
304
|
+
- There is NO slice or thunk — state comes from the React Query cache.
|
|
305
|
+
- Do NOT generate selectors or Redux-related files.
|
|
306
|
+
- The screen component uses `const { data, isLoading, error, refetch } = use<ScreenName>(params)`.
|
|
307
|
+
- Check if the project uses TanStack Query v4 (`@tanstack/react-query`) or v3 (`react-query`).
|
|
308
|
+
The import path differs. Detect from package.json.
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Request Body Field Mapping Rules (all patterns)
|
|
313
|
+
|
|
314
|
+
The spec `requestBody` uses API-casing (typically PascalCase or UPPER_SNAKE).
|
|
315
|
+
The domain `Params` interface uses camelCase. The datasource maps between them:
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
Spec requestBody: Domain Params:
|
|
319
|
+
"ClientCode": 12345 → clientCode: number
|
|
320
|
+
"SessionID": "abc" → sessionId: string
|
|
321
|
+
"FamilyFlag": 0 → familyFlag: 0 | 1
|
|
322
|
+
"PARAM1": "" → param1?: string
|
|
323
|
+
"FilterColumns": "" → filterColumns?: string
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Always use the EXACT field names from the spec on the request side. Never rename
|
|
327
|
+
API fields in the datasource — mappers and DTOs handle inbound casing, not the datasource.
|