@thethracian/oxlint-config 0.2.0 → 0.3.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.
- package/CHANGELOG.md +13 -0
- package/README.md +125 -19
- package/dist/codemod-fix/cli.d.ts +3 -0
- package/dist/codemod-fix/cli.d.ts.map +1 -0
- package/dist/codemod-fix/cli.js +22 -0
- package/dist/codemod-fix/cli.js.map +1 -0
- package/dist/codemod-fix/index.d.ts +44 -0
- package/dist/codemod-fix/index.d.ts.map +1 -0
- package/dist/codemod-fix/index.js +110 -0
- package/dist/codemod-fix/index.js.map +1 -0
- package/dist/codemods/arrow-body-style.d.ts +7 -0
- package/dist/codemods/arrow-body-style.d.ts.map +1 -0
- package/dist/codemods/arrow-body-style.js +106 -0
- package/dist/codemods/arrow-body-style.js.map +1 -0
- package/dist/codemods/comment-format.d.ts +24 -0
- package/dist/codemods/comment-format.d.ts.map +1 -0
- package/dist/codemods/comment-format.js +100 -0
- package/dist/codemods/comment-format.js.map +1 -0
- package/dist/codemods/explicit-return-types.d.ts +7 -0
- package/dist/codemods/explicit-return-types.d.ts.map +1 -0
- package/dist/codemods/explicit-return-types.js +350 -0
- package/dist/codemods/explicit-return-types.js.map +1 -0
- package/dist/codemods/format-file-header.d.ts +7 -0
- package/dist/codemods/format-file-header.d.ts.map +1 -0
- package/dist/codemods/format-file-header.js +163 -0
- package/dist/codemods/format-file-header.js.map +1 -0
- package/dist/codemods/format-jsdoc-comments.d.ts +7 -0
- package/dist/codemods/format-jsdoc-comments.d.ts.map +1 -0
- package/dist/codemods/format-jsdoc-comments.js +129 -0
- package/dist/codemods/format-jsdoc-comments.js.map +1 -0
- package/dist/codemods/function-declarations.d.ts +7 -0
- package/dist/codemods/function-declarations.d.ts.map +1 -0
- package/dist/codemods/function-declarations.js +202 -0
- package/dist/codemods/function-declarations.js.map +1 -0
- package/dist/codemods/inline-export-lists.d.ts +7 -0
- package/dist/codemods/inline-export-lists.d.ts.map +1 -0
- package/dist/codemods/inline-export-lists.js +168 -0
- package/dist/codemods/inline-export-lists.js.map +1 -0
- package/dist/codemods/internal-export-docs.d.ts +7 -0
- package/dist/codemods/internal-export-docs.d.ts.map +1 -0
- package/dist/codemods/internal-export-docs.js +93 -0
- package/dist/codemods/internal-export-docs.js.map +1 -0
- package/dist/codemods/no-ternary-branch-initializers.d.ts +14 -0
- package/dist/codemods/no-ternary-branch-initializers.d.ts.map +1 -0
- package/dist/codemods/no-ternary-branch-initializers.js +240 -0
- package/dist/codemods/no-ternary-branch-initializers.js.map +1 -0
- package/dist/codemods/no-ternary-variable-initializers.d.ts +14 -0
- package/dist/codemods/no-ternary-variable-initializers.d.ts.map +1 -0
- package/dist/codemods/no-ternary-variable-initializers.js +235 -0
- package/dist/codemods/no-ternary-variable-initializers.js.map +1 -0
- package/dist/codemods/no-ternary.d.ts +7 -0
- package/dist/codemods/no-ternary.d.ts.map +1 -0
- package/dist/codemods/no-ternary.js +215 -0
- package/dist/codemods/no-ternary.js.map +1 -0
- package/dist/codemods/rename-acronyms.d.ts +8 -0
- package/dist/codemods/rename-acronyms.d.ts.map +1 -0
- package/dist/codemods/rename-acronyms.js +193 -0
- package/dist/codemods/rename-acronyms.js.map +1 -0
- package/dist/codemods/run.d.ts +2 -0
- package/dist/codemods/run.d.ts.map +1 -0
- package/dist/codemods/run.js +14 -0
- package/dist/codemods/run.js.map +1 -0
- package/dist/codemods/sort-imports.d.ts +7 -0
- package/dist/codemods/sort-imports.d.ts.map +1 -0
- package/dist/codemods/sort-imports.js +235 -0
- package/dist/codemods/sort-imports.js.map +1 -0
- package/dist/index.d.ts +30 -96
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +157 -95
- package/dist/index.js.map +1 -1
- package/dist/rules/acronym-case.d.ts +7 -3
- package/dist/rules/acronym-case.d.ts.map +1 -1
- package/dist/rules/acronym-case.js +129 -120
- package/dist/rules/acronym-case.js.map +1 -1
- package/dist/rules/acronyms-1.d.ts +3 -0
- package/dist/rules/acronyms-1.d.ts.map +1 -0
- package/dist/rules/acronyms-1.js +407 -0
- package/dist/rules/acronyms-1.js.map +1 -0
- package/dist/rules/acronyms-2.d.ts +3 -0
- package/dist/rules/acronyms-2.d.ts.map +1 -0
- package/dist/rules/acronyms-2.js +407 -0
- package/dist/rules/acronyms-2.js.map +1 -0
- package/dist/rules/acronyms-3.d.ts +3 -0
- package/dist/rules/acronyms-3.d.ts.map +1 -0
- package/dist/rules/acronyms-3.js +407 -0
- package/dist/rules/acronyms-3.js.map +1 -0
- package/dist/rules/acronyms-4.d.ts +3 -0
- package/dist/rules/acronyms-4.d.ts.map +1 -0
- package/dist/rules/acronyms-4.js +377 -0
- package/dist/rules/acronyms-4.js.map +1 -0
- package/dist/rules/acronyms.d.ts +1 -8
- package/dist/rules/acronyms.d.ts.map +1 -1
- package/dist/rules/acronyms.js +14 -1578
- package/dist/rules/acronyms.js.map +1 -1
- package/dist/rules/boolean-prefix.d.ts +11 -2
- package/dist/rules/boolean-prefix.d.ts.map +1 -1
- package/dist/rules/boolean-prefix.js +95 -59
- package/dist/rules/boolean-prefix.js.map +1 -1
- package/dist/rules/camel-case-identifiers.d.ts +3 -4
- package/dist/rules/camel-case-identifiers.d.ts.map +1 -1
- package/dist/rules/camel-case-identifiers.js +59 -40
- package/dist/rules/camel-case-identifiers.js.map +1 -1
- package/dist/rules/char-class.d.ts +26 -13
- package/dist/rules/char-class.d.ts.map +1 -1
- package/dist/rules/char-class.js +56 -24
- package/dist/rules/char-class.js.map +1 -1
- package/dist/rules/diagnostic-guidance.d.ts +91 -0
- package/dist/rules/diagnostic-guidance.d.ts.map +1 -0
- package/dist/rules/diagnostic-guidance.js +243 -0
- package/dist/rules/diagnostic-guidance.js.map +1 -0
- package/dist/rules/effect-default-ast.d.ts +89 -0
- package/dist/rules/effect-default-ast.d.ts.map +1 -0
- package/dist/rules/effect-default-ast.js +208 -0
- package/dist/rules/effect-default-ast.js.map +1 -0
- package/dist/rules/effect-default-compat-rules.d.ts +76 -0
- package/dist/rules/effect-default-compat-rules.d.ts.map +1 -0
- package/dist/rules/effect-default-compat-rules.js +270 -0
- package/dist/rules/effect-default-compat-rules.js.map +1 -0
- package/dist/rules/effect-default-env-rules.d.ts +60 -0
- package/dist/rules/effect-default-env-rules.d.ts.map +1 -0
- package/dist/rules/effect-default-env-rules.js +259 -0
- package/dist/rules/effect-default-env-rules.js.map +1 -0
- package/dist/rules/effect-default-fiber-helpers.d.ts +13 -0
- package/dist/rules/effect-default-fiber-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-fiber-helpers.js +76 -0
- package/dist/rules/effect-default-fiber-helpers.js.map +1 -0
- package/dist/rules/effect-default-floating-helpers.d.ts +7 -0
- package/dist/rules/effect-default-floating-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-floating-helpers.js +113 -0
- package/dist/rules/effect-default-floating-helpers.js.map +1 -0
- package/dist/rules/effect-default-helpers.d.ts +8 -32
- package/dist/rules/effect-default-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-helpers.js +11 -458
- package/dist/rules/effect-default-helpers.js.map +1 -1
- package/dist/rules/effect-default-resource-helpers.d.ts +18 -4
- package/dist/rules/effect-default-resource-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-resource-helpers.js +30 -13
- package/dist/rules/effect-default-resource-helpers.js.map +1 -1
- package/dist/rules/effect-default-safety-helpers.d.ts +43 -0
- package/dist/rules/effect-default-safety-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-safety-helpers.js +126 -0
- package/dist/rules/effect-default-safety-helpers.js.map +1 -0
- package/dist/rules/effect-default-scan-helpers.d.ts +43 -0
- package/dist/rules/effect-default-scan-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-scan-helpers.js +141 -0
- package/dist/rules/effect-default-scan-helpers.js.map +1 -0
- package/dist/rules/effect-default-schema-helpers.d.ts +37 -0
- package/dist/rules/effect-default-schema-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-schema-helpers.js +104 -0
- package/dist/rules/effect-default-schema-helpers.js.map +1 -0
- package/dist/rules/effect-default-test-helpers.d.ts +18 -4
- package/dist/rules/effect-default-test-helpers.d.ts.map +1 -1
- package/dist/rules/effect-default-test-helpers.js +41 -20
- package/dist/rules/effect-default-test-helpers.js.map +1 -1
- package/dist/rules/effect-default-workflow-helpers.d.ts +91 -0
- package/dist/rules/effect-default-workflow-helpers.d.ts.map +1 -0
- package/dist/rules/effect-default-workflow-helpers.js +247 -0
- package/dist/rules/effect-default-workflow-helpers.js.map +1 -0
- package/dist/rules/effect-default.d.ts +1 -1
- package/dist/rules/effect-default.d.ts.map +1 -1
- package/dist/rules/effect-default.js +198 -637
- package/dist/rules/effect-default.js.map +1 -1
- package/dist/rules/effect-exported-declarations.d.ts +19 -0
- package/dist/rules/effect-exported-declarations.d.ts.map +1 -0
- package/dist/rules/effect-exported-declarations.js +237 -0
- package/dist/rules/effect-exported-declarations.js.map +1 -0
- package/dist/rules/effect-path-options.d.ts +49 -11
- package/dist/rules/effect-path-options.d.ts.map +1 -1
- package/dist/rules/effect-path-options.js +85 -52
- package/dist/rules/effect-path-options.js.map +1 -1
- package/dist/rules/effect-rule-aliases.d.ts +55 -0
- package/dist/rules/effect-rule-aliases.d.ts.map +1 -0
- package/dist/rules/effect-rule-aliases.js +278 -0
- package/dist/rules/effect-rule-aliases.js.map +1 -0
- package/dist/rules/effect-rule-core.d.ts +46 -24
- package/dist/rules/effect-rule-core.d.ts.map +1 -1
- package/dist/rules/effect-rule-core.js +263 -303
- package/dist/rules/effect-rule-core.js.map +1 -1
- package/dist/rules/effect-rule-names.d.ts +12 -3
- package/dist/rules/effect-rule-names.d.ts.map +1 -1
- package/dist/rules/effect-rule-names.js +15 -3
- package/dist/rules/effect-rule-names.js.map +1 -1
- package/dist/rules/effect-source-comments.d.ts +7 -0
- package/dist/rules/effect-source-comments.d.ts.map +1 -0
- package/dist/rules/effect-source-comments.js +227 -0
- package/dist/rules/effect-source-comments.js.map +1 -0
- package/dist/rules/effect-source-helpers.d.ts +4 -9
- package/dist/rules/effect-source-helpers.d.ts.map +1 -1
- package/dist/rules/effect-source-helpers.js +7 -333
- package/dist/rules/effect-source-helpers.js.map +1 -1
- package/dist/rules/effect-source-navigation.d.ts +25 -0
- package/dist/rules/effect-source-navigation.d.ts.map +1 -0
- package/dist/rules/effect-source-navigation.js +244 -0
- package/dist/rules/effect-source-navigation.js.map +1 -0
- package/dist/rules/effect-source-scan.d.ts +30 -7
- package/dist/rules/effect-source-scan.d.ts.map +1 -1
- package/dist/rules/effect-source-scan.js +377 -297
- package/dist/rules/effect-source-scan.js.map +1 -1
- package/dist/rules/effect-strict-ast-specs.d.ts +8 -0
- package/dist/rules/effect-strict-ast-specs.d.ts.map +1 -0
- package/dist/rules/effect-strict-ast-specs.js +166 -0
- package/dist/rules/effect-strict-ast-specs.js.map +1 -0
- package/dist/rules/effect-strict-boundary-helpers.d.ts +25 -0
- package/dist/rules/effect-strict-boundary-helpers.d.ts.map +1 -0
- package/dist/rules/effect-strict-boundary-helpers.js +127 -0
- package/dist/rules/effect-strict-boundary-helpers.js.map +1 -0
- package/dist/rules/effect-strict-core-specs.d.ts +8 -0
- package/dist/rules/effect-strict-core-specs.d.ts.map +1 -0
- package/dist/rules/effect-strict-core-specs.js +334 -0
- package/dist/rules/effect-strict-core-specs.js.map +1 -0
- package/dist/rules/effect-strict-external-helpers.d.ts +25 -0
- package/dist/rules/effect-strict-external-helpers.d.ts.map +1 -0
- package/dist/rules/effect-strict-external-helpers.js +87 -0
- package/dist/rules/effect-strict-external-helpers.js.map +1 -0
- package/dist/rules/effect-strict-helpers.d.ts +75 -33
- package/dist/rules/effect-strict-helpers.d.ts.map +1 -1
- package/dist/rules/effect-strict-helpers.js +124 -246
- package/dist/rules/effect-strict-helpers.js.map +1 -1
- package/dist/rules/effect-strict-internals.d.ts +198 -0
- package/dist/rules/effect-strict-internals.d.ts.map +1 -0
- package/dist/rules/effect-strict-internals.js +477 -0
- package/dist/rules/effect-strict-internals.js.map +1 -0
- package/dist/rules/effect-strict-segment-helpers.d.ts +79 -0
- package/dist/rules/effect-strict-segment-helpers.d.ts.map +1 -0
- package/dist/rules/effect-strict-segment-helpers.js +308 -0
- package/dist/rules/effect-strict-segment-helpers.js.map +1 -0
- package/dist/rules/effect-strict.d.ts +1 -1
- package/dist/rules/effect-strict.d.ts.map +1 -1
- package/dist/rules/effect-strict.js +10 -661
- package/dist/rules/effect-strict.js.map +1 -1
- package/dist/rules/max-import-depth.d.ts +2 -2
- package/dist/rules/max-import-depth.d.ts.map +1 -1
- package/dist/rules/max-import-depth.js +52 -17
- package/dist/rules/max-import-depth.js.map +1 -1
- package/dist/rules/max-line-length.d.ts +9 -2
- package/dist/rules/max-line-length.d.ts.map +1 -1
- package/dist/rules/max-line-length.js +62 -7
- package/dist/rules/max-line-length.js.map +1 -1
- package/dist/rules/no-commented-out-code.d.ts +3 -7
- package/dist/rules/no-commented-out-code.d.ts.map +1 -1
- package/dist/rules/no-commented-out-code.js +157 -102
- package/dist/rules/no-commented-out-code.js.map +1 -1
- package/dist/rules/pascal-case-types.d.ts +1 -1
- package/dist/rules/pascal-case-types.d.ts.map +1 -1
- package/dist/rules/pascal-case-types.js +65 -46
- package/dist/rules/pascal-case-types.js.map +1 -1
- package/dist/rules/plugin-commented-out-code-rule.d.ts +32 -0
- package/dist/rules/plugin-commented-out-code-rule.d.ts.map +1 -0
- package/dist/rules/plugin-commented-out-code-rule.js +135 -0
- package/dist/rules/plugin-commented-out-code-rule.js.map +1 -0
- package/dist/rules/plugin.d.ts +3 -121
- package/dist/rules/plugin.d.ts.map +1 -1
- package/dist/rules/plugin.js +195 -201
- package/dist/rules/plugin.js.map +1 -1
- package/dist/rules/private-underscore.d.ts +1 -1
- package/dist/rules/private-underscore.d.ts.map +1 -1
- package/dist/rules/private-underscore.js +11 -4
- package/dist/rules/private-underscore.js.map +1 -1
- package/dist/rules/require-file-doc.d.ts +5 -6
- package/dist/rules/require-file-doc.d.ts.map +1 -1
- package/dist/rules/require-file-doc.js +127 -78
- package/dist/rules/require-file-doc.js.map +1 -1
- package/dist/rules/require-function-doc-ignored-text.d.ts +7 -0
- package/dist/rules/require-function-doc-ignored-text.d.ts.map +1 -0
- package/dist/rules/require-function-doc-ignored-text.js +67 -0
- package/dist/rules/require-function-doc-ignored-text.js.map +1 -0
- package/dist/rules/require-function-doc-local-exports.d.ts +7 -0
- package/dist/rules/require-function-doc-local-exports.d.ts.map +1 -0
- package/dist/rules/require-function-doc-local-exports.js +114 -0
- package/dist/rules/require-function-doc-local-exports.js.map +1 -0
- package/dist/rules/require-function-doc.d.ts +3 -18
- package/dist/rules/require-function-doc.d.ts.map +1 -1
- package/dist/rules/require-function-doc.js +404 -218
- package/dist/rules/require-function-doc.js.map +1 -1
- package/dist/rules/source-cache.d.ts +19 -0
- package/dist/rules/source-cache.d.ts.map +1 -0
- package/dist/rules/source-cache.js +63 -0
- package/dist/rules/source-cache.js.map +1 -0
- package/package.json +15 -10
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/* -------------------------------------------------------------------------- */
|
|
2
|
+
/* Core opt-in strict custom Effect lint rule specs. */
|
|
3
|
+
/* -------------------------------------------------------------------------- */
|
|
4
|
+
import { exportedDeclarationTexts, stripCommentsAndStrings } from './effect-source-helpers.js';
|
|
5
|
+
import { hasAsyncPushWithoutBuffer, hasBoundaryDataWithoutSchema, hasCommandHandlerWithoutSchema, hasDuplicateLayerInstance, hasEnsuringCleanupWithoutOnExit, hasExternalEffectWithoutSpan, hasExternalEffectWithoutTimeout, hasHTTPClientResponseWithoutSchema, hasHTTPServerRequestWithoutSchema, hasIdempotentExternalEffectWithoutRetry, hasLayerFactory, hasLiveTestService, hasNPlusOneWithoutBatchedResolver, hasOutputBoundaryWithoutSchema, hasPersistenceReadWithoutSchema, hasRealTestService, hasSharedMutableStateWithoutRef, hasSharedResourceForEachWithoutSemaphore, hasTimeCodeWithoutTestClock, hasUnbatchedResolver, hasUnprovidedServiceInEffectTest, hasUnsafeResourceStream, hasUnscopedResourceLayer, hasUnscopedResourceLoop, hasUnterminatedLongRunningStream, } from './effect-strict-helpers.js';
|
|
6
|
+
import { hasDirectPlatformAccess, hasEffectSignal, hasExportedRunPromiseAPI, hasPromiseReturningPublicAPI, hasRetryScheduleWithoutJitter, hasRunSyncInServerRequestHandler, hasRuntimeCall, publicAPIDeclarationSignature, } from './effect-strict-internals.js';
|
|
7
|
+
import { isConfiguredPath, isEffectTestPath, isUnitTestPath } from './effect-path-options.js';
|
|
8
|
+
import { hasRunForkWithoutObserver } from './effect-default-helpers.js';
|
|
9
|
+
/**
|
|
10
|
+
* Internal helper exported for package-local composition.
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export const effectStrictCoreSpecs = [
|
|
15
|
+
{
|
|
16
|
+
check: (source, context) => hasRuntimeCall(source) &&
|
|
17
|
+
!hasExportedRunPromiseAPI(source) &&
|
|
18
|
+
!hasRunForkWithoutObserver(source) &&
|
|
19
|
+
!isEffectTestPath(context) &&
|
|
20
|
+
!isConfiguredPath(context, 'entrypoints'),
|
|
21
|
+
message: 'Run Effect programs only from configured entrypoints.',
|
|
22
|
+
name: 'effect-no-run-outside-entrypoints',
|
|
23
|
+
tokens: ['Effect', 'effect', 'runMain'],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
check: (source, context) => isConfiguredPath(context, 'entrypoints') &&
|
|
27
|
+
/Effect\.run(?:Promise|Sync|Fork)/.test(stripCommentsAndStrings(source)),
|
|
28
|
+
message: 'Entrypoints should use the platform runMain boundary instead of raw Effect runners.',
|
|
29
|
+
name: 'effect-require-platform-runmain-at-entrypoints',
|
|
30
|
+
tokens: ['Effect.run', 'effect/Effect', 'runPromise', 'runSync', 'runFork'],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
check: hasRunSyncInServerRequestHandler,
|
|
34
|
+
message: 'Server handlers must not synchronously run Effects.',
|
|
35
|
+
name: 'effect-no-runSync-in-server-request-handlers',
|
|
36
|
+
tokens: ['Effect.runSync'],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
check: hasPromiseReturningPublicAPI,
|
|
40
|
+
message: 'Public APIs should expose Effect return types instead of Promise.',
|
|
41
|
+
name: 'effect-no-promise-returning-public-api',
|
|
42
|
+
tokens: ['Promise', 'async'],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
check: (source, context) => /\bprocess\s*\.\s*env\b/.test(stripCommentsAndStrings(source)) &&
|
|
46
|
+
!hasEffectSignal(source) &&
|
|
47
|
+
!isConfiguredPath(context, 'configLayers'),
|
|
48
|
+
message: 'Read process.env only inside the configured Effect Config layer.',
|
|
49
|
+
name: 'effect-no-direct-process-env-outside-config-layer',
|
|
50
|
+
tokens: ['process'],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
check: (source, context) => /\b(?:Date\s*\.\s*now|Math\s*\.\s*random)\s*\(/.test(stripCommentsAndStrings(source)) &&
|
|
54
|
+
!hasEffectSignal(source) &&
|
|
55
|
+
!isConfiguredPath(context, 'adapterLayers'),
|
|
56
|
+
message: 'Use Clock and Random services outside configured adapter modules.',
|
|
57
|
+
name: 'effect-no-direct-clock-random-outside-adapters',
|
|
58
|
+
tokens: ['Date', 'Math'],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
check: hasDirectPlatformAccess,
|
|
62
|
+
message: 'Use Effect platform services for HTTP and filesystem access outside adapters.',
|
|
63
|
+
name: 'effect-no-direct-http-fs-outside-platform-services',
|
|
64
|
+
tokens: ['fetch', 'readFileSync', 'writeFileSync', 'createReadStream'],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
message: 'Services must use the configured class-based Effect service pattern.',
|
|
68
|
+
name: 'effect-require-service-class-pattern',
|
|
69
|
+
patterns: [/Context\.GenericTag(?:<[^>]+>)?\s*\(\s*['"`]/],
|
|
70
|
+
tokens: ['Context.GenericTag'],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
message: 'Service tags require stable identifiers.',
|
|
74
|
+
name: 'effect-require-tag-identifier',
|
|
75
|
+
patterns: [
|
|
76
|
+
/Context\.Tag(?:<[^>]+>)?\s*\(\s*\)/,
|
|
77
|
+
/Context\.GenericTag(?:<[^>]+>)?\s*\(\s*\)/,
|
|
78
|
+
/class\s+[A-Z][\w$]*\s+extends\s+Context\.Tag\s*\(\s*\)/,
|
|
79
|
+
],
|
|
80
|
+
tokens: ['Context.Tag', 'Context.GenericTag'],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
check: (source, context) => isConfiguredPath(context, 'domain') && /Layer\.|Live\b/.test(stripCommentsAndStrings(source)),
|
|
84
|
+
message: 'Domain exports must not leak raw service implementation dependencies.',
|
|
85
|
+
name: 'effect-no-leaked-service-dependencies',
|
|
86
|
+
tokens: ['Layer', 'Live'],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
check: hasDuplicateLayerInstance,
|
|
90
|
+
message: 'Do not construct the same Layer multiple times in one module.',
|
|
91
|
+
name: 'effect-no-duplicate-layer-instances',
|
|
92
|
+
tokens: ['Layer'],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
check: (source, context) => /Effect\.provide|Layer\.provide/.test(stripCommentsAndStrings(source)) &&
|
|
96
|
+
!isConfiguredPath(context, 'compositionRoots'),
|
|
97
|
+
message: 'Provide layers only from configured composition roots.',
|
|
98
|
+
name: 'effect-require-centralized-provision',
|
|
99
|
+
tokens: ['Effect.provide', 'Layer.provide'],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
check: (source, context) => isConfiguredPath(context, 'domain') &&
|
|
103
|
+
/Effect\.provide|Layer\.provide/.test(stripCommentsAndStrings(source)),
|
|
104
|
+
message: 'Domain modules should declare requirements, not provide concrete layers.',
|
|
105
|
+
name: 'effect-no-provide-in-domain-modules',
|
|
106
|
+
tokens: ['Effect.provide', 'Layer.provide'],
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
check: hasLayerFactory,
|
|
110
|
+
message: 'Shared layers should be memoized constants instead of functions that recreate resources.',
|
|
111
|
+
name: 'effect-require-layer-memoization-constant',
|
|
112
|
+
tokens: ['Layer'],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
message: 'Circular layer dependencies must be suspended.',
|
|
116
|
+
name: 'effect-require-suspend-for-circular-deps',
|
|
117
|
+
patterns: [
|
|
118
|
+
/Layer\.(?:effect|scoped)\s*\([\s\S]*?Layer\.(?:effect|scoped)\s*\((?![\s\S]*Effect\.suspend)/,
|
|
119
|
+
],
|
|
120
|
+
tokens: ['Layer'],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
message: 'Avoid tiny one-off Layer declarations that fragment dependency wiring.',
|
|
124
|
+
name: 'effect-avoid-layer-explosion',
|
|
125
|
+
patterns: [
|
|
126
|
+
/const\s+[A-Za-z_$][\w$]*Layer\s*=\s*Layer\.[\s\S]*const\s+[A-Za-z_$][\w$]*Layer\s*=\s*Layer\./,
|
|
127
|
+
],
|
|
128
|
+
tokens: ['Layer'],
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
message: 'Use Layer.succeed for static pure services.',
|
|
132
|
+
name: 'effect-prefer-succeed-for-static-layers',
|
|
133
|
+
patterns: [/Layer\.effect\s*\([^,]+,\s*Effect\.succeed\s*\(/],
|
|
134
|
+
tokens: ['Layer.effect', 'Effect.succeed'],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
check: hasUnscopedResourceLayer,
|
|
138
|
+
message: 'Layers that allocate resources must be scoped.',
|
|
139
|
+
name: 'effect-require-scoped-for-resource-layers',
|
|
140
|
+
tokens: ['Layer'],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
check: (source, context) => !isConfiguredPath(context, 'adapterLayers') &&
|
|
144
|
+
!isConfiguredPath(context, 'configLayers') &&
|
|
145
|
+
!/Layer\./.test(stripCommentsAndStrings(source)) &&
|
|
146
|
+
/new\s+[A-Z][\w$]*(?:Service|Repo|Client)\s*\(/.test(stripCommentsAndStrings(source)),
|
|
147
|
+
message: 'Construct services inside Layers, not directly in domain or application logic.',
|
|
148
|
+
name: 'effect-no-service-construction-outside-layer',
|
|
149
|
+
tokens: ['Service', 'Repo', 'Client'],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
check: hasBoundaryDataWithoutSchema,
|
|
153
|
+
message: 'Input boundaries must decode request, command, or message data with Schema.',
|
|
154
|
+
name: 'effect-schema-require-validation-at-input-boundaries',
|
|
155
|
+
tokens: ['.body', '.params', '.query', '.payload'],
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
check: hasOutputBoundaryWithoutSchema,
|
|
159
|
+
message: 'Output boundaries should encode or validate public response data.',
|
|
160
|
+
name: 'effect-schema-require-validation-at-output-boundaries',
|
|
161
|
+
tokens: ['Response.json', 'return json'],
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
check: hasHTTPClientResponseWithoutSchema,
|
|
165
|
+
message: 'HTTP client responses must be decoded with Schema.',
|
|
166
|
+
name: 'effect-schema-require-http-client-response-schema',
|
|
167
|
+
tokens: ['HttpClient.', 'response.json'],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
check: hasHTTPServerRequestWithoutSchema,
|
|
171
|
+
message: 'HTTP server requests must be decoded with Schema.',
|
|
172
|
+
name: 'effect-schema-require-http-server-request-schema',
|
|
173
|
+
tokens: ['HttpRouter.', 'HttpServerRequest'],
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
check: (source, context) => isConfiguredPath(context, 'configLayers') &&
|
|
177
|
+
/Config\./.test(stripCommentsAndStrings(source)) &&
|
|
178
|
+
!/Schema\./.test(stripCommentsAndStrings(source)),
|
|
179
|
+
message: 'Configuration modules must decode configuration with Schema.',
|
|
180
|
+
name: 'effect-schema-require-config-schema',
|
|
181
|
+
tokens: ['Config'],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
check: hasPersistenceReadWithoutSchema,
|
|
185
|
+
message: 'Persistence boundaries must validate loaded records with Schema.',
|
|
186
|
+
name: 'effect-schema-require-persistence-schema',
|
|
187
|
+
tokens: ['db.', 'database.', 'collection.', 'repository.'],
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
check: hasCommandHandlerWithoutSchema,
|
|
191
|
+
message: 'Public command handlers must declare and use input schemas.',
|
|
192
|
+
name: 'effect-schema-require-public-command-schema',
|
|
193
|
+
tokens: ['handler'],
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
check: (source) => exportedDeclarationTexts(source).some((declaration) => /\bunknown\b/.test(stripCommentsAndStrings(publicAPIDeclarationSignature(declaration)))),
|
|
197
|
+
message: 'unknown values must be decoded before crossing configured boundaries.',
|
|
198
|
+
name: 'effect-schema-no-unknown-crossing-boundary',
|
|
199
|
+
tokens: ['unknown'],
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
check: (source) => hasExternalEffectWithoutTimeout(source),
|
|
203
|
+
message: 'External effects must declare a timeout.',
|
|
204
|
+
name: 'effect-require-timeout-on-external-effects',
|
|
205
|
+
tokens: ['HttpClient.', 'fetch', 'FileSystem.', 'SqlClient.'],
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
check: (source) => hasIdempotentExternalEffectWithoutRetry(source),
|
|
209
|
+
message: 'Idempotent external effects must declare retry policy deliberately.',
|
|
210
|
+
name: 'effect-require-retry-policy-for-idempotent-external-effects',
|
|
211
|
+
tokens: ['HttpClient.', 'fetch', 'find', 'lookup', 'read'],
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
check: hasRetryScheduleWithoutJitter,
|
|
215
|
+
message: 'Retry schedules must include jitter.',
|
|
216
|
+
name: 'effect-require-schedule-jitter-for-retries',
|
|
217
|
+
tokenGroups: [['Effect.retry'], ['Schedule.']],
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
check: (source) => hasExternalEffectWithoutSpan(source),
|
|
221
|
+
message: 'External effects must declare an observability span.',
|
|
222
|
+
name: 'effect-require-span-external',
|
|
223
|
+
tokens: ['HttpClient.', 'fetch', 'FileSystem.', 'SqlClient.'],
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
check: hasSharedResourceForEachWithoutSemaphore,
|
|
227
|
+
message: 'Shared scarce resources must be guarded by Semaphore.',
|
|
228
|
+
name: 'effect-require-semaphore-for-shared-resources',
|
|
229
|
+
tokens: ['Effect.forEach'],
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
check: hasSharedMutableStateWithoutRef,
|
|
233
|
+
message: 'Shared mutable state must use Ref, SynchronizedRef, or scoped services.',
|
|
234
|
+
name: 'effect-require-ref-for-shared-mutable-state',
|
|
235
|
+
tokens: ['let '],
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
check: hasUnscopedResourceLoop,
|
|
239
|
+
message: 'Loops that acquire resources must scope each acquisition.',
|
|
240
|
+
name: 'effect-require-scoped-in-loops',
|
|
241
|
+
tokens: ['open', 'connect', 'subscribe', 'listen'],
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
check: hasEnsuringCleanupWithoutOnExit,
|
|
245
|
+
message: 'Cleanup logic should use onExit so success, failure, and interruption are handled.',
|
|
246
|
+
name: 'effect-require-onExit-for-cleanup',
|
|
247
|
+
tokens: ['Effect.ensuring', 'cleanup'],
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
check: hasUnsafeResourceStream,
|
|
251
|
+
message: 'Streams over resources must be scoped or bracketed.',
|
|
252
|
+
name: 'effect-require-stream-resource-safety',
|
|
253
|
+
tokens: ['Stream'],
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
check: hasUnterminatedLongRunningStream,
|
|
257
|
+
message: 'Long-running streams must declare termination or shutdown behavior.',
|
|
258
|
+
name: 'effect-require-stream-termination',
|
|
259
|
+
tokens: ['Stream'],
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
check: hasAsyncPushWithoutBuffer,
|
|
263
|
+
message: 'Stream.asyncPush must declare an explicit buffer/backpressure policy.',
|
|
264
|
+
name: 'effect-require-explicit-asyncPush-buffer',
|
|
265
|
+
tokens: ['Stream.asyncPush'],
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
check: hasUnbatchedResolver,
|
|
269
|
+
message: 'RequestResolver implementations should batch requests.',
|
|
270
|
+
name: 'effect-require-batching-for-resolver',
|
|
271
|
+
tokens: ['RequestResolver'],
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
check: hasNPlusOneWithoutBatchedResolver,
|
|
275
|
+
message: 'Potential N+1 data access should use a batched RequestResolver.',
|
|
276
|
+
name: 'effect-use-batched-resolver-for-n-plus-one',
|
|
277
|
+
tokens: ['Effect.forEach'],
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
message: 'Use PubSub for broadcast semantics instead of manually fanning out queues.',
|
|
281
|
+
name: 'effect-prefer-pubsub-for-broadcast',
|
|
282
|
+
patterns: [/Queue\.[\s\S]*?\bsubscribers\b|broadcast\s*\([\s\S]*?Queue\./],
|
|
283
|
+
tokens: ['Queue', 'broadcast', 'subscribers'],
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
check: (source, context) => isEffectTestPath(context) && hasUnprovidedServiceInEffectTest(source),
|
|
287
|
+
message: 'Effect tests must provide required services explicitly.',
|
|
288
|
+
name: 'effect-require-provided-services-in-tests',
|
|
289
|
+
tokens: ['Service', 'Repo', 'Client'],
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
check: (source, context) => isUnitTestPath(context) && hasRealTestService(source),
|
|
293
|
+
message: 'Unit tests should use in-memory service implementations.',
|
|
294
|
+
name: 'effect-prefer-in-memory-implementations',
|
|
295
|
+
tokens: ['real'],
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
check: (source, context) => isUnitTestPath(context) && hasLiveTestService(source),
|
|
299
|
+
message: 'Live services belong in integration tests, not unit tests.',
|
|
300
|
+
name: 'effect-no-live-services-in-unit-tests',
|
|
301
|
+
tokens: ['Live', 'Layer.live'],
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
check: (source, context) => isEffectTestPath(context) && hasTimeCodeWithoutTestClock(source),
|
|
305
|
+
message: 'Tests for time-dependent Effect code should use TestClock.',
|
|
306
|
+
name: 'effect-require-testclock-for-time-code',
|
|
307
|
+
tokens: ['Effect.timeout', 'Effect.delay', 'Clock.'],
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
check: (source, context) => isEffectTestPath(context) &&
|
|
311
|
+
/const\s+[A-Za-z_$][\w$]*(?:Runtime|Layer|Service)\s*=/.test(source),
|
|
312
|
+
message: 'Do not share mutable runtime, layer, or service state across Effect tests.',
|
|
313
|
+
name: 'effect-no-test-runtime-leakage',
|
|
314
|
+
tokens: ['Runtime', 'Layer', 'Service'],
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
message: 'Do not hide Effect semantics behind local wrapper DSLs.',
|
|
318
|
+
name: 'effect-no-ad-hoc-effect-wrapper-abstractions',
|
|
319
|
+
patterns: [/function\s+(?:runEffect|makeEffect|effectify|toEffect)\s*\(/],
|
|
320
|
+
tokens: ['runEffect', 'makeEffect', 'effectify', 'toEffect'],
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
check: (source) => source.split('\n').some((line) => {
|
|
324
|
+
if (!/(?:eslint|oxlint)-disable[^\n]*effect-/.test(line)) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
return !/(?:reason|because)[^\n]*(?:[A-Z]+-\d+|#\d+)/.test(line);
|
|
328
|
+
}),
|
|
329
|
+
message: 'Effect rule suppressions must name a rule, a reason, and a tracking ticket.',
|
|
330
|
+
name: 'effect-require-effect-suppression-reason-and-ticket',
|
|
331
|
+
tokens: ['disable', 'effect-'],
|
|
332
|
+
},
|
|
333
|
+
];
|
|
334
|
+
//# sourceMappingURL=effect-strict-core-specs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-strict-core-specs.js","sourceRoot":"","sources":["../../src/rules/effect-strict-core-specs.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAChF,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,8BAA8B,EAC9B,yBAAyB,EACzB,+BAA+B,EAC/B,4BAA4B,EAC5B,+BAA+B,EAC/B,kCAAkC,EAClC,iCAAiC,EACjC,uCAAuC,EACvC,eAAe,EACf,kBAAkB,EAClB,iCAAiC,EACjC,8BAA8B,EAC9B,+BAA+B,EAC/B,kBAAkB,EAClB,+BAA+B,EAC/B,wCAAwC,EACxC,2BAA2B,EAC3B,oBAAoB,EACpB,gCAAgC,EAChC,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,gCAAgC,GACjC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,wBAAwB,EACxB,4BAA4B,EAC5B,6BAA6B,EAC7B,gCAAgC,EAChC,cAAc,EACd,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE3F,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAwB;IACxD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,cAAc,CAAC,MAAM,CAAC;YACtB,CAAC,wBAAwB,CAAC,MAAM,CAAC;YACjC,CAAC,yBAAyB,CAAC,MAAM,CAAC;YAClC,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC1B,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC;QAC3C,OAAO,EAAE,uDAAuD;QAChE,IAAI,EAAE,mCAAmC;QACzC,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;KACxC;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC;YACxC,kCAAkC,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC1E,OAAO,EAAE,qFAAqF;QAC9F,IAAI,EAAE,gDAAgD;QACtD,MAAM,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC;KAC5E;IACD;QACE,KAAK,EAAE,gCAAgC;QACvC,OAAO,EAAE,qDAAqD;QAC9D,IAAI,EAAE,8CAA8C;QACpD,MAAM,EAAE,CAAC,gBAAgB,CAAC;KAC3B;IACD;QACE,KAAK,EAAE,4BAA4B;QACnC,OAAO,EAAE,mEAAmE;QAC5E,IAAI,EAAE,wCAAwC;QAC9C,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;KAC7B;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,wBAAwB,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAC9D,CAAC,eAAe,CAAC,MAAM,CAAC;YACxB,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC;QAC5C,OAAO,EAAE,kEAAkE;QAC3E,IAAI,EAAE,mDAAmD;QACzD,MAAM,EAAE,CAAC,SAAS,CAAC;KACpB;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,+CAA+C,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACrF,CAAC,eAAe,CAAC,MAAM,CAAC;YACxB,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,CAAC;QAC7C,OAAO,EAAE,mEAAmE;QAC5E,IAAI,EAAE,gDAAgD;QACtD,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB;IACD;QACE,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,+EAA+E;QACxF,IAAI,EAAE,oDAAoD;QAC1D,MAAM,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,CAAC;KACvE;IACD;QACE,OAAO,EAAE,sEAAsE;QAC/E,IAAI,EAAE,sCAAsC;QAC5C,QAAQ,EAAE,CAAC,8CAA8C,CAAC;QAC1D,MAAM,EAAE,CAAC,oBAAoB,CAAC;KAC/B;IACD;QACE,OAAO,EAAE,0CAA0C;QACnD,IAAI,EAAE,+BAA+B;QACrC,QAAQ,EAAE;YACR,oCAAoC;YACpC,2CAA2C;YAC3C,wDAAwD;SACzD;QACD,MAAM,EAAE,CAAC,aAAa,EAAE,oBAAoB,CAAC;KAC9C;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC/F,OAAO,EAAE,uEAAuE;QAChF,IAAI,EAAE,uCAAuC;QAC7C,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B;IACD;QACE,KAAK,EAAE,yBAAyB;QAChC,OAAO,EAAE,+DAA+D;QACxE,IAAI,EAAE,qCAAqC;QAC3C,MAAM,EAAE,CAAC,OAAO,CAAC;KAClB;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,gCAAgC,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACtE,CAAC,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,CAAC;QAChD,OAAO,EAAE,wDAAwD;QACjE,IAAI,EAAE,sCAAsC;QAC5C,MAAM,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC;KAC5C;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC;YACnC,gCAAgC,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACxE,OAAO,EAAE,0EAA0E;QACnF,IAAI,EAAE,qCAAqC;QAC3C,MAAM,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC;KAC5C;IACD;QACE,KAAK,EAAE,eAAe;QACtB,OAAO,EACL,0FAA0F;QAC5F,IAAI,EAAE,2CAA2C;QACjD,MAAM,EAAE,CAAC,OAAO,CAAC;KAClB;IACD;QACE,OAAO,EAAE,gDAAgD;QACzD,IAAI,EAAE,0CAA0C;QAChD,QAAQ,EAAE;YACR,8FAA8F;SAC/F;QACD,MAAM,EAAE,CAAC,OAAO,CAAC;KAClB;IACD;QACE,OAAO,EAAE,wEAAwE;QACjF,IAAI,EAAE,8BAA8B;QACpC,QAAQ,EAAE;YACR,+FAA+F;SAChG;QACD,MAAM,EAAE,CAAC,OAAO,CAAC;KAClB;IACD;QACE,OAAO,EAAE,6CAA6C;QACtD,IAAI,EAAE,yCAAyC;QAC/C,QAAQ,EAAE,CAAC,iDAAiD,CAAC;QAC7D,MAAM,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC;KAC3C;IACD;QACE,KAAK,EAAE,wBAAwB;QAC/B,OAAO,EAAE,gDAAgD;QACzD,IAAI,EAAE,2CAA2C;QACjD,MAAM,EAAE,CAAC,OAAO,CAAC;KAClB;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,CAAC;YAC3C,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC;YAC1C,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAChD,+CAA+C,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACvF,OAAO,EAAE,gFAAgF;QACzF,IAAI,EAAE,8CAA8C;QACpD,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC;KACtC;IACD;QACE,KAAK,EAAE,4BAA4B;QACnC,OAAO,EAAE,6EAA6E;QACtF,IAAI,EAAE,sDAAsD;QAC5D,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;KACnD;IACD;QACE,KAAK,EAAE,8BAA8B;QACrC,OAAO,EAAE,mEAAmE;QAC5E,IAAI,EAAE,uDAAuD;QAC7D,MAAM,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC;KACzC;IACD;QACE,KAAK,EAAE,kCAAkC;QACzC,OAAO,EAAE,oDAAoD;QAC7D,IAAI,EAAE,mDAAmD;QACzD,MAAM,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC;KACzC;IACD;QACE,KAAK,EAAE,iCAAiC;QACxC,OAAO,EAAE,mDAAmD;QAC5D,IAAI,EAAE,kDAAkD;QACxD,MAAM,EAAE,CAAC,aAAa,EAAE,mBAAmB,CAAC;KAC7C;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC;YACzC,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAChD,CAAC,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,EAAE,8DAA8D;QACvE,IAAI,EAAE,qCAAqC;QAC3C,MAAM,EAAE,CAAC,QAAQ,CAAC;KACnB;IACD;QACE,KAAK,EAAE,+BAA+B;QACtC,OAAO,EAAE,kEAAkE;QAC3E,IAAI,EAAE,0CAA0C;QAChD,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC;KAC3D;IACD;QACE,KAAK,EAAE,8BAA8B;QACrC,OAAO,EAAE,6DAA6D;QACtE,IAAI,EAAE,6CAA6C;QACnD,MAAM,EAAE,CAAC,SAAS,CAAC;KACpB;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAW,EAAE,CACzB,wBAAwB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAW,EAAE,CAC7D,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,6BAA6B,CAAC,WAAW,CAAC,CAAC,CAAC,CACxF;QACH,OAAO,EAAE,uEAAuE;QAChF,IAAI,EAAE,4CAA4C;QAClD,MAAM,EAAE,CAAC,SAAS,CAAC;KACpB;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAW,EAAE,CAAC,+BAA+B,CAAC,MAAM,CAAC;QACnE,OAAO,EAAE,0CAA0C;QACnD,IAAI,EAAE,4CAA4C;QAClD,MAAM,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC;KAC9D;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAW,EAAE,CAAC,uCAAuC,CAAC,MAAM,CAAC;QAC3E,OAAO,EAAE,qEAAqE;QAC9E,IAAI,EAAE,6DAA6D;QACnE,MAAM,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;KAC3D;IACD;QACE,KAAK,EAAE,6BAA6B;QACpC,OAAO,EAAE,sCAAsC;QAC/C,IAAI,EAAE,4CAA4C;QAClD,WAAW,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;KAC/C;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAW,EAAE,CAAC,4BAA4B,CAAC,MAAM,CAAC;QAChE,OAAO,EAAE,sDAAsD;QAC/D,IAAI,EAAE,8BAA8B;QACpC,MAAM,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC;KAC9D;IACD;QACE,KAAK,EAAE,wCAAwC;QAC/C,OAAO,EAAE,uDAAuD;QAChE,IAAI,EAAE,+CAA+C;QACrD,MAAM,EAAE,CAAC,gBAAgB,CAAC;KAC3B;IACD;QACE,KAAK,EAAE,+BAA+B;QACtC,OAAO,EAAE,yEAAyE;QAClF,IAAI,EAAE,6CAA6C;QACnD,MAAM,EAAE,CAAC,MAAM,CAAC;KACjB;IACD;QACE,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,2DAA2D;QACpE,IAAI,EAAE,gCAAgC;QACtC,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC;KACnD;IACD;QACE,KAAK,EAAE,+BAA+B;QACtC,OAAO,EAAE,oFAAoF;QAC7F,IAAI,EAAE,mCAAmC;QACzC,MAAM,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC;KACvC;IACD;QACE,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,qDAAqD;QAC9D,IAAI,EAAE,uCAAuC;QAC7C,MAAM,EAAE,CAAC,QAAQ,CAAC;KACnB;IACD;QACE,KAAK,EAAE,gCAAgC;QACvC,OAAO,EAAE,qEAAqE;QAC9E,IAAI,EAAE,mCAAmC;QACzC,MAAM,EAAE,CAAC,QAAQ,CAAC;KACnB;IACD;QACE,KAAK,EAAE,yBAAyB;QAChC,OAAO,EAAE,uEAAuE;QAChF,IAAI,EAAE,0CAA0C;QAChD,MAAM,EAAE,CAAC,kBAAkB,CAAC;KAC7B;IACD;QACE,KAAK,EAAE,oBAAoB;QAC3B,OAAO,EAAE,wDAAwD;QACjE,IAAI,EAAE,sCAAsC;QAC5C,MAAM,EAAE,CAAC,iBAAiB,CAAC;KAC5B;IACD;QACE,KAAK,EAAE,iCAAiC;QACxC,OAAO,EAAE,iEAAiE;QAC1E,IAAI,EAAE,4CAA4C;QAClD,MAAM,EAAE,CAAC,gBAAgB,CAAC;KAC3B;IACD;QACE,OAAO,EAAE,4EAA4E;QACrF,IAAI,EAAE,oCAAoC;QAC1C,QAAQ,EAAE,CAAC,8DAA8D,CAAC;QAC1E,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC;KAC9C;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,gBAAgB,CAAC,OAAO,CAAC,IAAI,gCAAgC,CAAC,MAAM,CAAC;QACvE,OAAO,EAAE,yDAAyD;QAClE,IAAI,EAAE,2CAA2C;QACjD,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC;KACtC;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC;QAC1F,OAAO,EAAE,0DAA0D;QACnE,IAAI,EAAE,yCAAyC;QAC/C,MAAM,EAAE,CAAC,MAAM,CAAC;KACjB;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC;QAC1F,OAAO,EAAE,4DAA4D;QACrE,IAAI,EAAE,uCAAuC;QAC7C,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;KAC/B;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,gBAAgB,CAAC,OAAO,CAAC,IAAI,2BAA2B,CAAC,MAAM,CAAC;QAClE,OAAO,EAAE,4DAA4D;QACrE,IAAI,EAAE,wCAAwC;QAC9C,MAAM,EAAE,CAAC,gBAAgB,EAAE,cAAc,EAAE,QAAQ,CAAC;KACrD;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAW,EAAE,CAClC,gBAAgB,CAAC,OAAO,CAAC;YACzB,uDAAuD,CAAC,IAAI,CAAC,MAAM,CAAC;QACtE,OAAO,EAAE,4EAA4E;QACrF,IAAI,EAAE,gCAAgC;QACtC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;KACxC;IACD;QACE,OAAO,EAAE,yDAAyD;QAClE,IAAI,EAAE,8CAA8C;QACpD,QAAQ,EAAE,CAAC,6DAA6D,CAAC;QACzE,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,CAAC;KAC7D;IACD;QACE,KAAK,EAAE,CAAC,MAAM,EAAW,EAAE,CACzB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/B,IAAI,CAAC,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,CAAC,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC,CAAC;QACJ,OAAO,EAAE,6EAA6E;QACtF,IAAI,EAAE,qDAAqD;QAC3D,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;KAC/B;CAC4B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal helper exported for package-local composition.
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare const hasExternalEffectWithoutTimeout: (source: string, options?: {
|
|
7
|
+
allowFetch: boolean;
|
|
8
|
+
}) => boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Internal helper exported for package-local composition.
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export declare const hasExternalEffectWithoutSpan: (source: string, options?: {
|
|
15
|
+
allowFetch: boolean;
|
|
16
|
+
}) => boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Internal helper exported for package-local composition.
|
|
19
|
+
*
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
export declare const hasIdempotentExternalEffectWithoutRetry: (source: string, options?: {
|
|
23
|
+
allowFetch: boolean;
|
|
24
|
+
}) => boolean;
|
|
25
|
+
//# sourceMappingURL=effect-strict-external-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-strict-external-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-strict-external-helpers.ts"],"names":[],"mappings":"AAuDA;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,GAC1C,QAAQ,MAAM,EACd,UAAS;IAAE,UAAU,EAAE,OAAO,CAAA;CAAyB,KACtD,OAAwF,CAAC;AAM5F;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,GACvC,QAAQ,MAAM,EACd,UAAS;IAAE,UAAU,EAAE,OAAO,CAAA;CAAyB,KACtD,OAAqF,CAAC;AAiCzF;;;;GAIG;AACH,eAAO,MAAM,uCAAuC,GAClD,QAAQ,MAAM,EACd,UAAS;IAAE,UAAU,EAAE,OAAO,CAAA;CAAyB,KACtD,OAwBF,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/* -------------------------------------------------------------------------- */
|
|
2
|
+
/* External-call predicates for opt-in strict Effect lint rules. */
|
|
3
|
+
/* -------------------------------------------------------------------------- */
|
|
4
|
+
import { enclosingEffectWrapperSegment, hasTopLevelPipeOperator, localEffectCallSegment, } from './effect-strict-segment-helpers.js';
|
|
5
|
+
import { isInsideCall, stripComments, stripCommentsAndStrings } from './effect-source-helpers.js';
|
|
6
|
+
import { hasEffectSignal } from './effect-rule-core.js';
|
|
7
|
+
const EXTERNAL_CALL_PATTERN = /\b(?:HttpClient\.(?:get|post|put|patch|delete|request)|fetch|FileSystem\.[A-Za-z_$][\w$]*|SqlClient\.[A-Za-z_$][\w$]*)\s*\(/g;
|
|
8
|
+
const IDEMPOTENT_EXTERNAL_CALL_PATTERN = /\b(?:HttpClient\.(?:get|head|put|delete)|fetch|(?:find|lookup|read)[A-Z]\w*)\s*\(/g;
|
|
9
|
+
const hasExternalCallSignal = (source) => source.includes('HttpClient.') ||
|
|
10
|
+
source.includes('fetch') ||
|
|
11
|
+
source.includes('FileSystem.') ||
|
|
12
|
+
source.includes('SqlClient.');
|
|
13
|
+
const isFetchSkipped = (matchText, enclosingWrapper, options) => matchText.startsWith('fetch') && (!enclosingWrapper || !options.allowFetch);
|
|
14
|
+
const shouldReportMissingTimeout = (code, index, segment) => !isInsideCall(code, index, /Effect\.timeout\s*\(/g) &&
|
|
15
|
+
!hasTopLevelPipeOperator(segment, 'timeout');
|
|
16
|
+
const hasExternalEffectMissingOperator = (source, options, shouldReport) => {
|
|
17
|
+
if (!hasExternalCallSignal(source)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const code = stripCommentsAndStrings(source);
|
|
21
|
+
for (const match of code.matchAll(EXTERNAL_CALL_PATTERN)) {
|
|
22
|
+
const enclosingWrapper = enclosingEffectWrapperSegment(code, match.index);
|
|
23
|
+
if (!isFetchSkipped(match[0], enclosingWrapper, options)) {
|
|
24
|
+
const segment = enclosingWrapper ?? localEffectCallSegment(code, match.index);
|
|
25
|
+
if (shouldReport(code, match.index, segment)) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Internal helper exported for package-local composition.
|
|
34
|
+
*
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
export const hasExternalEffectWithoutTimeout = (source, options = { allowFetch: true }) => hasExternalEffectMissingOperator(source, options, shouldReportMissingTimeout);
|
|
38
|
+
const shouldReportMissingSpan = (source, index, segment) => !isInsideCall(source, index, /Effect\.withSpan\s*\(/g) &&
|
|
39
|
+
!hasTopLevelPipeOperator(segment, 'withSpan');
|
|
40
|
+
/**
|
|
41
|
+
* Internal helper exported for package-local composition.
|
|
42
|
+
*
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
export const hasExternalEffectWithoutSpan = (source, options = { allowFetch: true }) => hasExternalEffectMissingOperator(source, options, shouldReportMissingSpan);
|
|
46
|
+
const hasIdempotentExternalCallSignal = (source) => source.includes('HttpClient.') ||
|
|
47
|
+
source.includes('fetch') ||
|
|
48
|
+
source.includes('find') ||
|
|
49
|
+
source.includes('lookup') ||
|
|
50
|
+
source.includes('read');
|
|
51
|
+
const isUnrelatedNamedRead = (source, matchText) => /^(?:find|lookup|read)[A-Z]/.test(matchText) && !hasEffectSignal(source);
|
|
52
|
+
const isMutatingFetchCall = (matchText, rawSegment) => matchText.startsWith('fetch') &&
|
|
53
|
+
/\bmethod\s*:\s*['"](?!(?:GET|HEAD|PUT|DELETE)['"])/.test(stripComments(rawSegment));
|
|
54
|
+
const retryScanInput = (source, code, match, options) => {
|
|
55
|
+
const index = match.index ?? 0;
|
|
56
|
+
const enclosingWrapper = enclosingEffectWrapperSegment(code, index);
|
|
57
|
+
const rawEnclosingWrapper = enclosingEffectWrapperSegment(source, index);
|
|
58
|
+
const rawSegment = rawEnclosingWrapper ?? localEffectCallSegment(source, index);
|
|
59
|
+
return {
|
|
60
|
+
isMutatingFetch: isMutatingFetchCall(match[0], rawSegment),
|
|
61
|
+
segment: enclosingWrapper ?? localEffectCallSegment(code, index),
|
|
62
|
+
shouldSkipFetch: isFetchSkipped(match[0], enclosingWrapper, options),
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Internal helper exported for package-local composition.
|
|
67
|
+
*
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
export const hasIdempotentExternalEffectWithoutRetry = (source, options = { allowFetch: true }) => {
|
|
71
|
+
if (!hasIdempotentExternalCallSignal(source)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
const code = stripCommentsAndStrings(source);
|
|
75
|
+
for (const match of code.matchAll(IDEMPOTENT_EXTERNAL_CALL_PATTERN)) {
|
|
76
|
+
if (!isUnrelatedNamedRead(source, match[0])) {
|
|
77
|
+
const input = retryScanInput(source, code, match, options);
|
|
78
|
+
if (shouldReportMissingRetry(code, match.index, input.segment, input.shouldSkipFetch, input.isMutatingFetch)) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
};
|
|
85
|
+
const shouldReportMissingRetry = (code, index, segment, shouldSkipFetch, isMutatingFetch) => !shouldSkipFetch && !isMutatingFetch && isMissingRetryPolicy(code, index, segment);
|
|
86
|
+
const isMissingRetryPolicy = (code, index, segment) => !isInsideCall(code, index, /Effect\.retry\s*\(/g) && !hasTopLevelPipeOperator(segment, 'retry');
|
|
87
|
+
//# sourceMappingURL=effect-strict-external-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-strict-external-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-strict-external-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +1,76 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
declare
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
declare
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
export
|
|
1
|
+
export { hasBoundaryDataWithoutSchema, hasCommandHandlerWithoutSchema, hasHTTPServerRequestWithoutSchema, hasPersistenceReadWithoutSchema, } from './effect-strict-boundary-helpers';
|
|
2
|
+
export { hasExternalEffectWithoutSpan, hasExternalEffectWithoutTimeout, hasIdempotentExternalEffectWithoutRetry, } from './effect-strict-external-helpers';
|
|
3
|
+
export { hasDuplicateLayerInstance, hasLayerFactory, hasLiveTestService, hasRealTestService, hasUnscopedResourceLayer, hasUnscopedResourceLoop, hasUnsafeResourceStream, } from './effect-strict-segment-helpers';
|
|
4
|
+
/**
|
|
5
|
+
* Internal helper exported for package-local composition.
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare const hasOutputBoundaryWithoutSchema: (source: string) => boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Internal helper exported for package-local composition.
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export declare const hasHTTPClientResponseWithoutSchema: (source: string) => boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Internal helper exported for package-local composition.
|
|
18
|
+
*
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export declare const hasSharedResourceForEachWithoutSemaphore: (source: string) => boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Internal helper exported for package-local composition.
|
|
24
|
+
*
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
export declare const hasEnsuringCleanupWithoutOnExit: (source: string) => boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Internal helper exported for package-local composition.
|
|
30
|
+
*
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
export declare const hasUnterminatedLongRunningStream: (source: string) => boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Internal helper exported for package-local composition.
|
|
36
|
+
*
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
export declare const hasAsyncPushWithoutBuffer: (source: string) => boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Internal helper exported for package-local composition.
|
|
42
|
+
*
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
export declare const hasUnbatchedResolver: (source: string) => boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Internal helper exported for package-local composition.
|
|
48
|
+
*
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
51
|
+
export declare const hasNPlusOneWithoutBatchedResolver: (source: string) => boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Internal helper exported for package-local composition.
|
|
54
|
+
*
|
|
55
|
+
* @internal
|
|
56
|
+
*/
|
|
57
|
+
export declare const hasUnprovidedServiceInEffectTest: (source: string) => boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Internal helper exported for package-local composition.
|
|
60
|
+
*
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
export declare const hasTimeCodeWithoutTestClock: (source: string) => boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Internal helper exported for package-local composition.
|
|
66
|
+
*
|
|
67
|
+
* @internal
|
|
68
|
+
*/
|
|
69
|
+
export declare const hasMutableStateWithoutRef: (source: string) => boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Internal helper exported for package-local composition.
|
|
72
|
+
*
|
|
73
|
+
* @internal
|
|
74
|
+
*/
|
|
75
|
+
export declare const hasSharedMutableStateWithoutRef: (source: string) => boolean;
|
|
34
76
|
//# sourceMappingURL=effect-strict-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect-strict-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-strict-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"effect-strict-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-strict-helpers.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,uCAAuC,GACxC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,yBAAyB,EACzB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,iCAAiC,CAAC;AAIzC;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GAAI,QAAQ,MAAM,KAAG,OAe/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,GAAI,QAAQ,MAAM,KAAG,OAcnE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wCAAwC,GAAI,QAAQ,MAAM,KAAG,OAkBzE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,GAAI,QAAQ,MAAM,KAAG,OAchE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,GAAI,QAAQ,MAAM,KAAG,OAcjE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ,MAAM,KAAG,OAc1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,OAcrD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,GAAI,QAAQ,MAAM,KAAG,OAiBlE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,GAAI,QAAQ,MAAM,KAAG,OAUjE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,GAAI,QAAQ,MAAM,KAAG,OAa5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ,MAAM,KAAG,OAgB1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,WAvBM,MAAM,KAAG,OAuBa,CAAC"}
|