@pikku/inspector 0.12.75 → 0.12.81
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 +330 -0
- package/dist/add/add-analytics.d.ts +9 -0
- package/dist/add/add-analytics.js +178 -0
- package/dist/add/add-auth.js +0 -54
- package/dist/add/add-feature-flag.d.ts +2 -0
- package/dist/add/add-feature-flag.js +162 -0
- package/dist/add/add-wire-addon.js +1 -0
- package/dist/add/add-wire-remote-addon.js +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -1
- package/dist/inspector.js +4 -0
- package/dist/surface/collect-surface.d.ts +58 -0
- package/dist/surface/collect-surface.js +613 -0
- package/dist/types.d.ts +20 -11
- package/dist/utils/filter-inspector-state.js +14 -0
- package/dist/utils/post-process.js +15 -0
- package/dist/utils/read-module-specifiers.d.ts +8 -0
- package/dist/utils/read-module-specifiers.js +23 -0
- package/dist/utils/read-tsconfig-out-dir.d.ts +5 -0
- package/dist/utils/read-tsconfig-out-dir.js +12 -0
- package/dist/utils/resolve-deploy-target.d.ts +7 -0
- package/dist/utils/resolve-deploy-target.js +15 -7
- package/dist/utils/serialize-inspector-state.d.ts +5 -0
- package/dist/utils/serialize-inspector-state.js +8 -0
- package/dist/visit.js +4 -0
- package/package.json +16 -6
- package/run-tests.sh +21 -6
- package/src/add/add-addon-bans.ts +0 -85
- package/src/add/add-agent-scorer.test.ts +0 -197
- package/src/add/add-agent-scorer.ts +0 -83
- package/src/add/add-agent.test.ts +0 -87
- package/src/add/add-agent.ts +0 -638
- package/src/add/add-approval-description.ts +0 -76
- package/src/add/add-auth.test.ts +0 -791
- package/src/add/add-auth.ts +0 -424
- package/src/add/add-channel.ts +0 -778
- package/src/add/add-cli-renderers.test.ts +0 -74
- package/src/add/add-cli.ts +0 -1006
- package/src/add/add-credential.ts +0 -186
- package/src/add/add-feature.test.ts +0 -306
- package/src/add/add-feature.ts +0 -253
- package/src/add/add-file-extends-core-type.ts +0 -66
- package/src/add/add-file-with-config.ts +0 -45
- package/src/add/add-file-with-factory.test.ts +0 -134
- package/src/add/add-file-with-factory.ts +0 -288
- package/src/add/add-functions.test.ts +0 -743
- package/src/add/add-functions.ts +0 -1548
- package/src/add/add-gateway.ts +0 -143
- package/src/add/add-http-route-ref.test.ts +0 -149
- package/src/add/add-http-route.ts +0 -530
- package/src/add/add-http-routes.ts +0 -471
- package/src/add/add-keyed-wiring.ts +0 -180
- package/src/add/add-mcp-prompt.ts +0 -157
- package/src/add/add-mcp-resource.ts +0 -175
- package/src/add/add-middleware.test.ts +0 -196
- package/src/add/add-middleware.ts +0 -879
- package/src/add/add-permission-auth.test.ts +0 -59
- package/src/add/add-permission.ts +0 -311
- package/src/add/add-personas.test.ts +0 -406
- package/src/add/add-personas.ts +0 -287
- package/src/add/add-queue-worker.ts +0 -117
- package/src/add/add-rpc-invocations.test.ts +0 -287
- package/src/add/add-rpc-invocations.ts +0 -221
- package/src/add/add-scenario-step.test.ts +0 -509
- package/src/add/add-schedule.ts +0 -120
- package/src/add/add-scope.test.ts +0 -419
- package/src/add/add-scope.ts +0 -221
- package/src/add/add-secret.ts +0 -10
- package/src/add/add-subject-scenario-steps.test.ts +0 -161
- package/src/add/add-system-role.test.ts +0 -297
- package/src/add/add-system-role.ts +0 -162
- package/src/add/add-trigger.ts +0 -165
- package/src/add/add-variable.ts +0 -10
- package/src/add/add-wire-addon.test.ts +0 -185
- package/src/add/add-wire-addon.ts +0 -146
- package/src/add/add-wire-remote-addon.ts +0 -80
- package/src/add/add-workflow-edge-cases.test.ts +0 -201
- package/src/add/add-workflow-fanout.test.ts +0 -166
- package/src/add/add-workflow-graph-foreach.test.ts +0 -174
- package/src/add/add-workflow-graph-input.test.ts +0 -94
- package/src/add/add-workflow-graph-notes.test.ts +0 -74
- package/src/add/add-workflow-graph.ts +0 -644
- package/src/add/add-workflow-on-error.test.ts +0 -118
- package/src/add/add-workflow-return-switch.test.ts +0 -121
- package/src/add/add-workflow-silent-drops.test.ts +0 -261
- package/src/add/add-workflow-sleep-expression.test.ts +0 -96
- package/src/add/add-workflow.test.ts +0 -155
- package/src/add/add-workflow.ts +0 -482
- package/src/add/addon-bans.test.ts +0 -121
- package/src/add/addon-contracts.test.ts +0 -221
- package/src/add/allow-escape-hatches.test.ts +0 -144
- package/src/add/audit-meta.test.ts +0 -75
- package/src/add/classified-sink-check.test.ts +0 -347
- package/src/add/config-value-metadata.test.ts +0 -263
- package/src/add/dynamic-import-check.test.ts +0 -119
- package/src/add/expect-eventually-scenario-only.test.ts +0 -108
- package/src/add/function-body-span.test.ts +0 -96
- package/src/add/inline-wiring-function.test.ts +0 -104
- package/src/add/pii-check.test.ts +0 -258
- package/src/add/rpc-type-cast.test.ts +0 -123
- package/src/add/scenario-instrumentation.test.ts +0 -89
- package/src/add/scenario-instrumentation.ts +0 -42
- package/src/add/scenario-marker.test.ts +0 -89
- package/src/add/scenario-not-extractable.test.ts +0 -159
- package/src/add/scenario-services.test.ts +0 -103
- package/src/add/scenario-skip.test.ts +0 -83
- package/src/add/validate-workflow-graph-addons.test.ts +0 -102
- package/src/add/wire-name-literal.test.ts +0 -117
- package/src/error-codes-emitted.test.ts +0 -76
- package/src/error-codes.ts +0 -145
- package/src/index.ts +0 -66
- package/src/inspector.ts +0 -575
- package/src/schema-generator.ts +0 -1
- package/src/source-file-cache.ts +0 -73
- package/src/tsconfig-paths.test.ts +0 -90
- package/src/types-map.ts +0 -141
- package/src/types.ts +0 -775
- package/src/utils/annotate-http-route-auth.test.ts +0 -161
- package/src/utils/annotate-http-route-auth.ts +0 -53
- package/src/utils/check-classified-sinks.ts +0 -215
- package/src/utils/check-pii-output.ts +0 -120
- package/src/utils/compute-diagnostics.test.ts +0 -106
- package/src/utils/compute-required-schemas.ts +0 -48
- package/src/utils/contract-hashes.test.ts +0 -553
- package/src/utils/contract-hashes.ts +0 -387
- package/src/utils/custom-types-generator.test.ts +0 -124
- package/src/utils/custom-types-generator.ts +0 -150
- package/src/utils/detect-schema-vendor.test.ts +0 -123
- package/src/utils/detect-schema-vendor.ts +0 -120
- package/src/utils/does-type-extend-core-type.ts +0 -53
- package/src/utils/ensure-function-metadata.ts +0 -385
- package/src/utils/extract-function-name.ts +0 -612
- package/src/utils/extract-function-node.ts +0 -70
- package/src/utils/extract-node-value.test.ts +0 -117
- package/src/utils/extract-node-value.ts +0 -172
- package/src/utils/extract-secret-usage.test.ts +0 -81
- package/src/utils/extract-secret-usage.ts +0 -73
- package/src/utils/extract-services.ts +0 -70
- package/src/utils/extract-surface-usage.test.ts +0 -147
- package/src/utils/extract-surface-usage.ts +0 -121
- package/src/utils/filter-inspector-state.test.ts +0 -2232
- package/src/utils/filter-inspector-state.ts +0 -1298
- package/src/utils/filter-utils.test.ts +0 -843
- package/src/utils/filter-utils.ts +0 -161
- package/src/utils/find-root-dir.ts +0 -68
- package/src/utils/find-zod-transform.test.ts +0 -70
- package/src/utils/find-zod-transform.ts +0 -103
- package/src/utils/get-exported-variable-name.ts +0 -48
- package/src/utils/get-files-and-methods.ts +0 -157
- package/src/utils/get-property-value.test.ts +0 -141
- package/src/utils/get-property-value.ts +0 -331
- package/src/utils/hash.ts +0 -26
- package/src/utils/literal-properties.ts +0 -97
- package/src/utils/load-addon-functions-meta.test.ts +0 -157
- package/src/utils/load-addon-functions-meta.ts +0 -508
- package/src/utils/load-addon-scopes.test.ts +0 -138
- package/src/utils/middleware.test.ts +0 -204
- package/src/utils/middleware.ts +0 -303
- package/src/utils/nested-project-filter.test.ts +0 -53
- package/src/utils/nested-project-filter.ts +0 -28
- package/src/utils/permissions-shorthand.test.ts +0 -79
- package/src/utils/permissions.test.ts +0 -125
- package/src/utils/permissions.ts +0 -129
- package/src/utils/post-process.test.ts +0 -1094
- package/src/utils/post-process.ts +0 -1604
- package/src/utils/resolve-addon-package.ts +0 -106
- package/src/utils/resolve-core-type.test.ts +0 -142
- package/src/utils/resolve-core-type.ts +0 -35
- package/src/utils/resolve-deploy-target.test.ts +0 -135
- package/src/utils/resolve-deploy-target.ts +0 -65
- package/src/utils/resolve-function-meta.ts +0 -25
- package/src/utils/resolve-function-types.ts +0 -42
- package/src/utils/resolve-identifier.ts +0 -46
- package/src/utils/resolve-ref-contract.ts +0 -71
- package/src/utils/resolve-versions.test.ts +0 -499
- package/src/utils/resolve-versions.ts +0 -228
- package/src/utils/schema-cache.test.ts +0 -124
- package/src/utils/schema-generator.test.ts +0 -272
- package/src/utils/schema-generator.ts +0 -780
- package/src/utils/secret-alias-services.test.ts +0 -146
- package/src/utils/secret-alias-services.ts +0 -58
- package/src/utils/serialize-inspector-state.ts +0 -742
- package/src/utils/serialize-mcp-json.ts +0 -150
- package/src/utils/serialize-middleware-groups-meta.ts +0 -36
- package/src/utils/serialize-openapi-json.ts +0 -277
- package/src/utils/serialize-permissions-groups-meta.ts +0 -7
- package/src/utils/single-declaration.ts +0 -57
- package/src/utils/type-utils.ts +0 -145
- package/src/utils/validate-auth-sessionless.ts +0 -30
- package/src/utils/validate-exposed-functions-gated.test.ts +0 -230
- package/src/utils/validate-exposed-functions-gated.ts +0 -103
- package/src/utils/validate-tags-resolve-to-middleware.test.ts +0 -108
- package/src/utils/validate-tags-resolve-to-middleware.ts +0 -48
- package/src/utils/workflow/derive-workflow-plan.test.ts +0 -178
- package/src/utils/workflow/derive-workflow-plan.ts +0 -117
- package/src/utils/workflow/dsl/deserialize-dsl-workflow.ts +0 -1465
- package/src/utils/workflow/dsl/deserialize-fanout-body.test.ts +0 -71
- package/src/utils/workflow/dsl/deserialize-fanout-fidelity.test.ts +0 -99
- package/src/utils/workflow/dsl/deserialize-graph-next.test.ts +0 -161
- package/src/utils/workflow/dsl/deserialize-roundtrip-bindings.test.ts +0 -121
- package/src/utils/workflow/dsl/deserialize-roundtrip-values.test.ts +0 -116
- package/src/utils/workflow/dsl/deserialize-roundtrip.test.ts +0 -145
- package/src/utils/workflow/dsl/extract-approval-policy.test.ts +0 -71
- package/src/utils/workflow/dsl/extract-dsl-workflow.ts +0 -2254
- package/src/utils/workflow/dsl/index.ts +0 -11
- package/src/utils/workflow/dsl/patterns.ts +0 -440
- package/src/utils/workflow/dsl/validation.ts +0 -203
- package/src/utils/workflow/graph/convert-dsl-to-graph-skip.test.ts +0 -35
- package/src/utils/workflow/graph/convert-dsl-to-graph.ts +0 -543
- package/src/utils/workflow/graph/fanout-node-identity.test.ts +0 -105
- package/src/utils/workflow/graph/finalize-workflow-wires.ts +0 -310
- package/src/utils/workflow/graph/finalize-workflows.test.ts +0 -50
- package/src/utils/workflow/graph/finalize-workflows.ts +0 -130
- package/src/utils/workflow/graph/index.ts +0 -28
- package/src/utils/workflow/graph/serialize-workflow-graph.ts +0 -240
- package/src/utils/workflow/graph/workflow-graph.types.ts +0 -281
- package/src/visit.ts +0 -181
- package/tsconfig.json +0 -19
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict'
|
|
2
|
-
import { describe, test, beforeEach, afterEach } from 'node:test'
|
|
3
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'
|
|
4
|
-
import { tmpdir } from 'node:os'
|
|
5
|
-
import { join } from 'node:path'
|
|
6
|
-
import { loadAddonFunctionsMeta } from './load-addon-functions-meta.js'
|
|
7
|
-
|
|
8
|
-
const PACKAGE = '@test/addon'
|
|
9
|
-
|
|
10
|
-
let rootDir: string
|
|
11
|
-
let warnings: string[]
|
|
12
|
-
|
|
13
|
-
const logger = {
|
|
14
|
-
debug: () => {},
|
|
15
|
-
info: () => {},
|
|
16
|
-
warn: (msg: string) => warnings.push(msg),
|
|
17
|
-
error: () => {},
|
|
18
|
-
} as any
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Lays out an installed addon the way the host resolves one: a real package in
|
|
22
|
-
* node_modules whose built `.pikku` carries its generated metadata.
|
|
23
|
-
*/
|
|
24
|
-
const installAddon = (scopesMeta?: unknown) => {
|
|
25
|
-
const pkgDir = join(rootDir, 'node_modules', '@test', 'addon')
|
|
26
|
-
const pikkuDir = join(pkgDir, '.pikku')
|
|
27
|
-
|
|
28
|
-
mkdirSync(join(pikkuDir, 'function'), { recursive: true })
|
|
29
|
-
writeFileSync(
|
|
30
|
-
join(pkgDir, 'package.json'),
|
|
31
|
-
JSON.stringify({ name: PACKAGE, version: '1.0.0' }),
|
|
32
|
-
'utf8'
|
|
33
|
-
)
|
|
34
|
-
writeFileSync(
|
|
35
|
-
join(pikkuDir, 'function', 'pikku-functions-meta.gen.json'),
|
|
36
|
-
JSON.stringify({ someFunc: { pikkuFuncId: 'someFunc' } }),
|
|
37
|
-
'utf8'
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
if (scopesMeta !== undefined) {
|
|
41
|
-
mkdirSync(join(pikkuDir, 'scopes'), { recursive: true })
|
|
42
|
-
writeFileSync(
|
|
43
|
-
join(pikkuDir, 'scopes', 'pikku-scopes-meta.gen.json'),
|
|
44
|
-
JSON.stringify(scopesMeta),
|
|
45
|
-
'utf8'
|
|
46
|
-
)
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const makeState = (definitions: any[] = []) =>
|
|
51
|
-
({
|
|
52
|
-
rootDir,
|
|
53
|
-
addonFunctions: {},
|
|
54
|
-
addonServerlessIncompatible: new Map(),
|
|
55
|
-
addonRequiredParentServices: [],
|
|
56
|
-
mcpEndpoints: { toolsMeta: {} },
|
|
57
|
-
exportedContracts: { addonHttp: {}, addonCli: {}, addonChannel: {} },
|
|
58
|
-
secrets: { definitions: [] },
|
|
59
|
-
variables: { definitions: [] },
|
|
60
|
-
scopes: { definitions, files: new Set() },
|
|
61
|
-
schemas: {},
|
|
62
|
-
rpc: {
|
|
63
|
-
wireAddonDeclarations: new Map([['test', { package: PACKAGE }]]),
|
|
64
|
-
},
|
|
65
|
-
}) as any
|
|
66
|
-
|
|
67
|
-
beforeEach(() => {
|
|
68
|
-
rootDir = mkdtempSync(join(tmpdir(), 'pikku-addon-scopes-'))
|
|
69
|
-
warnings = []
|
|
70
|
-
writeFileSync(
|
|
71
|
-
join(rootDir, 'package.json'),
|
|
72
|
-
JSON.stringify({ name: 'host' }),
|
|
73
|
-
'utf8'
|
|
74
|
-
)
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
afterEach(() => {
|
|
78
|
-
rmSync(rootDir, { recursive: true, force: true })
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
describe('loadAddonFunctionsMeta — addon scopes', () => {
|
|
82
|
-
// Without this, an addon's own scopes never reach the host's ScopeId union or
|
|
83
|
-
// its declared set, so the pikku_scopes FK would reject granting one.
|
|
84
|
-
test("merges an addon's declared scopes into the host state", async () => {
|
|
85
|
-
installAddon({
|
|
86
|
-
pikku: {
|
|
87
|
-
name: 'pikku',
|
|
88
|
-
displayName: 'Pikku',
|
|
89
|
-
scopes: { scopes: { scopes: { manage: {} } } },
|
|
90
|
-
},
|
|
91
|
-
})
|
|
92
|
-
const state = makeState()
|
|
93
|
-
|
|
94
|
-
await loadAddonFunctionsMeta(logger, state)
|
|
95
|
-
|
|
96
|
-
assert.deepEqual(
|
|
97
|
-
state.scopes.definitions.map((d: any) => d.name),
|
|
98
|
-
['pikku']
|
|
99
|
-
)
|
|
100
|
-
assert.deepEqual(state.scopes.definitions[0].scopes, {
|
|
101
|
-
scopes: { scopes: { manage: {} } },
|
|
102
|
-
})
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
test("keeps the host's own scopes alongside the addon's", async () => {
|
|
106
|
-
installAddon({ pikku: { name: 'pikku' } })
|
|
107
|
-
const state = makeState([{ name: 'admin' }])
|
|
108
|
-
|
|
109
|
-
await loadAddonFunctionsMeta(logger, state)
|
|
110
|
-
|
|
111
|
-
assert.deepEqual(state.scopes.definitions.map((d: any) => d.name).sort(), [
|
|
112
|
-
'admin',
|
|
113
|
-
'pikku',
|
|
114
|
-
])
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
// A host that already declares the name owns it — mirrors how addon secrets
|
|
118
|
-
// and variables resolve the same collision.
|
|
119
|
-
test('does not let an addon redeclare a scope the host already owns', async () => {
|
|
120
|
-
installAddon({ admin: { name: 'admin', description: 'from the addon' } })
|
|
121
|
-
const state = makeState([{ name: 'admin', description: 'from the host' }])
|
|
122
|
-
|
|
123
|
-
await loadAddonFunctionsMeta(logger, state)
|
|
124
|
-
|
|
125
|
-
assert.equal(state.scopes.definitions.length, 1)
|
|
126
|
-
assert.equal(state.scopes.definitions[0].description, 'from the host')
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
test('is a no-op for an addon that declares no scopes', async () => {
|
|
130
|
-
installAddon()
|
|
131
|
-
const state = makeState()
|
|
132
|
-
|
|
133
|
-
await loadAddonFunctionsMeta(logger, state)
|
|
134
|
-
|
|
135
|
-
assert.deepEqual(state.scopes.definitions, [])
|
|
136
|
-
assert.deepEqual(warnings, [])
|
|
137
|
-
})
|
|
138
|
-
})
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'node:test'
|
|
2
|
-
import assert from 'node:assert'
|
|
3
|
-
import { resolveAgentMiddleware } from './middleware.js'
|
|
4
|
-
import { getInitialInspectorState } from '../inspector.js'
|
|
5
|
-
import * as ts from 'typescript'
|
|
6
|
-
|
|
7
|
-
function createSourceFile(code: string): ts.SourceFile {
|
|
8
|
-
return ts.createSourceFile('test.ts', code, ts.ScriptTarget.ESNext, true)
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function getObjectLiteral(
|
|
12
|
-
sourceFile: ts.SourceFile
|
|
13
|
-
): ts.ObjectLiteralExpression {
|
|
14
|
-
let result: ts.ObjectLiteralExpression | undefined
|
|
15
|
-
ts.forEachChild(sourceFile, function visit(node) {
|
|
16
|
-
if (ts.isObjectLiteralExpression(node) && !result) {
|
|
17
|
-
result = node
|
|
18
|
-
}
|
|
19
|
-
ts.forEachChild(node, visit)
|
|
20
|
-
})
|
|
21
|
-
if (!result) throw new Error('No object literal found')
|
|
22
|
-
return result
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function createMockChecker(): ts.TypeChecker {
|
|
26
|
-
return {} as any
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
describe('resolveAgentMiddleware', () => {
|
|
30
|
-
test('should return undefined when no agentMiddleware property exists', () => {
|
|
31
|
-
const state = getInitialInspectorState('/test')
|
|
32
|
-
const src = createSourceFile('const x = { name: "test" }')
|
|
33
|
-
const obj = getObjectLiteral(src)
|
|
34
|
-
const checker = createMockChecker()
|
|
35
|
-
|
|
36
|
-
const result = resolveAgentMiddleware(state, obj, checker)
|
|
37
|
-
|
|
38
|
-
assert.strictEqual(result, undefined)
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
test('should return undefined when agentMiddleware array is empty', () => {
|
|
42
|
-
const state = getInitialInspectorState('/test')
|
|
43
|
-
const src = createSourceFile('const x = { agentMiddleware: [] }')
|
|
44
|
-
const obj = getObjectLiteral(src)
|
|
45
|
-
const checker = createMockChecker()
|
|
46
|
-
|
|
47
|
-
const result = resolveAgentMiddleware(state, obj, checker)
|
|
48
|
-
|
|
49
|
-
assert.strictEqual(result, undefined)
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
test('should resolve agentMiddleware identifiers as wire metadata', () => {
|
|
53
|
-
const state = getInitialInspectorState('/test')
|
|
54
|
-
state.agentMiddleware.definitions['myAIMW'] = {
|
|
55
|
-
services: { optimized: true, services: ['logger'] },
|
|
56
|
-
sourceFile: '/test/middleware.ts',
|
|
57
|
-
position: 0,
|
|
58
|
-
exportedName: 'myAIMW',
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const code = 'const x = { agentMiddleware: [myAIMW] }'
|
|
62
|
-
const program = ts.createProgram({
|
|
63
|
-
rootNames: ['test.ts'],
|
|
64
|
-
options: { target: ts.ScriptTarget.ESNext },
|
|
65
|
-
host: {
|
|
66
|
-
...ts.createCompilerHost({}),
|
|
67
|
-
getSourceFile: (name) => {
|
|
68
|
-
if (name === 'test.ts')
|
|
69
|
-
return ts.createSourceFile(name, code, ts.ScriptTarget.ESNext, true)
|
|
70
|
-
return undefined
|
|
71
|
-
},
|
|
72
|
-
fileExists: (name) => name === 'test.ts',
|
|
73
|
-
readFile: (name) => (name === 'test.ts' ? code : undefined),
|
|
74
|
-
},
|
|
75
|
-
})
|
|
76
|
-
const checker = program.getTypeChecker()
|
|
77
|
-
const sourceFile = program.getSourceFile('test.ts')!
|
|
78
|
-
const obj = getObjectLiteral(sourceFile)
|
|
79
|
-
|
|
80
|
-
const result = resolveAgentMiddleware(state, obj, checker)
|
|
81
|
-
|
|
82
|
-
assert.ok(result)
|
|
83
|
-
assert.strictEqual(result.length, 1)
|
|
84
|
-
assert.deepStrictEqual(result[0], {
|
|
85
|
-
type: 'wire',
|
|
86
|
-
name: 'myAIMW',
|
|
87
|
-
inline: false,
|
|
88
|
-
})
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
test('should resolve multiple agentMiddleware entries', () => {
|
|
92
|
-
const state = getInitialInspectorState('/test')
|
|
93
|
-
state.agentMiddleware.definitions['firstMW'] = {
|
|
94
|
-
services: { optimized: true, services: ['logger'] },
|
|
95
|
-
sourceFile: '/test/middleware.ts',
|
|
96
|
-
position: 0,
|
|
97
|
-
exportedName: 'firstMW',
|
|
98
|
-
}
|
|
99
|
-
state.agentMiddleware.definitions['secondMW'] = {
|
|
100
|
-
services: { optimized: true, services: [] },
|
|
101
|
-
sourceFile: '/test/middleware.ts',
|
|
102
|
-
position: 100,
|
|
103
|
-
exportedName: 'secondMW',
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const code = 'const x = { agentMiddleware: [firstMW, secondMW] }'
|
|
107
|
-
const program = ts.createProgram({
|
|
108
|
-
rootNames: ['test.ts'],
|
|
109
|
-
options: { target: ts.ScriptTarget.ESNext },
|
|
110
|
-
host: {
|
|
111
|
-
...ts.createCompilerHost({}),
|
|
112
|
-
getSourceFile: (name) => {
|
|
113
|
-
if (name === 'test.ts')
|
|
114
|
-
return ts.createSourceFile(name, code, ts.ScriptTarget.ESNext, true)
|
|
115
|
-
return undefined
|
|
116
|
-
},
|
|
117
|
-
fileExists: (name) => name === 'test.ts',
|
|
118
|
-
readFile: (name) => (name === 'test.ts' ? code : undefined),
|
|
119
|
-
},
|
|
120
|
-
})
|
|
121
|
-
const checker = program.getTypeChecker()
|
|
122
|
-
const sourceFile = program.getSourceFile('test.ts')!
|
|
123
|
-
const obj = getObjectLiteral(sourceFile)
|
|
124
|
-
|
|
125
|
-
const result = resolveAgentMiddleware(state, obj, checker)
|
|
126
|
-
|
|
127
|
-
assert.ok(result)
|
|
128
|
-
assert.strictEqual(result.length, 2)
|
|
129
|
-
assert.strictEqual(result[0].type, 'wire')
|
|
130
|
-
assert.strictEqual((result[0] as any).name, 'firstMW')
|
|
131
|
-
assert.strictEqual(result[1].type, 'wire')
|
|
132
|
-
assert.strictEqual((result[1] as any).name, 'secondMW')
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
test('should mark inline agentMiddleware (null exportedName)', () => {
|
|
136
|
-
const state = getInitialInspectorState('/test')
|
|
137
|
-
state.agentMiddleware.definitions['inlineMW'] = {
|
|
138
|
-
services: { optimized: true, services: [] },
|
|
139
|
-
sourceFile: '/test/middleware.ts',
|
|
140
|
-
position: 0,
|
|
141
|
-
exportedName: null,
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const code = 'const x = { agentMiddleware: [inlineMW] }'
|
|
145
|
-
const program = ts.createProgram({
|
|
146
|
-
rootNames: ['test.ts'],
|
|
147
|
-
options: { target: ts.ScriptTarget.ESNext },
|
|
148
|
-
host: {
|
|
149
|
-
...ts.createCompilerHost({}),
|
|
150
|
-
getSourceFile: (name) => {
|
|
151
|
-
if (name === 'test.ts')
|
|
152
|
-
return ts.createSourceFile(name, code, ts.ScriptTarget.ESNext, true)
|
|
153
|
-
return undefined
|
|
154
|
-
},
|
|
155
|
-
fileExists: (name) => name === 'test.ts',
|
|
156
|
-
readFile: (name) => (name === 'test.ts' ? code : undefined),
|
|
157
|
-
},
|
|
158
|
-
})
|
|
159
|
-
const checker = program.getTypeChecker()
|
|
160
|
-
const sourceFile = program.getSourceFile('test.ts')!
|
|
161
|
-
const obj = getObjectLiteral(sourceFile)
|
|
162
|
-
|
|
163
|
-
const result = resolveAgentMiddleware(state, obj, checker)
|
|
164
|
-
|
|
165
|
-
assert.ok(result)
|
|
166
|
-
assert.strictEqual(result.length, 1)
|
|
167
|
-
assert.deepStrictEqual(result[0], {
|
|
168
|
-
type: 'wire',
|
|
169
|
-
name: 'inlineMW',
|
|
170
|
-
inline: true,
|
|
171
|
-
})
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
test('should handle agentMiddleware referencing unknown definitions', () => {
|
|
175
|
-
const state = getInitialInspectorState('/test')
|
|
176
|
-
|
|
177
|
-
const code = 'const x = { agentMiddleware: [unknownMW] }'
|
|
178
|
-
const program = ts.createProgram({
|
|
179
|
-
rootNames: ['test.ts'],
|
|
180
|
-
options: { target: ts.ScriptTarget.ESNext },
|
|
181
|
-
host: {
|
|
182
|
-
...ts.createCompilerHost({}),
|
|
183
|
-
getSourceFile: (name) => {
|
|
184
|
-
if (name === 'test.ts')
|
|
185
|
-
return ts.createSourceFile(name, code, ts.ScriptTarget.ESNext, true)
|
|
186
|
-
return undefined
|
|
187
|
-
},
|
|
188
|
-
fileExists: (name) => name === 'test.ts',
|
|
189
|
-
readFile: (name) => (name === 'test.ts' ? code : undefined),
|
|
190
|
-
},
|
|
191
|
-
})
|
|
192
|
-
const checker = program.getTypeChecker()
|
|
193
|
-
const sourceFile = program.getSourceFile('test.ts')!
|
|
194
|
-
const obj = getObjectLiteral(sourceFile)
|
|
195
|
-
|
|
196
|
-
const result = resolveAgentMiddleware(state, obj, checker)
|
|
197
|
-
|
|
198
|
-
assert.ok(result)
|
|
199
|
-
assert.strictEqual(result.length, 1)
|
|
200
|
-
assert.strictEqual(result[0].type, 'wire')
|
|
201
|
-
assert.strictEqual((result[0] as any).name, 'unknownMW')
|
|
202
|
-
assert.strictEqual((result[0] as any).inline, false)
|
|
203
|
-
})
|
|
204
|
-
})
|
package/src/utils/middleware.ts
DELETED
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
import * as ts from 'typescript'
|
|
2
|
-
import type { MiddlewareMetadata } from '@pikku/core/middleware'
|
|
3
|
-
import { extractFunctionName } from './extract-function-name.js'
|
|
4
|
-
import type { InspectorState } from '../types.js'
|
|
5
|
-
|
|
6
|
-
export interface MiddlewareRef {
|
|
7
|
-
definitionId: string
|
|
8
|
-
isFactoryCall: boolean
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function extractMiddlewareRefs(
|
|
12
|
-
arrayNode: ts.Expression,
|
|
13
|
-
checker: ts.TypeChecker,
|
|
14
|
-
rootDir: string
|
|
15
|
-
): MiddlewareRef[] {
|
|
16
|
-
if (!ts.isArrayLiteralExpression(arrayNode)) {
|
|
17
|
-
return []
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const refs: MiddlewareRef[] = []
|
|
21
|
-
for (const element of arrayNode.elements) {
|
|
22
|
-
if (ts.isIdentifier(element)) {
|
|
23
|
-
const { pikkuFuncId } = extractFunctionName(element, checker, rootDir)
|
|
24
|
-
refs.push({
|
|
25
|
-
definitionId: pikkuFuncId.startsWith('__temp_')
|
|
26
|
-
? element.text
|
|
27
|
-
: pikkuFuncId,
|
|
28
|
-
isFactoryCall: false,
|
|
29
|
-
})
|
|
30
|
-
} else if (ts.isCallExpression(element)) {
|
|
31
|
-
const { pikkuFuncId } = extractFunctionName(
|
|
32
|
-
element.expression,
|
|
33
|
-
checker,
|
|
34
|
-
rootDir
|
|
35
|
-
)
|
|
36
|
-
refs.push({
|
|
37
|
-
definitionId:
|
|
38
|
-
pikkuFuncId.startsWith('__temp_') &&
|
|
39
|
-
ts.isIdentifier(element.expression)
|
|
40
|
-
? element.expression.text
|
|
41
|
-
: pikkuFuncId,
|
|
42
|
-
isFactoryCall: true,
|
|
43
|
-
})
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return refs
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function extractMiddlewarePikkuNames(
|
|
50
|
-
arrayNode: ts.Expression,
|
|
51
|
-
checker: ts.TypeChecker,
|
|
52
|
-
rootDir: string
|
|
53
|
-
): string[] {
|
|
54
|
-
return extractMiddlewareRefs(arrayNode, checker, rootDir).map(
|
|
55
|
-
(r) => r.definitionId
|
|
56
|
-
)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function getMiddlewareNode(
|
|
60
|
-
obj: ts.ObjectLiteralExpression
|
|
61
|
-
): ts.Expression | undefined {
|
|
62
|
-
const middlewareProp = obj.properties.find(
|
|
63
|
-
(p) =>
|
|
64
|
-
ts.isPropertyAssignment(p) &&
|
|
65
|
-
ts.isIdentifier(p.name) &&
|
|
66
|
-
p.name.text === 'middleware'
|
|
67
|
-
) as ts.PropertyAssignment | undefined
|
|
68
|
-
|
|
69
|
-
return middlewareProp?.initializer
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function routeMatchesPattern(route: string, pattern: string): boolean {
|
|
73
|
-
if (route === pattern) return true
|
|
74
|
-
|
|
75
|
-
const regexPattern = pattern
|
|
76
|
-
.replace(/[.+?^${}()|[\]\\]/g, '\\$&')
|
|
77
|
-
.replace(/\*/g, '.*')
|
|
78
|
-
|
|
79
|
-
const regex = new RegExp(`^${regexPattern}$`)
|
|
80
|
-
return regex.test(route)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export function resolveHTTPMiddleware(
|
|
84
|
-
state: InspectorState,
|
|
85
|
-
route: string,
|
|
86
|
-
tags: string[] | undefined,
|
|
87
|
-
explicitMiddlewareNode: ts.Expression | undefined,
|
|
88
|
-
checker: ts.TypeChecker
|
|
89
|
-
): MiddlewareMetadata[] | undefined {
|
|
90
|
-
const resolved: MiddlewareMetadata[] = []
|
|
91
|
-
|
|
92
|
-
for (const [pattern, _groupMeta] of state.http.routeMiddleware.entries()) {
|
|
93
|
-
if (routeMatchesPattern(route, pattern)) {
|
|
94
|
-
resolved.push({
|
|
95
|
-
type: 'http',
|
|
96
|
-
route: pattern,
|
|
97
|
-
})
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
if (tags && tags.length > 0) {
|
|
102
|
-
for (const tag of tags) {
|
|
103
|
-
if (state.middleware.tagMiddleware.has(tag)) {
|
|
104
|
-
resolved.push({
|
|
105
|
-
type: 'tag',
|
|
106
|
-
tag,
|
|
107
|
-
})
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (explicitMiddlewareNode) {
|
|
113
|
-
const middlewareNames = extractMiddlewarePikkuNames(
|
|
114
|
-
explicitMiddlewareNode,
|
|
115
|
-
checker,
|
|
116
|
-
state.rootDir
|
|
117
|
-
)
|
|
118
|
-
for (const name of middlewareNames) {
|
|
119
|
-
const def = state.middleware.definitions[name]
|
|
120
|
-
resolved.push({
|
|
121
|
-
type: 'wire',
|
|
122
|
-
name,
|
|
123
|
-
inline: def?.exportedName === null,
|
|
124
|
-
})
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return resolved.length > 0 ? resolved : undefined
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
function resolveTagAndExplicitMiddleware(
|
|
132
|
-
state: InspectorState,
|
|
133
|
-
tags: string[] | undefined,
|
|
134
|
-
explicitMiddlewareNode: ts.Expression | undefined,
|
|
135
|
-
checker: ts.TypeChecker
|
|
136
|
-
): MiddlewareMetadata[] {
|
|
137
|
-
const resolved: MiddlewareMetadata[] = []
|
|
138
|
-
|
|
139
|
-
if (tags && tags.length > 0) {
|
|
140
|
-
for (const tag of tags) {
|
|
141
|
-
if (state.middleware.tagMiddleware.has(tag)) {
|
|
142
|
-
resolved.push({
|
|
143
|
-
type: 'tag',
|
|
144
|
-
tag,
|
|
145
|
-
})
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (explicitMiddlewareNode) {
|
|
151
|
-
const middlewareNames = extractMiddlewarePikkuNames(
|
|
152
|
-
explicitMiddlewareNode,
|
|
153
|
-
checker,
|
|
154
|
-
state.rootDir
|
|
155
|
-
)
|
|
156
|
-
for (const name of middlewareNames) {
|
|
157
|
-
const def = state.middleware.definitions[name]
|
|
158
|
-
resolved.push({
|
|
159
|
-
type: 'wire',
|
|
160
|
-
name,
|
|
161
|
-
inline: def?.exportedName === null,
|
|
162
|
-
})
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return resolved
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
function resolveFunctionMiddlewareInternal(
|
|
170
|
-
state: InspectorState,
|
|
171
|
-
tags: string[] | undefined,
|
|
172
|
-
explicitMiddlewareNode: ts.Expression | undefined,
|
|
173
|
-
checker: ts.TypeChecker
|
|
174
|
-
): MiddlewareMetadata[] | undefined {
|
|
175
|
-
const resolved = resolveTagAndExplicitMiddleware(
|
|
176
|
-
state,
|
|
177
|
-
tags,
|
|
178
|
-
explicitMiddlewareNode,
|
|
179
|
-
checker
|
|
180
|
-
)
|
|
181
|
-
|
|
182
|
-
return resolved.length > 0 ? resolved : undefined
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export function resolveMiddleware(
|
|
186
|
-
state: InspectorState,
|
|
187
|
-
obj: ts.ObjectLiteralExpression,
|
|
188
|
-
tags: string[] | undefined,
|
|
189
|
-
checker: ts.TypeChecker
|
|
190
|
-
): MiddlewareMetadata[] | undefined {
|
|
191
|
-
const explicitMiddlewareNode = getMiddlewareNode(obj)
|
|
192
|
-
return resolveFunctionMiddlewareInternal(
|
|
193
|
-
state,
|
|
194
|
-
tags,
|
|
195
|
-
explicitMiddlewareNode,
|
|
196
|
-
checker
|
|
197
|
-
)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export function resolveHTTPMiddlewareFromObject(
|
|
201
|
-
state: InspectorState,
|
|
202
|
-
route: string,
|
|
203
|
-
obj: ts.ObjectLiteralExpression,
|
|
204
|
-
tags: string[] | undefined,
|
|
205
|
-
checker: ts.TypeChecker
|
|
206
|
-
): MiddlewareMetadata[] | undefined {
|
|
207
|
-
const explicitMiddlewareNode = getMiddlewareNode(obj)
|
|
208
|
-
return resolveHTTPMiddleware(
|
|
209
|
-
state,
|
|
210
|
-
route,
|
|
211
|
-
tags,
|
|
212
|
-
explicitMiddlewareNode,
|
|
213
|
-
checker
|
|
214
|
-
)
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
function getAgentMiddlewareNode(
|
|
218
|
-
obj: ts.ObjectLiteralExpression
|
|
219
|
-
): ts.Expression | undefined {
|
|
220
|
-
const prop = obj.properties.find(
|
|
221
|
-
(p) =>
|
|
222
|
-
ts.isPropertyAssignment(p) &&
|
|
223
|
-
ts.isIdentifier(p.name) &&
|
|
224
|
-
p.name.text === 'agentMiddleware'
|
|
225
|
-
) as ts.PropertyAssignment | undefined
|
|
226
|
-
return prop?.initializer
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
export function resolveAgentMiddleware(
|
|
230
|
-
state: InspectorState,
|
|
231
|
-
obj: ts.ObjectLiteralExpression,
|
|
232
|
-
checker: ts.TypeChecker
|
|
233
|
-
): MiddlewareMetadata[] | undefined {
|
|
234
|
-
const explicitNode = getAgentMiddlewareNode(obj)
|
|
235
|
-
if (!explicitNode) return undefined
|
|
236
|
-
|
|
237
|
-
const names = extractMiddlewarePikkuNames(
|
|
238
|
-
explicitNode,
|
|
239
|
-
checker,
|
|
240
|
-
state.rootDir
|
|
241
|
-
)
|
|
242
|
-
const resolved: MiddlewareMetadata[] = names.map((name) => {
|
|
243
|
-
const def = state.agentMiddleware.definitions[name]
|
|
244
|
-
return {
|
|
245
|
-
type: 'wire' as const,
|
|
246
|
-
name,
|
|
247
|
-
inline: def?.exportedName === null,
|
|
248
|
-
}
|
|
249
|
-
})
|
|
250
|
-
|
|
251
|
-
return resolved.length > 0 ? resolved : undefined
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function getChannelMiddlewareNode(
|
|
255
|
-
obj: ts.ObjectLiteralExpression
|
|
256
|
-
): ts.Expression | undefined {
|
|
257
|
-
const prop = obj.properties.find(
|
|
258
|
-
(p) =>
|
|
259
|
-
ts.isPropertyAssignment(p) &&
|
|
260
|
-
ts.isIdentifier(p.name) &&
|
|
261
|
-
p.name.text === 'channelMiddleware'
|
|
262
|
-
) as ts.PropertyAssignment | undefined
|
|
263
|
-
return prop?.initializer
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
export function resolveChannelMiddleware(
|
|
267
|
-
state: InspectorState,
|
|
268
|
-
obj: ts.ObjectLiteralExpression,
|
|
269
|
-
tags: string[] | undefined,
|
|
270
|
-
checker: ts.TypeChecker
|
|
271
|
-
): MiddlewareMetadata[] | undefined {
|
|
272
|
-
const resolved: MiddlewareMetadata[] = []
|
|
273
|
-
|
|
274
|
-
if (tags && tags.length > 0) {
|
|
275
|
-
for (const tag of tags) {
|
|
276
|
-
if (state.channelMiddleware.tagMiddleware.has(tag)) {
|
|
277
|
-
resolved.push({
|
|
278
|
-
type: 'tag',
|
|
279
|
-
tag,
|
|
280
|
-
})
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
const explicitNode = getChannelMiddlewareNode(obj)
|
|
286
|
-
if (explicitNode) {
|
|
287
|
-
const names = extractMiddlewarePikkuNames(
|
|
288
|
-
explicitNode,
|
|
289
|
-
checker,
|
|
290
|
-
state.rootDir
|
|
291
|
-
)
|
|
292
|
-
for (const name of names) {
|
|
293
|
-
const def = state.channelMiddleware.definitions[name]
|
|
294
|
-
resolved.push({
|
|
295
|
-
type: 'wire',
|
|
296
|
-
name,
|
|
297
|
-
inline: def?.exportedName === null,
|
|
298
|
-
})
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
return resolved.length > 0 ? resolved : undefined
|
|
303
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { test } from 'node:test'
|
|
2
|
-
import * as assert from 'node:assert'
|
|
3
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'fs'
|
|
4
|
-
import { tmpdir } from 'os'
|
|
5
|
-
import { join } from 'path'
|
|
6
|
-
import { createNestedProjectFilter } from './nested-project-filter.js'
|
|
7
|
-
|
|
8
|
-
test('createNestedProjectFilter', async (t) => {
|
|
9
|
-
const root = mkdtempSync(join(tmpdir(), 'pikku-nested-'))
|
|
10
|
-
t.after(() => rmSync(root, { recursive: true, force: true }))
|
|
11
|
-
|
|
12
|
-
writeFileSync(join(root, 'pikku.config.json'), '{}')
|
|
13
|
-
mkdirSync(join(root, 'packages/functions/src'), { recursive: true })
|
|
14
|
-
mkdirSync(join(root, 'packages/addon/src'), { recursive: true })
|
|
15
|
-
mkdirSync(join(root, 'packages/addon/types'), { recursive: true })
|
|
16
|
-
writeFileSync(join(root, 'packages/addon/pikku.config.json'), '{}')
|
|
17
|
-
|
|
18
|
-
const isNested = createNestedProjectFilter(root)
|
|
19
|
-
|
|
20
|
-
await t.test('keeps project source files', () => {
|
|
21
|
-
assert.strictEqual(
|
|
22
|
-
isNested(join(root, 'packages/functions/src/auth.ts')),
|
|
23
|
-
false
|
|
24
|
-
)
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
await t.test('keeps files directly under rootDir', () => {
|
|
28
|
-
assert.strictEqual(isNested(join(root, 'services.ts')), false)
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
await t.test('excludes files inside a nested pikku project', () => {
|
|
32
|
-
assert.strictEqual(
|
|
33
|
-
isNested(join(root, 'packages/addon/types/application-types.d.ts')),
|
|
34
|
-
true
|
|
35
|
-
)
|
|
36
|
-
assert.strictEqual(
|
|
37
|
-
isNested(join(root, 'packages/addon/src/index.ts')),
|
|
38
|
-
true
|
|
39
|
-
)
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
await t.test('keeps files outside rootDir untouched', () => {
|
|
43
|
-
assert.strictEqual(isNested('/somewhere/else/file.ts'), false)
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
await t.test('rootDir itself is not treated as nested', () => {
|
|
47
|
-
const addonScoped = createNestedProjectFilter(join(root, 'packages/addon'))
|
|
48
|
-
assert.strictEqual(
|
|
49
|
-
addonScoped(join(root, 'packages/addon/src/index.ts')),
|
|
50
|
-
false
|
|
51
|
-
)
|
|
52
|
-
})
|
|
53
|
-
})
|