@far-world-labs/verblets 0.2.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -213
- package/dist/index.browser.js +74 -0
- package/dist/index.js +548 -0
- package/dist/shared-C6kPWghF.js +7806 -0
- package/package.json +32 -11
- package/.cursor/launch.json +0 -30
- package/.cursor/settings.json +0 -20
- package/.github/workflows/branch-protection.yml +0 -22
- package/.github/workflows/ci.yml +0 -165
- package/.husky/pre-commit +0 -4
- package/.prettierrc +0 -6
- package/.release-it.json +0 -12
- package/.vitest.config.examples.js +0 -12
- package/.vitest.config.js +0 -8
- package/.vscode/launch.json +0 -31
- package/AGENTS.md +0 -220
- package/DEVELOPING.md +0 -105
- package/docker-compose.yml +0 -7
- package/eslint.config.js +0 -80
- package/scripts/clear-redis.js +0 -74
- package/scripts/generate-chain/index.js +0 -111
- package/scripts/generate-lib/index.js +0 -68
- package/scripts/generate-test/index.js +0 -137
- package/scripts/generate-verblet/README.md +0 -17
- package/scripts/generate-verblet/index.js +0 -110
- package/scripts/run.sh +0 -15
- package/scripts/runner/index.js +0 -56
- package/scripts/simple-editor/README.md +0 -34
- package/scripts/simple-editor/index.js +0 -79
- package/scripts/summarize-files/index.js +0 -70
- package/src/chains/README.md +0 -30
- package/src/chains/anonymize/README.md +0 -21
- package/src/chains/anonymize/index.examples.js +0 -75
- package/src/chains/anonymize/index.js +0 -121
- package/src/chains/anonymize/index.spec.js +0 -78
- package/src/chains/bulk-central-tendency/index.examples.js +0 -138
- package/src/chains/bulk-central-tendency/index.js +0 -91
- package/src/chains/bulk-filter/README.md +0 -21
- package/src/chains/bulk-filter/index.examples.js +0 -22
- package/src/chains/bulk-filter/index.js +0 -58
- package/src/chains/bulk-filter/index.spec.js +0 -38
- package/src/chains/bulk-find/README.md +0 -16
- package/src/chains/bulk-find/index.examples.js +0 -20
- package/src/chains/bulk-find/index.js +0 -30
- package/src/chains/bulk-find/index.spec.js +0 -26
- package/src/chains/bulk-group/README.md +0 -23
- package/src/chains/bulk-group/index.examples.js +0 -18
- package/src/chains/bulk-group/index.js +0 -34
- package/src/chains/bulk-group/index.spec.js +0 -41
- package/src/chains/bulk-map/README.md +0 -43
- package/src/chains/bulk-map/index.examples.js +0 -17
- package/src/chains/bulk-map/index.js +0 -86
- package/src/chains/bulk-map/index.spec.js +0 -44
- package/src/chains/bulk-reduce/README.md +0 -12
- package/src/chains/bulk-reduce/index.examples.js +0 -15
- package/src/chains/bulk-reduce/index.js +0 -13
- package/src/chains/bulk-reduce/index.spec.js +0 -25
- package/src/chains/bulk-score/README.md +0 -16
- package/src/chains/bulk-score/bulk-score-result.json +0 -18
- package/src/chains/bulk-score/index.examples.js +0 -22
- package/src/chains/bulk-score/index.js +0 -133
- package/src/chains/bulk-score/index.spec.js +0 -30
- package/src/chains/category-samples/README.md +0 -61
- package/src/chains/category-samples/index.examples.js +0 -103
- package/src/chains/category-samples/index.js +0 -134
- package/src/chains/collect-terms/README.md +0 -12
- package/src/chains/collect-terms/index.examples.js +0 -16
- package/src/chains/collect-terms/index.js +0 -44
- package/src/chains/collect-terms/index.spec.js +0 -25
- package/src/chains/conversation/README.md +0 -26
- package/src/chains/conversation/index.examples.js +0 -398
- package/src/chains/conversation/index.js +0 -126
- package/src/chains/conversation/index.spec.js +0 -148
- package/src/chains/conversation/turn-policies.js +0 -93
- package/src/chains/conversation/turn-policies.md +0 -123
- package/src/chains/conversation/turn-policies.spec.js +0 -135
- package/src/chains/date/README.md +0 -12
- package/src/chains/date/index.examples.js +0 -47
- package/src/chains/date/index.js +0 -74
- package/src/chains/date/index.spec.js +0 -62
- package/src/chains/disambiguate/README.md +0 -22
- package/src/chains/disambiguate/disambiguate-meanings-result.json +0 -16
- package/src/chains/disambiguate/index.examples.js +0 -18
- package/src/chains/disambiguate/index.js +0 -92
- package/src/chains/disambiguate/index.spec.js +0 -25
- package/src/chains/dismantle/README.md +0 -67
- package/src/chains/dismantle/dismantle.examples.js +0 -27
- package/src/chains/dismantle/index.examples.js +0 -30
- package/src/chains/dismantle/index.js +0 -303
- package/src/chains/dismantle/index.spec.js +0 -32
- package/src/chains/expect/README.md +0 -171
- package/src/chains/expect/index.examples.js +0 -146
- package/src/chains/expect/index.js +0 -207
- package/src/chains/expect/index.spec.js +0 -324
- package/src/chains/filter-ambiguous/README.md +0 -11
- package/src/chains/filter-ambiguous/index.examples.js +0 -20
- package/src/chains/filter-ambiguous/index.js +0 -49
- package/src/chains/filter-ambiguous/index.spec.js +0 -31
- package/src/chains/glossary/README.md +0 -19
- package/src/chains/glossary/index.examples.js +0 -386
- package/src/chains/glossary/index.js +0 -75
- package/src/chains/glossary/index.spec.js +0 -19
- package/src/chains/intersections/README.md +0 -166
- package/src/chains/intersections/index.examples.js +0 -280
- package/src/chains/intersections/index.js +0 -218
- package/src/chains/intersections/intersection-result.json +0 -38
- package/src/chains/list/index.examples.js +0 -68
- package/src/chains/list/index.js +0 -214
- package/src/chains/list/index.spec.js +0 -67
- package/src/chains/list/list-result.json +0 -16
- package/src/chains/list/schema.json +0 -24
- package/src/chains/llm-logger/README.md +0 -366
- package/src/chains/llm-logger/index.js +0 -591
- package/src/chains/llm-logger/index.spec.js +0 -391
- package/src/chains/llm-logger/schema.json +0 -105
- package/src/chains/questions/index.examples.js +0 -69
- package/src/chains/questions/index.js +0 -135
- package/src/chains/questions/index.spec.js +0 -29
- package/src/chains/scan-js/index.js +0 -116
- package/src/chains/set-interval/README.md +0 -81
- package/src/chains/set-interval/index.examples.js +0 -64
- package/src/chains/set-interval/index.js +0 -152
- package/src/chains/set-interval/index.spec.js +0 -70
- package/src/chains/socratic/README.md +0 -17
- package/src/chains/socratic/index.js +0 -64
- package/src/chains/socratic/index.spec.js +0 -24
- package/src/chains/sort/index.examples.js +0 -36
- package/src/chains/sort/index.js +0 -163
- package/src/chains/sort/index.spec.js +0 -112
- package/src/chains/sort/sort-result.json +0 -16
- package/src/chains/summary-map/README.md +0 -41
- package/src/chains/summary-map/index.examples.js +0 -64
- package/src/chains/summary-map/index.js +0 -226
- package/src/chains/summary-map/index.spec.js +0 -153
- package/src/chains/test/index.js +0 -114
- package/src/chains/test-advice/index.js +0 -35
- package/src/chains/themes/README.md +0 -20
- package/src/chains/themes/index.examples.js +0 -17
- package/src/chains/themes/index.js +0 -28
- package/src/chains/themes/index.spec.js +0 -19
- package/src/chains/veiled-variants/index.examples.js +0 -18
- package/src/chains/veiled-variants/index.js +0 -107
- package/src/chains/veiled-variants/index.spec.js +0 -40
- package/src/constants/common.js +0 -13
- package/src/constants/messages.js +0 -3
- package/src/constants/models.js +0 -184
- package/src/index.js +0 -203
- package/src/json-schemas/README.md +0 -13
- package/src/json-schemas/cars-test.json +0 -11
- package/src/json-schemas/index.js +0 -12
- package/src/json-schemas/intent.json +0 -38
- package/src/json-schemas/schema-dot-org-photograph.json +0 -133
- package/src/json-schemas/schema-dot-org-place.json +0 -129
- package/src/lib/README.md +0 -26
- package/src/lib/any-signal/index.js +0 -28
- package/src/lib/assert/README.md +0 -84
- package/src/lib/assert/index.js +0 -50
- package/src/lib/bulk-filter/README.md +0 -22
- package/src/lib/bulk-filter/index.examples.js +0 -27
- package/src/lib/bulk-filter/index.js +0 -63
- package/src/lib/bulk-filter/index.spec.js +0 -38
- package/src/lib/bulk-find/README.md +0 -18
- package/src/lib/bulk-find/index.examples.js +0 -19
- package/src/lib/bulk-find/index.js +0 -30
- package/src/lib/bulk-find/index.spec.js +0 -41
- package/src/lib/chatgpt/index.js +0 -163
- package/src/lib/combinations/index.js +0 -30
- package/src/lib/combinations/index.spec.js +0 -23
- package/src/lib/editor/index.js +0 -31
- package/src/lib/functional/index.js +0 -28
- package/src/lib/logger-service/index.js +0 -32
- package/src/lib/parse-js-parts/index.js +0 -321
- package/src/lib/parse-js-parts/index.spec.js +0 -156
- package/src/lib/parse-llm-list/README.md +0 -39
- package/src/lib/parse-llm-list/index.js +0 -54
- package/src/lib/parse-llm-list/index.spec.js +0 -59
- package/src/lib/path-aliases/index.js +0 -37
- package/src/lib/path-aliases/index.spec.js +0 -64
- package/src/lib/pave/index.js +0 -34
- package/src/lib/pave/index.spec.js +0 -76
- package/src/lib/prompt-cache/index.js +0 -50
- package/src/lib/retry/index.js +0 -66
- package/src/lib/retry/index.spec.js +0 -86
- package/src/lib/ring-buffer/README.md +0 -82
- package/src/lib/ring-buffer/index.js +0 -235
- package/src/lib/ring-buffer/index.spec.js +0 -388
- package/src/lib/search-best-first/city-walk.spec.js +0 -37
- package/src/lib/search-best-first/index.js +0 -97
- package/src/lib/search-best-first/index.spec.js +0 -35
- package/src/lib/search-js-files/code-features-property-definitions.json +0 -123
- package/src/lib/search-js-files/index.examples.js +0 -22
- package/src/lib/search-js-files/index.js +0 -155
- package/src/lib/search-js-files/index.spec.js +0 -34
- package/src/lib/search-js-files/scan-file.js +0 -242
- package/src/lib/shorten-text/index.js +0 -25
- package/src/lib/shorten-text/index.spec.js +0 -68
- package/src/lib/strip-numeric/index.js +0 -5
- package/src/lib/strip-response/index.js +0 -30
- package/src/lib/template-replace/index.js +0 -23
- package/src/lib/template-replace/index.spec.js +0 -60
- package/src/lib/timed-abort-controller/index.js +0 -41
- package/src/lib/to-bool/index.js +0 -8
- package/src/lib/to-date/index.js +0 -11
- package/src/lib/to-enum/index.js +0 -14
- package/src/lib/to-number/index.js +0 -12
- package/src/lib/to-number-with-units/index.js +0 -51
- package/src/lib/transcribe/index.js +0 -78
- package/src/prompts/README.md +0 -17
- package/src/prompts/as-enum.js +0 -5
- package/src/prompts/as-json-schema.js +0 -9
- package/src/prompts/as-object-with-schema.js +0 -26
- package/src/prompts/as-schema-org-text.js +0 -25
- package/src/prompts/as-schema-org-type.js +0 -1
- package/src/prompts/blog-post.js +0 -7
- package/src/prompts/code-features.js +0 -24
- package/src/prompts/constants.js +0 -101
- package/src/prompts/features-json-schema.js +0 -27
- package/src/prompts/generate-collection.js +0 -26
- package/src/prompts/generate-list.js +0 -48
- package/src/prompts/generate-questions.js +0 -19
- package/src/prompts/index.js +0 -20
- package/src/prompts/intent.js +0 -60
- package/src/prompts/output-succinct-names.js +0 -3
- package/src/prompts/select-from-threshold.js +0 -17
- package/src/prompts/sort.js +0 -31
- package/src/prompts/style.js +0 -38
- package/src/prompts/summarize.js +0 -13
- package/src/prompts/token-budget.js +0 -3
- package/src/prompts/wrap-list.js +0 -11
- package/src/prompts/wrap-variable.js +0 -36
- package/src/services/llm-model/global-overrides.spec.js +0 -432
- package/src/services/llm-model/index.js +0 -308
- package/src/services/llm-model/model.js +0 -21
- package/src/services/llm-model/negotiate.spec.js +0 -447
- package/src/services/redis/index.js +0 -147
- package/src/test/setup.js +0 -20
- package/src/verblets/README.md +0 -26
- package/src/verblets/auto/index.examples.js +0 -31
- package/src/verblets/auto/index.js +0 -28
- package/src/verblets/auto/index.spec.js +0 -32
- package/src/verblets/bool/README.md +0 -36
- package/src/verblets/bool/index.examples.js +0 -80
- package/src/verblets/bool/index.js +0 -25
- package/src/verblets/bool/index.schema.json +0 -14
- package/src/verblets/bool/index.spec.js +0 -33
- package/src/verblets/central-tendency/README.md +0 -166
- package/src/verblets/central-tendency/central-tendency-result.json +0 -24
- package/src/verblets/central-tendency/index.examples.js +0 -196
- package/src/verblets/central-tendency/index.js +0 -171
- package/src/verblets/central-tendency/index.spec.js +0 -148
- package/src/verblets/conversation-turn/README.md +0 -33
- package/src/verblets/conversation-turn/index.examples.js +0 -218
- package/src/verblets/conversation-turn/index.js +0 -68
- package/src/verblets/conversation-turn/index.spec.js +0 -77
- package/src/verblets/conversation-turn-multi/README.md +0 -31
- package/src/verblets/conversation-turn-multi/index.examples.js +0 -160
- package/src/verblets/conversation-turn-multi/index.js +0 -104
- package/src/verblets/conversation-turn-multi/index.spec.js +0 -63
- package/src/verblets/enum/index.examples.js +0 -30
- package/src/verblets/enum/index.js +0 -18
- package/src/verblets/enum/index.spec.js +0 -35
- package/src/verblets/expect/README.md +0 -64
- package/src/verblets/expect/index.examples.js +0 -109
- package/src/verblets/expect/index.js +0 -75
- package/src/verblets/expect/index.spec.js +0 -127
- package/src/verblets/intent/index.examples.js +0 -139
- package/src/verblets/intent/index.js +0 -60
- package/src/verblets/intent/index.spec.js +0 -31
- package/src/verblets/intersection/README.md +0 -16
- package/src/verblets/intersection/index.examples.js +0 -89
- package/src/verblets/intersection/index.js +0 -125
- package/src/verblets/intersection/index.spec.js +0 -60
- package/src/verblets/intersection/intersection-result.json +0 -16
- package/src/verblets/list-expand/README.md +0 -10
- package/src/verblets/list-expand/index.examples.js +0 -14
- package/src/verblets/list-expand/index.js +0 -104
- package/src/verblets/list-expand/index.spec.js +0 -18
- package/src/verblets/list-expand/list-expand-result.json +0 -16
- package/src/verblets/list-filter/README.md +0 -22
- package/src/verblets/list-filter/index.examples.js +0 -26
- package/src/verblets/list-filter/index.js +0 -18
- package/src/verblets/list-filter/index.spec.js +0 -19
- package/src/verblets/list-find/README.md +0 -11
- package/src/verblets/list-find/index.examples.js +0 -15
- package/src/verblets/list-find/index.js +0 -17
- package/src/verblets/list-find/index.spec.js +0 -19
- package/src/verblets/list-group/README.md +0 -16
- package/src/verblets/list-group/index.examples.js +0 -16
- package/src/verblets/list-group/index.js +0 -112
- package/src/verblets/list-group/index.spec.js +0 -35
- package/src/verblets/list-group/list-group-result.json +0 -16
- package/src/verblets/list-map/README.md +0 -11
- package/src/verblets/list-map/index.examples.js +0 -15
- package/src/verblets/list-map/index.js +0 -26
- package/src/verblets/list-map/index.spec.js +0 -17
- package/src/verblets/list-reduce/README.md +0 -10
- package/src/verblets/list-reduce/index.examples.js +0 -14
- package/src/verblets/list-reduce/index.js +0 -21
- package/src/verblets/list-reduce/index.spec.js +0 -27
- package/src/verblets/list-reduce/index.spec.jsx +0 -27
- package/src/verblets/name/README.md +0 -15
- package/src/verblets/name/index.examples.js +0 -28
- package/src/verblets/name/index.js +0 -19
- package/src/verblets/name/index.spec.js +0 -33
- package/src/verblets/name-similar-to/README.md +0 -26
- package/src/verblets/name-similar-to/index.examples.js +0 -18
- package/src/verblets/name-similar-to/index.js +0 -20
- package/src/verblets/name-similar-to/index.spec.js +0 -13
- package/src/verblets/number/index.examples.js +0 -199
- package/src/verblets/number/index.js +0 -25
- package/src/verblets/number/index.spec.js +0 -33
- package/src/verblets/number-with-units/index.examples.js +0 -38
- package/src/verblets/number-with-units/index.js +0 -84
- package/src/verblets/number-with-units/index.spec.js +0 -46
- package/src/verblets/number-with-units/number-with-units-result.json +0 -23
- package/src/verblets/people-list/README.md +0 -28
- package/src/verblets/people-list/index.examples.js +0 -184
- package/src/verblets/people-list/index.js +0 -44
- package/src/verblets/people-list/index.spec.js +0 -49
- package/src/verblets/schema-org/index.examples.js +0 -51
- package/src/verblets/schema-org/index.js +0 -37
- package/src/verblets/schema-org/index.spec.js +0 -39
- package/src/verblets/sentiment/README.md +0 -10
- package/src/verblets/sentiment/index.examples.js +0 -20
- package/src/verblets/sentiment/index.js +0 -9
- package/src/verblets/sentiment/index.spec.js +0 -20
- package/src/verblets/to-object/README.md +0 -38
- package/src/verblets/to-object/index.examples.js +0 -29
- package/src/verblets/to-object/index.js +0 -131
- package/src/verblets/to-object/index.spec.js +0 -71
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import listMap from './index.js';
|
|
3
|
-
|
|
4
|
-
vi.mock('../../lib/chatgpt/index.js', () => ({
|
|
5
|
-
default: vi.fn(async (prompt) => {
|
|
6
|
-
const match = prompt.match(/<list>\n([\s\S]*?)\n<\/list>/);
|
|
7
|
-
const lines = match ? match[1].split('\n') : [];
|
|
8
|
-
return lines.map((l) => l.toUpperCase()).join('\n');
|
|
9
|
-
}),
|
|
10
|
-
}));
|
|
11
|
-
|
|
12
|
-
describe('list-map verblet', () => {
|
|
13
|
-
it('maps items using instructions', async () => {
|
|
14
|
-
const result = await listMap(['alpha', 'beta'], 'uppercase');
|
|
15
|
-
expect(result).toStrictEqual(['ALPHA', 'BETA']);
|
|
16
|
-
});
|
|
17
|
-
});
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# list-reduce
|
|
2
|
-
|
|
3
|
-
Combine an accumulator value with a list of strings using custom instructions in a single ChatGPT call. Returns the final accumulator.
|
|
4
|
-
|
|
5
|
-
```javascript
|
|
6
|
-
import listReduce from './index.js';
|
|
7
|
-
|
|
8
|
-
await listReduce('', ['alpha', 'beta', 'gamma'], 'Concatenate them');
|
|
9
|
-
// => 'alpha beta gamma'
|
|
10
|
-
```
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import listReduce from './index.js';
|
|
3
|
-
import { longTestTimeout } from '../../constants/common.js';
|
|
4
|
-
|
|
5
|
-
describe('list-reduce examples', () => {
|
|
6
|
-
it(
|
|
7
|
-
'combines items with custom instructions',
|
|
8
|
-
async () => {
|
|
9
|
-
const result = await listReduce('', ['red', 'green', 'blue'], 'join with commas');
|
|
10
|
-
expect(result.length).toBeGreaterThan(0);
|
|
11
|
-
},
|
|
12
|
-
longTestTimeout
|
|
13
|
-
);
|
|
14
|
-
});
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import chatGPT from '../../lib/chatgpt/index.js';
|
|
2
|
-
import wrapVariable from '../../prompts/wrap-variable.js';
|
|
3
|
-
|
|
4
|
-
function buildPrompt(acc, list, instructions) {
|
|
5
|
-
const instructionsBlock = wrapVariable(instructions, {
|
|
6
|
-
tag: 'instructions',
|
|
7
|
-
forceHTML: true,
|
|
8
|
-
});
|
|
9
|
-
const accBlock = wrapVariable(acc, { tag: 'accumulator', forceHTML: true });
|
|
10
|
-
const listBlock = wrapVariable(list.join('\n'), { tag: 'list' });
|
|
11
|
-
return `Start with the given accumulator. Apply the <instructions> to each item in <list> sequentially, using the result as the new accumulator each time. Return only the final accumulator.\n\n${instructionsBlock}\n${accBlock}\n${listBlock}`;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export default async function listReduce(acc, list, instructions, config = {}) {
|
|
15
|
-
const { llm, ...options } = config;
|
|
16
|
-
const output = await chatGPT(buildPrompt(acc, list, instructions), {
|
|
17
|
-
modelOptions: { ...llm },
|
|
18
|
-
...options,
|
|
19
|
-
});
|
|
20
|
-
return output.trim();
|
|
21
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import listReduce from './index.js';
|
|
3
|
-
|
|
4
|
-
vi.mock('../../lib/chatgpt/index.js', () => ({
|
|
5
|
-
default: vi.fn((prompt) => {
|
|
6
|
-
const listMatch = prompt.match(/<list>\n([\s\S]*?)\n<\/list>/);
|
|
7
|
-
const accMatch = prompt.match(/<accumulator>\n([\s\S]*?)\n<\/accumulator>/);
|
|
8
|
-
let lines = [];
|
|
9
|
-
|
|
10
|
-
if (listMatch && accMatch) {
|
|
11
|
-
lines = listMatch[1]
|
|
12
|
-
.split('\n')
|
|
13
|
-
.map((line) => line.trim())
|
|
14
|
-
.filter(Boolean);
|
|
15
|
-
return lines.join('+');
|
|
16
|
-
}
|
|
17
|
-
// Return just the joined list items
|
|
18
|
-
return lines.join('+');
|
|
19
|
-
}),
|
|
20
|
-
}));
|
|
21
|
-
|
|
22
|
-
describe('list-reduce verblet', () => {
|
|
23
|
-
it('reduces items using instructions', async () => {
|
|
24
|
-
const result = await listReduce('0', ['a', 'b', 'c'], 'join');
|
|
25
|
-
expect(result).toBe('a+b+c');
|
|
26
|
-
});
|
|
27
|
-
});
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import listReduce from './index.js';
|
|
3
|
-
|
|
4
|
-
vi.mock('../../lib/chatgpt/index.js', () => ({
|
|
5
|
-
default: vi.fn((prompt) => {
|
|
6
|
-
const listMatch = prompt.match(/<list>\n([\s\S]*?)\n<\/list>/);
|
|
7
|
-
const accMatch = prompt.match(/<accumulator>\n([\s\S]*?)\n<\/accumulator>/);
|
|
8
|
-
|
|
9
|
-
if (listMatch && accMatch) {
|
|
10
|
-
const acc = accMatch[1].trim();
|
|
11
|
-
const lines = listMatch[1]
|
|
12
|
-
.split('\n')
|
|
13
|
-
.map((line) => line.trim())
|
|
14
|
-
.filter(Boolean);
|
|
15
|
-
return `${acc}+${lines.join('+')}`;
|
|
16
|
-
}
|
|
17
|
-
// Return the joined result as expected
|
|
18
|
-
return [acc, ...lines].join('+');
|
|
19
|
-
}),
|
|
20
|
-
}));
|
|
21
|
-
|
|
22
|
-
describe('list-reduce verblet', () => {
|
|
23
|
-
it('reduces items using instructions', async () => {
|
|
24
|
-
const result = await listReduce('0', ['a', 'b', 'c'], 'join');
|
|
25
|
-
expect(result).toBe('0+a+b+c');
|
|
26
|
-
});
|
|
27
|
-
});
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# name
|
|
2
|
-
Generate a short, descriptive name for any text or concept.
|
|
3
|
-
|
|
4
|
-
This verblet taps into the language model's understanding of nuance to create names that capture the essence of your content. Use it whenever a simple keyword search isn't enough and you want an evocative title.
|
|
5
|
-
|
|
6
|
-
## Usage
|
|
7
|
-
|
|
8
|
-
```javascript
|
|
9
|
-
import { name } from '@far-world-labs';
|
|
10
|
-
|
|
11
|
-
const diaryTitle = await name(
|
|
12
|
-
'Voice memos from friends sharing their hopes and worries'
|
|
13
|
-
);
|
|
14
|
-
console.log(diaryTitle); // "Shared Reflections" (example)
|
|
15
|
-
```
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { longTestTimeout } from '../../constants/common.js';
|
|
3
|
-
import name from './index.js';
|
|
4
|
-
|
|
5
|
-
const examples = [
|
|
6
|
-
{ got: { text: 'Chat logs for customer support' }, want: 'chatSupportLogs' },
|
|
7
|
-
{ got: { text: 'Sensor readings from smart home devices' }, want: 'smartHomeSensorReadings' },
|
|
8
|
-
{
|
|
9
|
-
got: {
|
|
10
|
-
text: 'Voice memos from friends sharing their hopes and worries',
|
|
11
|
-
},
|
|
12
|
-
want: 'voiceMemos',
|
|
13
|
-
},
|
|
14
|
-
];
|
|
15
|
-
|
|
16
|
-
describe('name verblet', () => {
|
|
17
|
-
examples.forEach((example) => {
|
|
18
|
-
it(
|
|
19
|
-
example.got.text,
|
|
20
|
-
async () => {
|
|
21
|
-
const result = await name(example.got.text);
|
|
22
|
-
expect(typeof result).toBe('string');
|
|
23
|
-
expect(result.length).toBeGreaterThan(0);
|
|
24
|
-
},
|
|
25
|
-
longTestTimeout
|
|
26
|
-
);
|
|
27
|
-
});
|
|
28
|
-
});
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import chatGPT from '../../lib/chatgpt/index.js';
|
|
2
|
-
import stripResponse from '../../lib/strip-response/index.js';
|
|
3
|
-
import wrapVariable from '../../prompts/wrap-variable.js';
|
|
4
|
-
import { constants as promptConstants } from '../../prompts/index.js';
|
|
5
|
-
|
|
6
|
-
const { asUndefinedByDefault, contentIsQuestion } = promptConstants;
|
|
7
|
-
|
|
8
|
-
export default async function name(subject, config = {}) {
|
|
9
|
-
const { llm, ...options } = config;
|
|
10
|
-
const prompt = `${contentIsQuestion} Suggest a concise, memorable name for the <subject>.\n\n${wrapVariable(
|
|
11
|
-
subject,
|
|
12
|
-
{
|
|
13
|
-
tag: 'subject',
|
|
14
|
-
}
|
|
15
|
-
)} ${asUndefinedByDefault}`;
|
|
16
|
-
const response = await chatGPT(prompt, { modelOptions: { ...llm }, ...options });
|
|
17
|
-
const [firstLine] = stripResponse(response).split('\n');
|
|
18
|
-
return firstLine.trim();
|
|
19
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
|
|
3
|
-
import name from './index.js';
|
|
4
|
-
|
|
5
|
-
vi.mock('../../lib/chatgpt/index.js', () => ({
|
|
6
|
-
default: vi.fn().mockImplementation((text) => {
|
|
7
|
-
if (/weather pattern/i.test(text)) {
|
|
8
|
-
return 'BlueSkies';
|
|
9
|
-
}
|
|
10
|
-
return 'undefined';
|
|
11
|
-
}),
|
|
12
|
-
}));
|
|
13
|
-
|
|
14
|
-
const examples = [
|
|
15
|
-
{
|
|
16
|
-
name: 'Generates descriptive name',
|
|
17
|
-
inputs: { text: 'Dataset of weather pattern observations' },
|
|
18
|
-
want: { result: 'BlueSkies' },
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
name: 'Returns undefined when unsure',
|
|
22
|
-
inputs: { text: '???' },
|
|
23
|
-
want: { result: 'undefined' },
|
|
24
|
-
},
|
|
25
|
-
];
|
|
26
|
-
|
|
27
|
-
describe('name verblet', () => {
|
|
28
|
-
examples.forEach((example) => {
|
|
29
|
-
it(example.name, async () => {
|
|
30
|
-
expect(await name(example.inputs.text)).toStrictEqual(example.want.result);
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
});
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# name-similar-to
|
|
2
|
-
|
|
3
|
-
Generate a short, catchy name for something using the style of existing names. This verblet relies on a language model to capture the tone and brevity of your sample names.
|
|
4
|
-
|
|
5
|
-
```javascript
|
|
6
|
-
import nameSimilarTo from './index.js';
|
|
7
|
-
|
|
8
|
-
const newName = await nameSimilarTo(
|
|
9
|
-
'dataset of daily coffee tasting notes',
|
|
10
|
-
['BeanDiary', 'RoastLog', 'BrewIndex']
|
|
11
|
-
);
|
|
12
|
-
// => 'TastingLog'
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Example: naming a hiking journal
|
|
16
|
-
|
|
17
|
-
Imagine cataloging your weekend trail adventures. You already use names like `TrailNotes`, `GearTips`, and `CampfireStories`. Ask the verblet to suggest a matching name for your wildlife sightings log:
|
|
18
|
-
|
|
19
|
-
```javascript
|
|
20
|
-
const exampleNames = ['TrailNotes', 'GearTips', 'CampfireStories'];
|
|
21
|
-
const wildlifeLog = await nameSimilarTo(
|
|
22
|
-
'journal of wildlife spotted on each hike',
|
|
23
|
-
exampleNames
|
|
24
|
-
);
|
|
25
|
-
// => 'WildlifeWatch'
|
|
26
|
-
```
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import nameSimilarTo from './index.js';
|
|
3
|
-
import { longTestTimeout } from '../../constants/common.js';
|
|
4
|
-
|
|
5
|
-
describe('nameSimilarTo examples', () => {
|
|
6
|
-
it(
|
|
7
|
-
'suggests a matching name',
|
|
8
|
-
async () => {
|
|
9
|
-
const result = await nameSimilarTo('record of coffee tasting notes', [
|
|
10
|
-
'BeanDiary',
|
|
11
|
-
'RoastLog',
|
|
12
|
-
'BrewIndex',
|
|
13
|
-
]);
|
|
14
|
-
expect(typeof result).toBe('string');
|
|
15
|
-
},
|
|
16
|
-
longTestTimeout
|
|
17
|
-
);
|
|
18
|
-
});
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import chatGPT from '../../lib/chatgpt/index.js';
|
|
2
|
-
import wrapVariable from '../../prompts/wrap-variable.js';
|
|
3
|
-
|
|
4
|
-
const buildPrompt = (description, exampleNames) => {
|
|
5
|
-
const descriptionBlock = wrapVariable(description, { tag: 'description' });
|
|
6
|
-
const exampleNamesBlock = wrapVariable(exampleNames.join('\n'), { tag: 'example-names' });
|
|
7
|
-
|
|
8
|
-
return `Generate a name similar to the <example-names> that fits the <description>. Return only the name, nothing else.
|
|
9
|
-
|
|
10
|
-
${descriptionBlock}
|
|
11
|
-
|
|
12
|
-
${exampleNamesBlock}`;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export default async function nameSimilarTo(description, exampleNames = [], config = {}) {
|
|
16
|
-
const { llm, ...options } = config;
|
|
17
|
-
const prompt = buildPrompt(description, exampleNames);
|
|
18
|
-
const output = await chatGPT(prompt, { modelOptions: { ...llm }, ...options });
|
|
19
|
-
return output.split('\n')[0].trim();
|
|
20
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import nameSimilarTo from './index.js';
|
|
3
|
-
|
|
4
|
-
vi.mock('../../lib/chatgpt/index.js', () => ({
|
|
5
|
-
default: vi.fn(async () => 'freshName'),
|
|
6
|
-
}));
|
|
7
|
-
|
|
8
|
-
describe('nameSimilarTo verblet', () => {
|
|
9
|
-
it('generates a name matching the example style', async () => {
|
|
10
|
-
const result = await nameSimilarTo('some data about sales', ['salesStats', 'revenueReport']);
|
|
11
|
-
expect(result).toBe('freshName');
|
|
12
|
-
});
|
|
13
|
-
});
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, beforeAll, afterAll } from 'vitest';
|
|
2
|
-
|
|
3
|
-
import number from './index.js';
|
|
4
|
-
import aiExpect from '../expect/index.js';
|
|
5
|
-
import { longTestTimeout } from '../../constants/common.js';
|
|
6
|
-
|
|
7
|
-
const examples = [
|
|
8
|
-
{
|
|
9
|
-
inputs: { text: 'What is the height of Everest in feet' },
|
|
10
|
-
want: { range: [29000, 29100] }, // Tolerant range around 29032
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
inputs: { text: 'What is the length of the Nile in km' },
|
|
14
|
-
want: { range: [6000, 7000] }, // Tolerant range around 6650
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
inputs: { text: 'What is the my age in years' },
|
|
18
|
-
want: { result: undefined },
|
|
19
|
-
},
|
|
20
|
-
];
|
|
21
|
-
|
|
22
|
-
describe('Number verblet', () => {
|
|
23
|
-
// Set environment mode to 'none' for all tests to avoid throwing
|
|
24
|
-
const originalMode = process.env.LLM_EXPECT_MODE;
|
|
25
|
-
|
|
26
|
-
beforeAll(() => {
|
|
27
|
-
process.env.LLM_EXPECT_MODE = 'none';
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
afterAll(() => {
|
|
31
|
-
if (originalMode !== undefined) {
|
|
32
|
-
process.env.LLM_EXPECT_MODE = originalMode;
|
|
33
|
-
} else {
|
|
34
|
-
delete process.env.LLM_EXPECT_MODE;
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
examples.forEach((example) => {
|
|
39
|
-
it(
|
|
40
|
-
`${example.inputs.text}`,
|
|
41
|
-
async () => {
|
|
42
|
-
const result = await number(example.inputs.text);
|
|
43
|
-
|
|
44
|
-
if (example.want.range) {
|
|
45
|
-
expect(result).toBeGreaterThanOrEqual(example.want.range[0]);
|
|
46
|
-
expect(result).toBeLessThanOrEqual(example.want.range[1]);
|
|
47
|
-
|
|
48
|
-
// LLM assertion for range validation
|
|
49
|
-
const isReasonableValue = await aiExpect(
|
|
50
|
-
`Question: "${example.inputs.text}" Answer: ${result}`
|
|
51
|
-
).toSatisfy('Is this a reasonable numeric answer for a geographic question?');
|
|
52
|
-
expect(isReasonableValue).toBe(true);
|
|
53
|
-
} else if (example.want.result !== undefined) {
|
|
54
|
-
expect(result).toStrictEqual(example.want.result);
|
|
55
|
-
} else {
|
|
56
|
-
expect(result).toStrictEqual(example.want.result);
|
|
57
|
-
|
|
58
|
-
// LLM assertion for undefined results
|
|
59
|
-
if (example.want.result === undefined) {
|
|
60
|
-
const shouldBeUndefined = await aiExpect(
|
|
61
|
-
`Question: "${example.inputs.text}"`
|
|
62
|
-
).toSatisfy('Does this question lack enough context to give a specific number?');
|
|
63
|
-
expect(shouldBeUndefined).toBe(true);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
longTestTimeout
|
|
68
|
-
);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it(
|
|
72
|
-
'should extract numbers from recipe contexts',
|
|
73
|
-
async () => {
|
|
74
|
-
const recipeText =
|
|
75
|
-
'What temperature should I bake the cookies at? They need to be baked for 12 minutes until golden brown';
|
|
76
|
-
const result = await number(recipeText);
|
|
77
|
-
|
|
78
|
-
expect(typeof result).toBe('number');
|
|
79
|
-
expect(result).toBeGreaterThan(0);
|
|
80
|
-
|
|
81
|
-
// LLM assertion to validate recipe number extraction
|
|
82
|
-
const isCorrectBakeTime = await aiExpect(
|
|
83
|
-
`Recipe: "${recipeText}" Extracted number: ${result}`
|
|
84
|
-
).toSatisfy('Is this number related to baking time or temperature?');
|
|
85
|
-
expect(isCorrectBakeTime).toBe(true);
|
|
86
|
-
|
|
87
|
-
// LLM assertion to validate temperature unit
|
|
88
|
-
const hasTemperatureUnit = await aiExpect(
|
|
89
|
-
`Recipe text: "${recipeText}" Extracted number: ${result}`
|
|
90
|
-
).toSatisfy('Is this number likely a temperature in Fahrenheit (e.g. 350°F)?');
|
|
91
|
-
expect(hasTemperatureUnit).toBe(true);
|
|
92
|
-
|
|
93
|
-
// Additional assertion about reasonableness
|
|
94
|
-
const isReasonableBakeTime = await aiExpect(
|
|
95
|
-
`Extracted number: ${result} from a baking recipe`
|
|
96
|
-
).toSatisfy('Is this a reasonable number for cooking?');
|
|
97
|
-
expect(isReasonableBakeTime).toBe(true);
|
|
98
|
-
},
|
|
99
|
-
longTestTimeout
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
it(
|
|
103
|
-
'should handle financial calculations',
|
|
104
|
-
async () => {
|
|
105
|
-
const financialQuery =
|
|
106
|
-
'If I invest $1000 at 5% annual compound interest for 10 years, how much will I have?';
|
|
107
|
-
const result = await number(financialQuery);
|
|
108
|
-
|
|
109
|
-
expect(typeof result).toBe('number');
|
|
110
|
-
expect(result).toBeGreaterThan(1000); // Should be more than principal
|
|
111
|
-
|
|
112
|
-
// LLM assertion for financial calculation accuracy
|
|
113
|
-
const isReasonableReturn = await aiExpect(
|
|
114
|
-
`Investment question about $1000 at 5% for 10 years. Answer: $${result}`
|
|
115
|
-
).toSatisfy('Is this a reasonable amount for a 10-year investment?');
|
|
116
|
-
expect(isReasonableReturn).toBe(true);
|
|
117
|
-
|
|
118
|
-
// Validate the calculation makes financial sense
|
|
119
|
-
const followsCompoundInterest = await aiExpect(
|
|
120
|
-
`Starting with $1000, ending with $${result} after 10 years`
|
|
121
|
-
).toSatisfy('Does this show reasonable investment growth?');
|
|
122
|
-
expect(followsCompoundInterest).toBe(true);
|
|
123
|
-
},
|
|
124
|
-
longTestTimeout
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
it(
|
|
128
|
-
'should handle financial calculations with compound interest',
|
|
129
|
-
async () => {
|
|
130
|
-
const result = await number(
|
|
131
|
-
'If I invest $1000 at 5% annual interest for 10 years, what will be the final amount?'
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
expect(typeof result).toBe('number');
|
|
135
|
-
// Simple interest would be 1000 + (1000 * 0.05 * 10) = 1500
|
|
136
|
-
expect(result).toBeGreaterThan(1500);
|
|
137
|
-
|
|
138
|
-
// LLM assertion for financial calculation accuracy
|
|
139
|
-
const isReasonableReturn = await aiExpect(
|
|
140
|
-
`Investment: $1000 at 5% for 10 years. Final amount: $${result}`
|
|
141
|
-
).toSatisfy(
|
|
142
|
-
'Is this a reasonable final amount for compound interest over 10 years? It should be significantly more than the principal due to compound growth.',
|
|
143
|
-
{
|
|
144
|
-
message: `Expected reasonable compound interest growth, but got: $${result}`,
|
|
145
|
-
}
|
|
146
|
-
);
|
|
147
|
-
expect(isReasonableReturn).toBe(true);
|
|
148
|
-
|
|
149
|
-
// LLM assertion for compound interest validation
|
|
150
|
-
const followsCompoundInterest = await aiExpect(
|
|
151
|
-
`Starting with $1000 at 5% annual interest for 10 years, the final amount is $${result}`
|
|
152
|
-
).toSatisfy(
|
|
153
|
-
'Does this final amount follow the expected pattern of compound interest growth? It should be more than simple interest (which would be $1500) and less than exponential growth.',
|
|
154
|
-
{
|
|
155
|
-
message: `Expected compound interest growth pattern, but got: $${result}`,
|
|
156
|
-
}
|
|
157
|
-
);
|
|
158
|
-
expect(followsCompoundInterest).toBe(true);
|
|
159
|
-
},
|
|
160
|
-
longTestTimeout
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
it(
|
|
164
|
-
'should handle financial calculations with compound interest',
|
|
165
|
-
async () => {
|
|
166
|
-
const result = await number(
|
|
167
|
-
'If I invest $1000 at 5% annual interest for 10 years, what will be the final amount?'
|
|
168
|
-
);
|
|
169
|
-
|
|
170
|
-
expect(typeof result).toBe('number');
|
|
171
|
-
// Simple interest would be 1000 + (1000 * 0.05 * 10) = 1500
|
|
172
|
-
// Compound interest should be more than simple interest
|
|
173
|
-
expect(result).toBeGreaterThan(1500);
|
|
174
|
-
|
|
175
|
-
// LLM assertion for financial calculation accuracy
|
|
176
|
-
const isReasonableReturn = await aiExpect(
|
|
177
|
-
`Investment: $1000 at 5% for 10 years. Final amount: $${result}`
|
|
178
|
-
).toSatisfy(
|
|
179
|
-
'Is this a reasonable final amount for compound interest over 10 years? It should be significantly more than the principal due to compound growth.',
|
|
180
|
-
{
|
|
181
|
-
message: `Expected reasonable compound interest growth, but got: $${result}`,
|
|
182
|
-
}
|
|
183
|
-
);
|
|
184
|
-
expect(isReasonableReturn).toBe(true);
|
|
185
|
-
|
|
186
|
-
// LLM assertion for compound interest validation
|
|
187
|
-
const followsCompoundInterest = await aiExpect(
|
|
188
|
-
`Starting with $1000 at 5% annual interest for 10 years, the final amount is $${result}`
|
|
189
|
-
).toSatisfy(
|
|
190
|
-
'Does this final amount follow the expected pattern of compound interest growth? It should be more than simple interest (which would be $1500) and less than exponential growth.',
|
|
191
|
-
{
|
|
192
|
-
message: `Expected compound interest growth pattern, but got: $${result}`,
|
|
193
|
-
}
|
|
194
|
-
);
|
|
195
|
-
expect(followsCompoundInterest).toBe(true);
|
|
196
|
-
},
|
|
197
|
-
longTestTimeout
|
|
198
|
-
);
|
|
199
|
-
});
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import chatGPT from '../../lib/chatgpt/index.js';
|
|
2
|
-
import stripResponse from '../../lib/strip-response/index.js';
|
|
3
|
-
import toNumber from '../../lib/to-number/index.js';
|
|
4
|
-
import { constants as promptConstants } from '../../prompts/index.js';
|
|
5
|
-
|
|
6
|
-
const {
|
|
7
|
-
asNumber,
|
|
8
|
-
asUndefinedByDefault,
|
|
9
|
-
contentIsQuestion,
|
|
10
|
-
explainAndSeparate,
|
|
11
|
-
explainAndSeparatePrimitive,
|
|
12
|
-
} = promptConstants;
|
|
13
|
-
|
|
14
|
-
export default async (text, config = {}) => {
|
|
15
|
-
const { llm, ...options } = config;
|
|
16
|
-
const numberText = `${contentIsQuestion} ${text}
|
|
17
|
-
|
|
18
|
-
${explainAndSeparate} ${explainAndSeparatePrimitive}
|
|
19
|
-
|
|
20
|
-
${asNumber} ${asUndefinedByDefault}`;
|
|
21
|
-
|
|
22
|
-
return toNumber(
|
|
23
|
-
stripResponse(await chatGPT(numberText, { modelOptions: { ...llm }, ...options }))
|
|
24
|
-
);
|
|
25
|
-
};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
|
|
3
|
-
import number from './index.js';
|
|
4
|
-
|
|
5
|
-
vi.mock('../../lib/chatgpt/index.js', () => ({
|
|
6
|
-
default: vi.fn().mockImplementation((text) => {
|
|
7
|
-
if (/Everest/.test(text)) {
|
|
8
|
-
return '29029';
|
|
9
|
-
}
|
|
10
|
-
return 'undefined';
|
|
11
|
-
}),
|
|
12
|
-
}));
|
|
13
|
-
|
|
14
|
-
const examples = [
|
|
15
|
-
{
|
|
16
|
-
name: 'Basic usage',
|
|
17
|
-
inputs: { text: 'What is the height of Everest in feet' },
|
|
18
|
-
want: { result: 29029 },
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
name: 'Unanswerable question',
|
|
22
|
-
inputs: { text: 'What is the my age in years' },
|
|
23
|
-
want: { result: undefined },
|
|
24
|
-
},
|
|
25
|
-
];
|
|
26
|
-
|
|
27
|
-
describe('Number verblet', () => {
|
|
28
|
-
examples.forEach((example) => {
|
|
29
|
-
it(example.name, async () => {
|
|
30
|
-
expect(await number(example.inputs.text)).toStrictEqual(example.want.result);
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
|
|
3
|
-
import numberWithUnits from './index.js';
|
|
4
|
-
import { longTestTimeout } from '../../constants/common.js';
|
|
5
|
-
|
|
6
|
-
const examples = [
|
|
7
|
-
{
|
|
8
|
-
inputs: { text: 'What is the height of Everest in feet' },
|
|
9
|
-
want: { valueRange: [29029, 29032], unit: 'feet' },
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
inputs: { text: 'What is my age in years' },
|
|
13
|
-
want: { value: undefined, unit: 'years' },
|
|
14
|
-
},
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
describe('Number with units verblet', () => {
|
|
18
|
-
examples.forEach((example) => {
|
|
19
|
-
it(
|
|
20
|
-
example.inputs.text,
|
|
21
|
-
async () => {
|
|
22
|
-
const result = await numberWithUnits(example.inputs.text);
|
|
23
|
-
|
|
24
|
-
if (example.want.value) {
|
|
25
|
-
expect(result?.value).toStrictEqual(example.want.value);
|
|
26
|
-
}
|
|
27
|
-
if (example.want.valueRange) {
|
|
28
|
-
expect(result?.value).toBeGreaterThanOrEqual(example.want.valueRange[0]);
|
|
29
|
-
expect(result?.value).toBeLessThanOrEqual(example.want.valueRange[1]);
|
|
30
|
-
}
|
|
31
|
-
if (example.want.unit) {
|
|
32
|
-
expect(result?.unit).toStrictEqual(example.want.unit);
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
longTestTimeout
|
|
36
|
-
);
|
|
37
|
-
});
|
|
38
|
-
});
|