@botpress/cli 0.9.6 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +8 -8
- package/dist/code-generation/integration-implementation.js +17 -17
- package/dist/code-generation/integration-implementation.js.map +2 -2
- package/dist/code-generation/integration-instance.js +18 -18
- package/dist/code-generation/integration-instance.js.map +2 -2
- package/dist/code-generation/integration-schemas/channels-module.js +6 -6
- package/dist/code-generation/integration-schemas/channels-module.js.map +2 -2
- package/dist/command-definitions.js +2 -1
- package/dist/command-definitions.js.map +2 -2
- package/dist/command-implementations/index.js +3 -1
- package/dist/command-implementations/index.js.map +2 -2
- package/dist/command-implementations/lint-command.js +59 -0
- package/dist/command-implementations/lint-command.js.map +7 -0
- package/dist/config.js +5 -1
- package/dist/config.js.map +2 -2
- package/dist/errors.js.map +2 -2
- package/dist/integration-ref.test.js +2 -3
- package/dist/integration-ref.test.js.map +2 -2
- package/dist/linter/integration-linter.js +73 -0
- package/dist/linter/integration-linter.js.map +7 -0
- package/dist/linter/integration-linter.test.js +180 -0
- package/dist/linter/integration-linter.test.js.map +7 -0
- package/dist/linter/rulesets/integration.ruleset.js +354 -0
- package/dist/linter/rulesets/integration.ruleset.js.map +7 -0
- package/dist/linter/rulesets/integration.ruleset.test.js +825 -0
- package/dist/linter/rulesets/integration.ruleset.test.js.map +7 -0
- package/dist/linter/spectral-functions.js +36 -0
- package/dist/linter/spectral-functions.js.map +7 -0
- package/dist/logger/base-logger.js.map +2 -2
- package/dist/logger/index.js.map +2 -2
- package/dist/utils/cache-utils.js.map +2 -2
- package/dist/utils/event-emitter.js +6 -6
- package/dist/utils/event-emitter.js.map +2 -2
- package/dist/utils/file-watcher.js +7 -7
- package/dist/utils/file-watcher.js.map +2 -2
- package/dist/utils/prompt-utils.js.map +2 -2
- package/dist/utils/tunnel-utils.js.map +2 -2
- package/e2e/index.ts +1 -1
- package/package.json +5 -2
- package/templates/echo-bot/package.json +1 -1
- package/templates/empty-integration/package.json +1 -1
- package/templates/hello-world/package.json +1 -1
- package/templates/webhook-message/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/linter/rulesets/integration.ruleset.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect, describe } from 'vitest'\nimport { INTEGRATION_RULESET } from './integration.ruleset'\nimport { Document, ISpectralDiagnostic, Spectral } from '@stoplight/spectral-core'\nimport { Json as JsonParser } from '@stoplight/spectral-parsers'\nimport { CreateIntegrationBody } from 'src/api/integration-body'\n\ntype RecursivePartial<T> = {\n [P in keyof T]?: T[P] extends (infer U)[]\n ? RecursivePartial<U>[]\n : T[P] extends object | undefined\n ? RecursivePartial<T[P]>\n : T[P]\n}\ntype PartialIntegration = RecursivePartial<CreateIntegrationBody>\n\nconst describeRule = (\n ruleName: keyof (typeof INTEGRATION_RULESET)['rules'],\n fn: (lint: (definition: PartialIntegration) => Promise<ISpectralDiagnostic[]>) => void\n) =>\n describe.concurrent(ruleName, () => {\n const spectral = new Spectral()\n spectral.setRuleset({ rules: { [ruleName]: INTEGRATION_RULESET.rules[ruleName] } })\n\n const lintFn = (definition: PartialIntegration) =>\n spectral.run(new Document(JSON.stringify(definition), JsonParser))\n\n fn(lintFn)\n })\n\nconst EMPTY_STRING = ''\nconst TRUTHY_STRING = 'truthy'\nconst ACTION_NAME = 'actionName'\nconst EVENT_NAME = 'eventName'\nconst CONFIG_NAME = 'configName'\nconst PARAM_NAME = 'paramName'\nconst TAG_NAME = 'tagName'\nconst CHANNEL_NAME = 'channelName'\nconst STATE_NAME = 'stateName'\nconst MESSAGE_TYPE = 'text'\nconst ZUI = 'x-zui'\nconst LEGACY_ZUI = 'ui'\n\ndescribeRule('integration-title-must-be-present', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = {} as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = { title: EMPTY_STRING } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['title'])\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = { title: TRUTHY_STRING } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('integration-description-must-be-present', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = {} as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = { description: EMPTY_STRING } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['description'])\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = { description: TRUTHY_STRING } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('integration-must-have-an-icon', (lint) => {\n test('missing icon should trigger', async () => {\n // arrange\n const definition = {} as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.message).toContain('icon')\n })\n\n test('empty icon should trigger', async () => {\n // arrange\n const definition = { icon: EMPTY_STRING } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['icon'])\n })\n\n test('valid icon should not trigger', async () => {\n // arrange\n const definition = { icon: TRUTHY_STRING } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('integration-must-have-a-readme-file', (lint) => {\n test('missing readme should trigger', async () => {\n // arrange\n const definition = {} as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.message).toContain('readme')\n })\n\n test('empty readme should trigger', async () => {\n // arrange\n const definition = { readme: EMPTY_STRING } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['readme'])\n })\n\n test('valid readme should not trigger', async () => {\n // arrange\n const definition = { readme: TRUTHY_STRING } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('actions-should-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = { actions: { [ACTION_NAME]: {} } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['actions', ACTION_NAME])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = { actions: { [ACTION_NAME]: { title: EMPTY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['actions', ACTION_NAME, 'title'])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = { actions: { [ACTION_NAME]: { title: TRUTHY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('actions-must-have-a-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = { actions: { [ACTION_NAME]: {} } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['actions', ACTION_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = { actions: { [ACTION_NAME]: { description: EMPTY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['actions', ACTION_NAME, 'description'])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = { actions: { [ACTION_NAME]: { description: TRUTHY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('action-inputparams-should-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = {\n actions: { [ACTION_NAME]: { input: { schema: { properties: { [PARAM_NAME]: { [ZUI]: {} } } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['actions', ACTION_NAME, 'input', 'schema', 'properties', PARAM_NAME, ZUI])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = {\n actions: {\n [ACTION_NAME]: { input: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: EMPTY_STRING } } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual([\n 'actions',\n ACTION_NAME,\n 'input',\n 'schema',\n 'properties',\n PARAM_NAME,\n ZUI,\n 'title',\n ])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = {\n actions: {\n [ACTION_NAME]: { input: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: TRUTHY_STRING } } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('action-inputparams-must-have-a-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = {\n actions: { [ACTION_NAME]: { input: { schema: { properties: { [PARAM_NAME]: {} } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['actions', ACTION_NAME, 'input', 'schema', 'properties', PARAM_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = {\n actions: {\n [ACTION_NAME]: { input: { schema: { properties: { [PARAM_NAME]: { description: EMPTY_STRING } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual([\n 'actions',\n ACTION_NAME,\n 'input',\n 'schema',\n 'properties',\n PARAM_NAME,\n 'description',\n ])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = {\n actions: {\n [ACTION_NAME]: { input: { schema: { properties: { [PARAM_NAME]: { description: TRUTHY_STRING } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('action-outputparams-should-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = {\n actions: { [ACTION_NAME]: { output: { schema: { properties: { [PARAM_NAME]: { [ZUI]: {} } } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['actions', ACTION_NAME, 'output', 'schema', 'properties', PARAM_NAME, ZUI])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = {\n actions: {\n [ACTION_NAME]: { output: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: EMPTY_STRING } } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual([\n 'actions',\n ACTION_NAME,\n 'output',\n 'schema',\n 'properties',\n PARAM_NAME,\n ZUI,\n 'title',\n ])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = {\n actions: {\n [ACTION_NAME]: { output: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: TRUTHY_STRING } } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('action-outputparams-must-have-a-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = {\n actions: { [ACTION_NAME]: { output: { schema: { properties: { [PARAM_NAME]: {} } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['actions', ACTION_NAME, 'output', 'schema', 'properties', PARAM_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = {\n actions: {\n [ACTION_NAME]: { output: { schema: { properties: { [PARAM_NAME]: { description: EMPTY_STRING } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual([\n 'actions',\n ACTION_NAME,\n 'output',\n 'schema',\n 'properties',\n PARAM_NAME,\n 'description',\n ])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = {\n actions: {\n [ACTION_NAME]: { output: { schema: { properties: { [PARAM_NAME]: { description: TRUTHY_STRING } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('event-outputparams-should-have-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = {\n events: { [EVENT_NAME]: { schema: { properties: { [PARAM_NAME]: { [ZUI]: {} } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['events', EVENT_NAME, 'schema', 'properties', PARAM_NAME, ZUI])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = {\n events: {\n [EVENT_NAME]: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: EMPTY_STRING } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['events', EVENT_NAME, 'schema', 'properties', PARAM_NAME, ZUI, 'title'])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = {\n events: {\n [EVENT_NAME]: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: TRUTHY_STRING } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('event-outputparams-must-have-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = {\n events: { [EVENT_NAME]: { schema: { properties: { [PARAM_NAME]: {} } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['events', EVENT_NAME, 'schema', 'properties', PARAM_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = {\n events: {\n [EVENT_NAME]: { schema: { properties: { [PARAM_NAME]: { description: EMPTY_STRING } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['events', EVENT_NAME, 'schema', 'properties', PARAM_NAME, 'description'])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = {\n events: {\n [EVENT_NAME]: { schema: { properties: { [PARAM_NAME]: { description: TRUTHY_STRING } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('events-must-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = { events: { [EVENT_NAME]: {} } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['events', EVENT_NAME])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = { events: { [EVENT_NAME]: { title: EMPTY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['events', EVENT_NAME, 'title'])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = { events: { [EVENT_NAME]: { title: TRUTHY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('events-must-have-a-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = { events: { [EVENT_NAME]: {} } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['events', EVENT_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = { events: { [EVENT_NAME]: { description: EMPTY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['events', EVENT_NAME, 'description'])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = { events: { [EVENT_NAME]: { description: TRUTHY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('configuration-fields-must-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = { configuration: { schema: { properties: { [PARAM_NAME]: { [ZUI]: {} } } } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['configuration', 'schema', 'properties', PARAM_NAME, ZUI])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = {\n configuration: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: EMPTY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['configuration', 'schema', 'properties', PARAM_NAME, ZUI, 'title'])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = {\n configuration: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: TRUTHY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('multiple-configurations-must-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = {\n configurations: { [CONFIG_NAME]: {} },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['configurations', CONFIG_NAME])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = {\n configurations: { [CONFIG_NAME]: { title: EMPTY_STRING } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['configurations', CONFIG_NAME, 'title'])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = {\n configurations: { [CONFIG_NAME]: { title: TRUTHY_STRING } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('multiple-configurations-must-have-a-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = {\n configurations: { [CONFIG_NAME]: {} },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['configurations', CONFIG_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = {\n configurations: { [CONFIG_NAME]: { description: EMPTY_STRING } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['configurations', CONFIG_NAME, 'description'])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = {\n configurations: { [CONFIG_NAME]: { description: TRUTHY_STRING } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('multipes-configurations-fields-must-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = {\n configurations: { [CONFIG_NAME]: { schema: { properties: { [PARAM_NAME]: { [ZUI]: {} } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['configurations', CONFIG_NAME, 'schema', 'properties', PARAM_NAME, ZUI])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = {\n configurations: {\n [CONFIG_NAME]: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: EMPTY_STRING } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['configurations', CONFIG_NAME, 'schema', 'properties', PARAM_NAME, ZUI, 'title'])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = {\n configurations: {\n [CONFIG_NAME]: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: TRUTHY_STRING } } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('multipes-configurations-fields-must-have-a-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = {\n configurations: { [CONFIG_NAME]: { schema: { properties: { [PARAM_NAME]: {} } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['configurations', CONFIG_NAME, 'schema', 'properties', PARAM_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = {\n configurations: {\n [CONFIG_NAME]: { schema: { properties: { [PARAM_NAME]: { description: EMPTY_STRING } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['configurations', CONFIG_NAME, 'schema', 'properties', PARAM_NAME, 'description'])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = {\n configurations: {\n [CONFIG_NAME]: { schema: { properties: { [PARAM_NAME]: { description: TRUTHY_STRING } } } },\n },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('user-tags-should-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = { user: { tags: { [TAG_NAME]: {} } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['user', 'tags', TAG_NAME])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = { user: { tags: { [TAG_NAME]: { title: EMPTY_STRING } } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['user', 'tags', TAG_NAME, 'title'])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = { user: { tags: { [TAG_NAME]: { title: TRUTHY_STRING } } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('user-tags-must-have-a-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = { user: { tags: { [TAG_NAME]: {} } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['user', 'tags', TAG_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = { user: { tags: { [TAG_NAME]: { description: EMPTY_STRING } } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['user', 'tags', TAG_NAME, 'description'])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = { user: { tags: { [TAG_NAME]: { description: TRUTHY_STRING } } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('channels-should-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = { channels: { [CHANNEL_NAME]: {} } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = { channels: { [CHANNEL_NAME]: { title: EMPTY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME, 'title'])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = { channels: { [CHANNEL_NAME]: { title: TRUTHY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('channels-must-have-a-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = { channels: { [CHANNEL_NAME]: {} } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = { channels: { [CHANNEL_NAME]: { description: EMPTY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME, 'description'])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = { channels: { [CHANNEL_NAME]: { description: TRUTHY_STRING } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('channels-conversation-tags-should-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = { channels: { [CHANNEL_NAME]: { conversation: { tags: { [TAG_NAME]: {} } } } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME, 'conversation', 'tags', TAG_NAME])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = {\n channels: { [CHANNEL_NAME]: { conversation: { tags: { [TAG_NAME]: { title: EMPTY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME, 'conversation', 'tags', TAG_NAME, 'title'])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = {\n channels: { [CHANNEL_NAME]: { conversation: { tags: { [TAG_NAME]: { title: TRUTHY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('channels-conversation-tags-must-have-a-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = { channels: { [CHANNEL_NAME]: { conversation: { tags: { [TAG_NAME]: {} } } } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME, 'conversation', 'tags', TAG_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = {\n channels: { [CHANNEL_NAME]: { conversation: { tags: { [TAG_NAME]: { description: EMPTY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME, 'conversation', 'tags', TAG_NAME, 'description'])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = {\n channels: { [CHANNEL_NAME]: { conversation: { tags: { [TAG_NAME]: { description: TRUTHY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('channels-message-tags-should-have-a-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = { channels: { [CHANNEL_NAME]: { message: { tags: { [TAG_NAME]: {} } } } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME, 'message', 'tags', TAG_NAME])\n expect(results[0]?.message).toContain('title')\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = {\n channels: { [CHANNEL_NAME]: { message: { tags: { [TAG_NAME]: { title: EMPTY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME, 'message', 'tags', TAG_NAME, 'title'])\n expect(results[0]?.message).toContain('title')\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = {\n channels: { [CHANNEL_NAME]: { message: { tags: { [TAG_NAME]: { title: TRUTHY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('channels-message-tags-must-have-a-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = { channels: { [CHANNEL_NAME]: { message: { tags: { [TAG_NAME]: {} } } } } } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME, 'message', 'tags', TAG_NAME])\n expect(results[0]?.message).toContain('description')\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = {\n channels: { [CHANNEL_NAME]: { message: { tags: { [TAG_NAME]: { description: EMPTY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['channels', CHANNEL_NAME, 'message', 'tags', TAG_NAME, 'description'])\n expect(results[0]?.message).toContain('description')\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = {\n channels: { [CHANNEL_NAME]: { message: { tags: { [TAG_NAME]: { description: TRUTHY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('legacy-zui-title-should-be-removed', (lint) => {\n test('legacy zui title should trigger', async () => {\n // arrange\n const definition = {\n actions: {\n [ACTION_NAME]: { input: { [LEGACY_ZUI]: { [PARAM_NAME]: { title: TRUTHY_STRING } }, schema: {} } },\n },\n configuration: {\n [LEGACY_ZUI]: { [PARAM_NAME]: { title: TRUTHY_STRING } },\n schema: {},\n },\n events: { [EVENT_NAME]: { [LEGACY_ZUI]: { [PARAM_NAME]: { title: TRUTHY_STRING } }, schema: {} } },\n channels: {\n [CHANNEL_NAME]: {\n messages: { [MESSAGE_TYPE]: { [LEGACY_ZUI]: { [PARAM_NAME]: { title: TRUTHY_STRING } }, schema: {} } },\n },\n },\n states: { [STATE_NAME]: { [LEGACY_ZUI]: { [PARAM_NAME]: { title: TRUTHY_STRING } }, schema: {} } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(5)\n expect(results[0]?.message).toContain('.title()')\n })\n})\n\ndescribeRule('legacy-zui-examples-should-be-removed', (lint) => {\n test('legacy zui examples should trigger', async () => {\n // arrange\n const definition = {\n actions: {\n [ACTION_NAME]: { input: { [LEGACY_ZUI]: { [PARAM_NAME]: { examples: [TRUTHY_STRING] } }, schema: {} } },\n },\n configuration: {\n [LEGACY_ZUI]: { [PARAM_NAME]: { examples: [TRUTHY_STRING] } },\n schema: {},\n },\n events: { [EVENT_NAME]: { [LEGACY_ZUI]: { [PARAM_NAME]: { examples: [TRUTHY_STRING] } }, schema: {} } },\n channels: {\n [CHANNEL_NAME]: {\n messages: { [MESSAGE_TYPE]: { [LEGACY_ZUI]: { [PARAM_NAME]: { examples: [TRUTHY_STRING] } }, schema: {} } },\n },\n },\n states: { [STATE_NAME]: { [LEGACY_ZUI]: { [PARAM_NAME]: { examples: [TRUTHY_STRING] } }, schema: {} } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(5)\n expect(results[0]?.message).toContain('examples')\n })\n})\n\ndescribeRule('state-fields-should-have-title', (lint) => {\n test('missing title should trigger', async () => {\n // arrange\n const definition = {\n states: { [STATE_NAME]: { schema: { properties: { [PARAM_NAME]: { [ZUI]: {} } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['states', STATE_NAME, 'schema', 'properties', PARAM_NAME, ZUI])\n })\n\n test('empty title should trigger', async () => {\n // arrange\n const definition = {\n states: { [STATE_NAME]: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: EMPTY_STRING } } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['states', STATE_NAME, 'schema', 'properties', PARAM_NAME, ZUI, 'title'])\n })\n\n test('valid title should not trigger', async () => {\n // arrange\n const definition = {\n states: { [STATE_NAME]: { schema: { properties: { [PARAM_NAME]: { [ZUI]: { title: TRUTHY_STRING } } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n\ndescribeRule('state-fields-must-have-description', (lint) => {\n test('missing description should trigger', async () => {\n // arrange\n const definition = {\n states: { [STATE_NAME]: { schema: { properties: { [PARAM_NAME]: {} } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['states', STATE_NAME, 'schema', 'properties', PARAM_NAME])\n })\n\n test('empty description should trigger', async () => {\n // arrange\n const definition = {\n states: { [STATE_NAME]: { schema: { properties: { [PARAM_NAME]: { description: EMPTY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(1)\n expect(results[0]?.path).toEqual(['states', STATE_NAME, 'schema', 'properties', PARAM_NAME, 'description'])\n })\n\n test('valid description should not trigger', async () => {\n // arrange\n const definition = {\n states: { [STATE_NAME]: { schema: { properties: { [PARAM_NAME]: { description: TRUTHY_STRING } } } } },\n } as const\n\n // act\n const results = await lint(definition)\n\n // assert\n expect(results).toHaveLength(0)\n })\n})\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["JsonParser"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var spectral_functions_exports = {};
|
|
20
|
+
__export(spectral_functions_exports, {
|
|
21
|
+
truthyWithMessage: () => truthyWithMessage
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(spectral_functions_exports);
|
|
24
|
+
const truthyWithMessage = (fn) => (input, _, context) => {
|
|
25
|
+
const messages = [];
|
|
26
|
+
if (!input) {
|
|
27
|
+
const message = fn({ path: context.path });
|
|
28
|
+
messages.push({ message });
|
|
29
|
+
}
|
|
30
|
+
return messages;
|
|
31
|
+
};
|
|
32
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
33
|
+
0 && (module.exports = {
|
|
34
|
+
truthyWithMessage
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=spectral-functions.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/linter/spectral-functions.ts"],
|
|
4
|
+
"sourcesContent": ["import { RulesetFunctionContext } from '@stoplight/spectral-core'\n\ntype MessageFn = ({ path }: { path: (string | number)[] }) => string\n\n/**\n * When the input is falsy, return a message that is generated by the provided function\n */\nexport const truthyWithMessage = (fn: MessageFn) => (input: string, _: unknown, context: RulesetFunctionContext) => {\n const messages = []\n\n if (!input) {\n const message = fn({ path: context.path })\n messages.push({ message })\n }\n\n return messages\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,MAAM,oBAAoB,CAAC,OAAkB,CAAC,OAAe,GAAY,YAAoC;AAClH,QAAM,WAAW,CAAC;AAElB,MAAI,CAAC,OAAO;AACV,UAAM,UAAU,GAAG,EAAE,MAAM,QAAQ,KAAK,CAAC;AACzC,aAAS,KAAK,EAAE,QAAQ,CAAC;AAAA,EAC3B;AAEA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/logger/base-logger.ts"],
|
|
4
|
-
"sourcesContent": ["import boxen from 'boxen'\nimport chalk from 'chalk'\nimport _ from 'lodash'\nimport util from 'util'\nimport * as utils from '../utils'\n\nexport type LoggerOptions = {\n verbose: boolean\n json?: boolean // prevents loggin anything else than json\n}\n\nconst STDOUT_CHUNK_SIZE = 100\nconst DEFAULT_OPTIONS: LoggerOptions = { verbose: false }\n\ntype ChalkColor = (str: string) => string\nconst NO_COLOR: ChalkColor = (str: string) => str\n\nconst PINK = [255, 100, 255] as const\nconst ORANGE = [255, 165, 0] as const\nconst PURPLE = [128, 0, 128] as const\n\nconst BG_COLORS: Record<Color, ChalkColor> = {\n blue: chalk.bgBlueBright,\n green: chalk.bgGreenBright,\n yellow: chalk.bgYellowBright,\n red: chalk.bgRedBright,\n white: chalk.bgWhite,\n pink: (str: string) => chalk.bgRgb(...PINK)(str),\n orange: (str: string) => chalk.bgRgb(...ORANGE)(str),\n purple: (str: string) => chalk.bgRgb(...PURPLE)(str),\n}\n\nconst FG_COLORS: Record<Color, ChalkColor> = {\n blue: chalk.blueBright,\n green: chalk.green,\n yellow: chalk.yellowBright,\n red: chalk.red,\n white: chalk.white,\n pink: (str: string) => chalk.rgb(...PINK)(str),\n orange: (str: string) => chalk.rgb(...ORANGE)(str),\n purple: (str: string) => chalk.rgb(...PURPLE)(str),\n}\n\ntype Symbol = '\u2713' | '\u26A0' | '\u00D7' | '\u25CF' | ' ' | '\u25CB'\ntype Color = 'blue' | 'green' | 'yellow' | 'red' | 'pink' | 'white' | 'orange' | 'purple'\ntype LogPrefix = { symbol: Symbol; fg?: Color; bg?: Color; indent?: number } | string\ntype SymbolRenderer<T extends Symbol> = { default: T; windows?: string; mac?: string }\n\ntype LogProps = {\n prefix: LogPrefix\n stderr?: boolean\n}\n\ntype PrintProps = {\n metadata: any\n prefix: string\n stderr?: boolean\n}\n\nconst checkmark: SymbolRenderer<'\u2713'> = {\n default: '\u2713',\n windows: '\u221A',\n mac: '\u2714',\n}\n\nconst cross: SymbolRenderer<'\u00D7'> = {\n default: '\u00D7',\n mac: '\u2716',\n}\n\nconst danger: SymbolRenderer<'\u26A0'> = { default: '\u26A0' }\nconst circle: SymbolRenderer<'\u25CB'> = { default: '\u25CB' }\nconst disc: SymbolRenderer<'\u25CF'> = { default: '\u25CF' }\nconst space: SymbolRenderer<' '> = { default: ' ' }\n\nconst renderers: Record<Symbol, SymbolRenderer<Symbol>> = {\n '\u2713': checkmark,\n '\u00D7': cross,\n '\u26A0': danger,\n '\u25CB': circle,\n '\u25CF': disc,\n ' ': space,\n}\n\nconst BOX_OPTIONS: boxen.Options = {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: 'yellow',\n}\n\nexport abstract class BaseLogger {\n protected opts: LoggerOptions\n\n constructor(opts: Partial<LoggerOptions> = {}) {\n this.opts = { ...DEFAULT_OPTIONS, ...opts }\n }\n\n public log(message: string, props: Partial<LogProps> = {}): void {\n if (this.opts.json && !props.stderr) {\n return\n }\n\n const prefix = this._resolvePrefix(props.prefix)\n this.print(message, { ...props, prefix })\n }\n\n public json(data: any, opts: Partial<{ depth: number }> = { depth: Infinity }): void {\n if (this.opts.json) {\n this.print(JSON.stringify(data, undefined, 2))\n return\n }\n\n const { depth } = opts\n const msg = util.inspect(data, { colors: true, depth })\n this.log(msg)\n }\n\n public debug(message: string): void {\n if (!this.opts.verbose) {\n return\n }\n this.log(chalk.grey(message), { prefix: { symbol: '\u25CF', fg: 'blue' } })\n }\n\n public started(message: string): void {\n this.log(message, { prefix: { symbol: '\u25CB', fg: 'purple' } })\n }\n\n public success(message: string): void {\n this.log(message, { prefix: { symbol: '\u2713', fg: 'green' } })\n }\n\n public warn(message: string): void {\n this.log(message, { prefix: { symbol: '\u26A0', fg: 'yellow' } })\n }\n\n public error(message: string): void {\n this.log(message, { prefix: { symbol: '\u00D7', fg: 'red' }, stderr: true })\n }\n\n public box(message: string): void {\n const box = boxen(message, BOX_OPTIONS)\n this.log(box)\n }\n\n protected abstract print(message: string, props?: Partial<PrintProps>): void\n\n private _resolvePrefix(prefix: LogPrefix | undefined): string | undefined {\n if (!prefix) {\n return\n }\n\n if (_.isString(prefix)) {\n return prefix\n }\n\n const { symbol, fg, bg, indent } = prefix\n const renderedSymbol = this._renderSymbol(symbol)\n const fgcolor = fg ? FG_COLORS[fg] : NO_COLOR\n const bgcolor = bg ? BG_COLORS[bg] : NO_COLOR\n const indentStr = indent ? ' '.repeat(indent) : ''\n const symbolStr = fgcolor(bgcolor(renderedSymbol))\n return `${indentStr}${symbolStr}`\n }\n\n private _renderSymbol(symbol: Symbol): string {\n const renderer = renderers[symbol]\n if (process.platform === 'win32') {\n return renderer.windows || renderer.default\n } else if (process.platform === 'darwin') {\n return renderer.mac || renderer.default\n } else {\n return renderer.default\n }\n }\n\n protected render(message: string, stream: NodeJS.WriteStream = process.stdout): void {\n // chunking the message ensures that the process won't exit before the message is fully written\n for (const chunk of utils.string.chunkString(message, STDOUT_CHUNK_SIZE)) {\n stream.write(chunk)\n }\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAClB,mBAAkB;AAClB,oBAAc;AACd,kBAAiB;AACjB,YAAuB;AAOvB,MAAM,oBAAoB;AAC1B,MAAM,kBAAiC,EAAE,SAAS,MAAM;AAGxD,MAAM,WAAuB,CAAC,QAAgB;AAE9C,MAAM,OAAO,CAAC,KAAK,KAAK,GAAG;AAC3B,MAAM,SAAS,CAAC,KAAK,KAAK,CAAC;AAC3B,MAAM,SAAS,CAAC,KAAK,GAAG,GAAG;AAE3B,MAAM,YAAuC;AAAA,EAC3C,MAAM,aAAAA,QAAM;AAAA,EACZ,OAAO,aAAAA,QAAM;AAAA,EACb,QAAQ,aAAAA,QAAM;AAAA,EACd,KAAK,aAAAA,QAAM;AAAA,EACX,OAAO,aAAAA,QAAM;AAAA,EACb,MAAM,CAAC,QAAgB,aAAAA,QAAM,MAAM,GAAG,IAAI,EAAE,GAAG;AAAA,EAC/C,QAAQ,CAAC,QAAgB,aAAAA,QAAM,MAAM,GAAG,MAAM,EAAE,GAAG;AAAA,EACnD,QAAQ,CAAC,QAAgB,aAAAA,QAAM,MAAM,GAAG,MAAM,EAAE,GAAG;AACrD;AAEA,MAAM,YAAuC;AAAA,EAC3C,MAAM,aAAAA,QAAM;AAAA,EACZ,OAAO,aAAAA,QAAM;AAAA,EACb,QAAQ,aAAAA,QAAM;AAAA,EACd,KAAK,aAAAA,QAAM;AAAA,EACX,OAAO,aAAAA,QAAM;AAAA,EACb,MAAM,CAAC,QAAgB,aAAAA,QAAM,IAAI,GAAG,IAAI,EAAE,GAAG;AAAA,EAC7C,QAAQ,CAAC,QAAgB,aAAAA,QAAM,IAAI,GAAG,MAAM,EAAE,GAAG;AAAA,EACjD,QAAQ,CAAC,QAAgB,aAAAA,QAAM,IAAI,GAAG,MAAM,EAAE,GAAG;AACnD;AAkBA,MAAM,YAAiC;AAAA,EACrC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,KAAK;AACP;AAEA,MAAM,QAA6B;AAAA,EACjC,SAAS;AAAA,EACT,KAAK;AACP;AAEA,MAAM,SAA8B,EAAE,SAAS,SAAI;AACnD,MAAM,SAA8B,EAAE,SAAS,SAAI;AACnD,MAAM,OAA4B,EAAE,SAAS,SAAI;AACjD,MAAM,QAA6B,EAAE,SAAS,IAAI;AAElD,MAAM,YAAoD;AAAA,EACxD,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,KAAK;AACP;AAEA,MAAM,cAA6B;AAAA,EACjC,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,aAAa;AACf;AAEO,MAAe,WAAW;AAAA,EACrB;AAAA,
|
|
4
|
+
"sourcesContent": ["import boxen from 'boxen'\nimport chalk from 'chalk'\nimport _ from 'lodash'\nimport util from 'util'\nimport * as utils from '../utils'\n\nexport type LoggerOptions = {\n verbose: boolean\n json?: boolean // prevents loggin anything else than json\n}\n\nconst STDOUT_CHUNK_SIZE = 100\nconst DEFAULT_OPTIONS: LoggerOptions = { verbose: false }\n\ntype ChalkColor = (str: string) => string\nconst NO_COLOR: ChalkColor = (str: string) => str\n\nconst PINK = [255, 100, 255] as const\nconst ORANGE = [255, 165, 0] as const\nconst PURPLE = [128, 0, 128] as const\n\nconst BG_COLORS: Record<Color, ChalkColor> = {\n blue: chalk.bgBlueBright,\n green: chalk.bgGreenBright,\n yellow: chalk.bgYellowBright,\n red: chalk.bgRedBright,\n white: chalk.bgWhite,\n pink: (str: string) => chalk.bgRgb(...PINK)(str),\n orange: (str: string) => chalk.bgRgb(...ORANGE)(str),\n purple: (str: string) => chalk.bgRgb(...PURPLE)(str),\n}\n\nconst FG_COLORS: Record<Color, ChalkColor> = {\n blue: chalk.blueBright,\n green: chalk.green,\n yellow: chalk.yellowBright,\n red: chalk.red,\n white: chalk.white,\n pink: (str: string) => chalk.rgb(...PINK)(str),\n orange: (str: string) => chalk.rgb(...ORANGE)(str),\n purple: (str: string) => chalk.rgb(...PURPLE)(str),\n}\n\ntype Symbol = '\u2713' | '\u26A0' | '\u00D7' | '\u25CF' | ' ' | '\u25CB'\ntype Color = 'blue' | 'green' | 'yellow' | 'red' | 'pink' | 'white' | 'orange' | 'purple'\ntype LogPrefix = { symbol: Symbol; fg?: Color; bg?: Color; indent?: number } | string\ntype SymbolRenderer<T extends Symbol> = { default: T; windows?: string; mac?: string }\n\ntype LogProps = {\n prefix: LogPrefix\n stderr?: boolean\n}\n\ntype PrintProps = {\n metadata: any\n prefix: string\n stderr?: boolean\n}\n\nconst checkmark: SymbolRenderer<'\u2713'> = {\n default: '\u2713',\n windows: '\u221A',\n mac: '\u2714',\n}\n\nconst cross: SymbolRenderer<'\u00D7'> = {\n default: '\u00D7',\n mac: '\u2716',\n}\n\nconst danger: SymbolRenderer<'\u26A0'> = { default: '\u26A0' }\nconst circle: SymbolRenderer<'\u25CB'> = { default: '\u25CB' }\nconst disc: SymbolRenderer<'\u25CF'> = { default: '\u25CF' }\nconst space: SymbolRenderer<' '> = { default: ' ' }\n\nconst renderers: Record<Symbol, SymbolRenderer<Symbol>> = {\n '\u2713': checkmark,\n '\u00D7': cross,\n '\u26A0': danger,\n '\u25CB': circle,\n '\u25CF': disc,\n ' ': space,\n}\n\nconst BOX_OPTIONS: boxen.Options = {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: 'yellow',\n}\n\nexport abstract class BaseLogger {\n protected opts: LoggerOptions\n\n public constructor(opts: Partial<LoggerOptions> = {}) {\n this.opts = { ...DEFAULT_OPTIONS, ...opts }\n }\n\n public log(message: string, props: Partial<LogProps> = {}): void {\n if (this.opts.json && !props.stderr) {\n return\n }\n\n const prefix = this._resolvePrefix(props.prefix)\n this.print(message, { ...props, prefix })\n }\n\n public json(data: any, opts: Partial<{ depth: number }> = { depth: Infinity }): void {\n if (this.opts.json) {\n this.print(JSON.stringify(data, undefined, 2))\n return\n }\n\n const { depth } = opts\n const msg = util.inspect(data, { colors: true, depth })\n this.log(msg)\n }\n\n public debug(message: string): void {\n if (!this.opts.verbose) {\n return\n }\n this.log(chalk.grey(message), { prefix: { symbol: '\u25CF', fg: 'blue' } })\n }\n\n public started(message: string): void {\n this.log(message, { prefix: { symbol: '\u25CB', fg: 'purple' } })\n }\n\n public success(message: string): void {\n this.log(message, { prefix: { symbol: '\u2713', fg: 'green' } })\n }\n\n public warn(message: string): void {\n this.log(message, { prefix: { symbol: '\u26A0', fg: 'yellow' } })\n }\n\n public error(message: string): void {\n this.log(message, { prefix: { symbol: '\u00D7', fg: 'red' }, stderr: true })\n }\n\n public box(message: string): void {\n const box = boxen(message, BOX_OPTIONS)\n this.log(box)\n }\n\n protected abstract print(message: string, props?: Partial<PrintProps>): void\n\n private _resolvePrefix(prefix: LogPrefix | undefined): string | undefined {\n if (!prefix) {\n return\n }\n\n if (_.isString(prefix)) {\n return prefix\n }\n\n const { symbol, fg, bg, indent } = prefix\n const renderedSymbol = this._renderSymbol(symbol)\n const fgcolor = fg ? FG_COLORS[fg] : NO_COLOR\n const bgcolor = bg ? BG_COLORS[bg] : NO_COLOR\n const indentStr = indent ? ' '.repeat(indent) : ''\n const symbolStr = fgcolor(bgcolor(renderedSymbol))\n return `${indentStr}${symbolStr}`\n }\n\n private _renderSymbol(symbol: Symbol): string {\n const renderer = renderers[symbol]\n if (process.platform === 'win32') {\n return renderer.windows || renderer.default\n } else if (process.platform === 'darwin') {\n return renderer.mac || renderer.default\n } else {\n return renderer.default\n }\n }\n\n protected render(message: string, stream: NodeJS.WriteStream = process.stdout): void {\n // chunking the message ensures that the process won't exit before the message is fully written\n for (const chunk of utils.string.chunkString(message, STDOUT_CHUNK_SIZE)) {\n stream.write(chunk)\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["chalk", "util", "boxen", "_"]
|
|
7
7
|
}
|
package/dist/logger/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/logger/index.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable no-console */\nimport { cursorTo, clearLine } from 'readline'\nimport { BaseLogger, LoggerOptions } from './base-logger'\n\nexport class Logger extends BaseLogger {\n private static _previousLine: SingleLineLogger | undefined // this is global to the whole process\n\n protected print(message: string, props: Partial<{ prefix: string; stderr?: boolean }> = {}): void {\n this.cleanup()\n const stream = props.stderr ? process.stderr : process.stdout\n const { prefix } = props\n if (prefix) {\n this.render(`${prefix} ${message}\\n`, stream)\n return\n }\n this.render(`${message}\\n`, stream)\n }\n\n public line(): SingleLineLogger {\n this.cleanup()\n const currentLine = new SingleLineLogger({ ...this.opts })\n Logger._previousLine = currentLine\n return currentLine\n }\n\n public cleanup(): void {\n if (Logger._previousLine) {\n Logger._previousLine.commit()\n Logger._previousLine = undefined\n }\n }\n}\n\nclass SingleLineLogger extends BaseLogger {\n private _commited = false\n\n constructor(opts: LoggerOptions) {\n super(opts)\n }\n\n public commit(): void {\n if (this._commited) {\n return\n }\n this._commited = true\n console.log()\n }\n\n protected print(message: string, props: Partial<{ prefix: string }> = {}): void {\n if (this._commited) {\n return\n }\n\n clearLine(process.stdout, 0)\n const { prefix } = props\n cursorTo(process.stdout, 0)\n if (prefix) {\n this.render(`${prefix} ${message}`)\n return\n }\n this.render(message)\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAAoC;AACpC,yBAA0C;AAEnC,MAAM,eAAe,8BAAW;AAAA,EACrC,OAAe;AAAA,EAEL,MAAM,SAAiB,QAAuD,CAAC,GAAS;AAChG,SAAK,QAAQ;AACb,UAAM,SAAS,MAAM,SAAS,QAAQ,SAAS,QAAQ;AACvD,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,QAAQ;AACV,WAAK,OAAO,GAAG,UAAU;AAAA,GAAa,MAAM;AAC5C;AAAA,IACF;AACA,SAAK,OAAO,GAAG;AAAA,GAAa,MAAM;AAAA,EACpC;AAAA,EAEO,OAAyB;AAC9B,SAAK,QAAQ;AACb,UAAM,cAAc,IAAI,iBAAiB,EAAE,GAAG,KAAK,KAAK,CAAC;AACzD,WAAO,gBAAgB;AACvB,WAAO;AAAA,EACT;AAAA,EAEO,UAAgB;AACrB,QAAI,OAAO,eAAe;AACxB,aAAO,cAAc,OAAO;AAC5B,aAAO,gBAAgB;AAAA,IACzB;AAAA,EACF;AACF;AAEA,MAAM,yBAAyB,8BAAW;AAAA,EAChC,YAAY;AAAA,
|
|
4
|
+
"sourcesContent": ["/* eslint-disable no-console */\nimport { cursorTo, clearLine } from 'readline'\nimport { BaseLogger, LoggerOptions } from './base-logger'\n\nexport class Logger extends BaseLogger {\n private static _previousLine: SingleLineLogger | undefined // this is global to the whole process\n\n protected print(message: string, props: Partial<{ prefix: string; stderr?: boolean }> = {}): void {\n this.cleanup()\n const stream = props.stderr ? process.stderr : process.stdout\n const { prefix } = props\n if (prefix) {\n this.render(`${prefix} ${message}\\n`, stream)\n return\n }\n this.render(`${message}\\n`, stream)\n }\n\n public line(): SingleLineLogger {\n this.cleanup()\n const currentLine = new SingleLineLogger({ ...this.opts })\n Logger._previousLine = currentLine\n return currentLine\n }\n\n public cleanup(): void {\n if (Logger._previousLine) {\n Logger._previousLine.commit()\n Logger._previousLine = undefined\n }\n }\n}\n\nclass SingleLineLogger extends BaseLogger {\n private _commited = false\n\n public constructor(opts: LoggerOptions) {\n super(opts)\n }\n\n public commit(): void {\n if (this._commited) {\n return\n }\n this._commited = true\n console.log()\n }\n\n protected print(message: string, props: Partial<{ prefix: string }> = {}): void {\n if (this._commited) {\n return\n }\n\n clearLine(process.stdout, 0)\n const { prefix } = props\n cursorTo(process.stdout, 0)\n if (prefix) {\n this.render(`${prefix} ${message}`)\n return\n }\n this.render(message)\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAAoC;AACpC,yBAA0C;AAEnC,MAAM,eAAe,8BAAW;AAAA,EACrC,OAAe;AAAA,EAEL,MAAM,SAAiB,QAAuD,CAAC,GAAS;AAChG,SAAK,QAAQ;AACb,UAAM,SAAS,MAAM,SAAS,QAAQ,SAAS,QAAQ;AACvD,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,QAAQ;AACV,WAAK,OAAO,GAAG,UAAU;AAAA,GAAa,MAAM;AAC5C;AAAA,IACF;AACA,SAAK,OAAO,GAAG;AAAA,GAAa,MAAM;AAAA,EACpC;AAAA,EAEO,OAAyB;AAC9B,SAAK,QAAQ;AACb,UAAM,cAAc,IAAI,iBAAiB,EAAE,GAAG,KAAK,KAAK,CAAC;AACzD,WAAO,gBAAgB;AACvB,WAAO;AAAA,EACT;AAAA,EAEO,UAAgB;AACrB,QAAI,OAAO,eAAe;AACxB,aAAO,cAAc,OAAO;AAC5B,aAAO,gBAAgB;AAAA,IACzB;AAAA,EACF;AACF;AAEA,MAAM,yBAAyB,8BAAW;AAAA,EAChC,YAAY;AAAA,EAEb,YAAY,MAAqB;AACtC,UAAM,IAAI;AAAA,EACZ;AAAA,EAEO,SAAe;AACpB,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AACA,SAAK,YAAY;AACjB,YAAQ,IAAI;AAAA,EACd;AAAA,EAEU,MAAM,SAAiB,QAAqC,CAAC,GAAS;AAC9E,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AAEA,mCAAU,QAAQ,QAAQ,CAAC;AAC3B,UAAM,EAAE,OAAO,IAAI;AACnB,kCAAS,QAAQ,QAAQ,CAAC;AAC1B,QAAI,QAAQ;AACV,WAAK,OAAO,GAAG,UAAU,SAAS;AAClC;AAAA,IACF;AACA,SAAK,OAAO,OAAO;AAAA,EACrB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/cache-utils.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from 'fs'\nimport pathlib from 'path'\n\nexport class FSKeyValueCache<T extends Object> {\n private _initialized = false\n\n constructor(private _filepath: string) {}\n\n public async init(): Promise<void> {\n if (this._initialized) {\n return\n }\n const dirname = pathlib.dirname(this._filepath)\n if (!fs.existsSync(dirname)) {\n await fs.promises.mkdir(dirname, { recursive: true })\n }\n if (!fs.existsSync(this._filepath)) {\n await this._writeJSON(this._filepath, {})\n }\n this._initialized = true\n }\n\n public async sync<K extends keyof T>(\n key: K,\n value: T[K] | undefined,\n prompt: (initial?: T[K]) => Promise<T[K]>\n ): Promise<T[K]> {\n await this.init()\n if (value) {\n await this.set(key, value)\n return value\n }\n const data = await this.get(key)\n const newValue = await prompt(data)\n await this.set(key, newValue)\n return newValue\n }\n\n public async has<K extends keyof T>(key: K): Promise<boolean> {\n await this.init()\n const data = await this._readJSON(this._filepath)\n return data[key] !== undefined\n }\n\n public async get<K extends keyof T>(key: K): Promise<T[K] | undefined> {\n await this.init()\n const data: T = await this._readJSON(this._filepath)\n return data[key]\n }\n\n public async set<K extends keyof T>(key: K, value: T[K]): Promise<void> {\n await this.init()\n const data: T = await this._readJSON(this._filepath)\n data[key] = value\n return this._writeJSON(this._filepath, data)\n }\n\n public async rm<K extends keyof T>(key: K): Promise<void> {\n await this.init()\n const data: T = await this._readJSON(this._filepath)\n delete data[key]\n return this._writeJSON(this._filepath, data)\n }\n\n public async clear(): Promise<void> {\n await this.init()\n return this._writeJSON(this._filepath, {})\n }\n\n private _writeJSON = (filepath: string, data: any) => {\n const fileContent = JSON.stringify(data, null, 2)\n return fs.promises.writeFile(filepath, fileContent)\n }\n\n private _readJSON = async (filepath: string) => {\n const fileContent = await fs.promises.readFile(filepath, 'utf8')\n return JSON.parse(fileContent)\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAe;AACf,kBAAoB;AAEb,MAAM,gBAAkC;AAAA,
|
|
4
|
+
"sourcesContent": ["import fs from 'fs'\nimport pathlib from 'path'\n\nexport class FSKeyValueCache<T extends Object> {\n private _initialized = false\n\n public constructor(private _filepath: string) {}\n\n public async init(): Promise<void> {\n if (this._initialized) {\n return\n }\n const dirname = pathlib.dirname(this._filepath)\n if (!fs.existsSync(dirname)) {\n await fs.promises.mkdir(dirname, { recursive: true })\n }\n if (!fs.existsSync(this._filepath)) {\n await this._writeJSON(this._filepath, {})\n }\n this._initialized = true\n }\n\n public async sync<K extends keyof T>(\n key: K,\n value: T[K] | undefined,\n prompt: (initial?: T[K]) => Promise<T[K]>\n ): Promise<T[K]> {\n await this.init()\n if (value) {\n await this.set(key, value)\n return value\n }\n const data = await this.get(key)\n const newValue = await prompt(data)\n await this.set(key, newValue)\n return newValue\n }\n\n public async has<K extends keyof T>(key: K): Promise<boolean> {\n await this.init()\n const data = await this._readJSON(this._filepath)\n return data[key] !== undefined\n }\n\n public async get<K extends keyof T>(key: K): Promise<T[K] | undefined> {\n await this.init()\n const data: T = await this._readJSON(this._filepath)\n return data[key]\n }\n\n public async set<K extends keyof T>(key: K, value: T[K]): Promise<void> {\n await this.init()\n const data: T = await this._readJSON(this._filepath)\n data[key] = value\n return this._writeJSON(this._filepath, data)\n }\n\n public async rm<K extends keyof T>(key: K): Promise<void> {\n await this.init()\n const data: T = await this._readJSON(this._filepath)\n delete data[key]\n return this._writeJSON(this._filepath, data)\n }\n\n public async clear(): Promise<void> {\n await this.init()\n return this._writeJSON(this._filepath, {})\n }\n\n private _writeJSON = (filepath: string, data: any) => {\n const fileContent = JSON.stringify(data, null, 2)\n return fs.promises.writeFile(filepath, fileContent)\n }\n\n private _readJSON = async (filepath: string) => {\n const fileContent = await fs.promises.readFile(filepath, 'utf8')\n return JSON.parse(fileContent)\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAe;AACf,kBAAoB;AAEb,MAAM,gBAAkC;AAAA,EAGtC,YAAoB,WAAmB;AAAnB;AAAA,EAAoB;AAAA,EAFvC,eAAe;AAAA,EAIvB,MAAa,OAAsB;AACjC,QAAI,KAAK,cAAc;AACrB;AAAA,IACF;AACA,UAAM,UAAU,YAAAA,QAAQ,QAAQ,KAAK,SAAS;AAC9C,QAAI,CAAC,UAAAC,QAAG,WAAW,OAAO,GAAG;AAC3B,YAAM,UAAAA,QAAG,SAAS,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IACtD;AACA,QAAI,CAAC,UAAAA,QAAG,WAAW,KAAK,SAAS,GAAG;AAClC,YAAM,KAAK,WAAW,KAAK,WAAW,CAAC,CAAC;AAAA,IAC1C;AACA,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAa,KACX,KACA,OACA,QACe;AACf,UAAM,KAAK,KAAK;AAChB,QAAI,OAAO;AACT,YAAM,KAAK,IAAI,KAAK,KAAK;AACzB,aAAO;AAAA,IACT;AACA,UAAM,OAAO,MAAM,KAAK,IAAI,GAAG;AAC/B,UAAM,WAAW,MAAM,OAAO,IAAI;AAClC,UAAM,KAAK,IAAI,KAAK,QAAQ;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,IAAuB,KAA0B;AAC5D,UAAM,KAAK,KAAK;AAChB,UAAM,OAAO,MAAM,KAAK,UAAU,KAAK,SAAS;AAChD,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,MAAa,IAAuB,KAAmC;AACrE,UAAM,KAAK,KAAK;AAChB,UAAM,OAAU,MAAM,KAAK,UAAU,KAAK,SAAS;AACnD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,IAAuB,KAAQ,OAA4B;AACtE,UAAM,KAAK,KAAK;AAChB,UAAM,OAAU,MAAM,KAAK,UAAU,KAAK,SAAS;AACnD,SAAK,OAAO;AACZ,WAAO,KAAK,WAAW,KAAK,WAAW,IAAI;AAAA,EAC7C;AAAA,EAEA,MAAa,GAAsB,KAAuB;AACxD,UAAM,KAAK,KAAK;AAChB,UAAM,OAAU,MAAM,KAAK,UAAU,KAAK,SAAS;AACnD,WAAO,KAAK;AACZ,WAAO,KAAK,WAAW,KAAK,WAAW,IAAI;AAAA,EAC7C;AAAA,EAEA,MAAa,QAAuB;AAClC,UAAM,KAAK,KAAK;AAChB,WAAO,KAAK,WAAW,KAAK,WAAW,CAAC,CAAC;AAAA,EAC3C;AAAA,EAEQ,aAAa,CAAC,UAAkB,SAAc;AACpD,UAAM,cAAc,KAAK,UAAU,MAAM,MAAM,CAAC;AAChD,WAAO,UAAAA,QAAG,SAAS,UAAU,UAAU,WAAW;AAAA,EACpD;AAAA,EAEQ,YAAY,OAAO,aAAqB;AAC9C,UAAM,cAAc,MAAM,UAAAA,QAAG,SAAS,SAAS,UAAU,MAAM;AAC/D,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B;AACF;",
|
|
6
6
|
"names": ["pathlib", "fs"]
|
|
7
7
|
}
|
|
@@ -22,9 +22,9 @@ __export(event_emitter_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(event_emitter_exports);
|
|
24
24
|
class EventEmitter {
|
|
25
|
-
|
|
25
|
+
_listeners = {};
|
|
26
26
|
emit(type, event) {
|
|
27
|
-
const listeners = this.
|
|
27
|
+
const listeners = this._listeners[type];
|
|
28
28
|
if (!listeners) {
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
@@ -40,13 +40,13 @@ class EventEmitter {
|
|
|
40
40
|
this.on(type, wrapped);
|
|
41
41
|
}
|
|
42
42
|
on(type, listener) {
|
|
43
|
-
if (!this.
|
|
44
|
-
this.
|
|
43
|
+
if (!this._listeners[type]) {
|
|
44
|
+
this._listeners[type] = [];
|
|
45
45
|
}
|
|
46
|
-
this.
|
|
46
|
+
this._listeners[type].push(listener);
|
|
47
47
|
}
|
|
48
48
|
off(type, listener) {
|
|
49
|
-
const listeners = this.
|
|
49
|
+
const listeners = this._listeners[type];
|
|
50
50
|
if (!listeners) {
|
|
51
51
|
return;
|
|
52
52
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/event-emitter.ts"],
|
|
4
|
-
"sourcesContent": ["export class EventEmitter<E extends object> {\n private
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,aAA+B;AAAA,EAClC,
|
|
4
|
+
"sourcesContent": ["export class EventEmitter<E extends object> {\n private _listeners: {\n [K in keyof E]?: ((event: E[K]) => void)[]\n } = {}\n\n public emit<K extends keyof E>(type: K, event: E[K]) {\n const listeners = this._listeners[type]\n if (!listeners) {\n return\n }\n for (const listener of listeners) {\n listener(event)\n }\n }\n\n public once<K extends keyof E>(type: K, listener: (event: E[K]) => void) {\n const wrapped = (event: E[K]) => {\n this.off(type, wrapped)\n listener(event)\n }\n this.on(type, wrapped)\n }\n\n public on<K extends keyof E>(type: K, listener: (event: E[K]) => void) {\n if (!this._listeners[type]) {\n this._listeners[type] = []\n }\n this._listeners[type]!.push(listener)\n }\n\n public off<K extends keyof E>(type: K, listener: (event: E[K]) => void) {\n const listeners = this._listeners[type]\n if (!listeners) {\n return\n }\n const index = listeners.indexOf(listener)\n if (index !== -1) {\n listeners.splice(index, 1)\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,aAA+B;AAAA,EAClC,aAEJ,CAAC;AAAA,EAEE,KAAwB,MAAS,OAAa;AACnD,UAAM,YAAY,KAAK,WAAW;AAClC,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AACA,eAAW,YAAY,WAAW;AAChC,eAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAAA,EAEO,KAAwB,MAAS,UAAiC;AACvE,UAAM,UAAU,CAAC,UAAgB;AAC/B,WAAK,IAAI,MAAM,OAAO;AACtB,eAAS,KAAK;AAAA,IAChB;AACA,SAAK,GAAG,MAAM,OAAO;AAAA,EACvB;AAAA,EAEO,GAAsB,MAAS,UAAiC;AACrE,QAAI,CAAC,KAAK,WAAW,OAAO;AAC1B,WAAK,WAAW,QAAQ,CAAC;AAAA,IAC3B;AACA,SAAK,WAAW,MAAO,KAAK,QAAQ;AAAA,EACtC;AAAA,EAEO,IAAuB,MAAS,UAAiC;AACtE,UAAM,YAAY,KAAK,WAAW;AAClC,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AACA,UAAM,QAAQ,UAAU,QAAQ,QAAQ;AACxC,QAAI,UAAU,IAAI;AAChB,gBAAU,OAAO,OAAO,CAAC;AAAA,IAC3B;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -30,9 +30,9 @@ module.exports = __toCommonJS(file_watcher_exports);
|
|
|
30
30
|
var import_watcher = __toESM(require("@parcel/watcher"));
|
|
31
31
|
var import_event_emitter = require("./event-emitter");
|
|
32
32
|
class FileWatcher {
|
|
33
|
-
constructor(
|
|
34
|
-
this.
|
|
35
|
-
this.
|
|
33
|
+
constructor(_subscription, _errorEmitter) {
|
|
34
|
+
this._subscription = _subscription;
|
|
35
|
+
this._errorEmitter = _errorEmitter;
|
|
36
36
|
}
|
|
37
37
|
static async watch(dir, fn, opt) {
|
|
38
38
|
const eventEmitter = new import_event_emitter.EventEmitter();
|
|
@@ -54,12 +54,12 @@ class FileWatcher {
|
|
|
54
54
|
return new FileWatcher(subscription, eventEmitter);
|
|
55
55
|
}
|
|
56
56
|
async close() {
|
|
57
|
-
await this.
|
|
58
|
-
this.
|
|
57
|
+
await this._subscription.unsubscribe();
|
|
58
|
+
this._errorEmitter.emit("close", {});
|
|
59
59
|
}
|
|
60
60
|
wait = () => new Promise((resolve, reject) => {
|
|
61
|
-
this.
|
|
62
|
-
this.
|
|
61
|
+
this._errorEmitter.once("error", reject);
|
|
62
|
+
this._errorEmitter.once("close", resolve);
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
65
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/file-watcher.ts"],
|
|
4
|
-
"sourcesContent": ["import watcher from '@parcel/watcher'\nimport { EventEmitter } from './event-emitter'\n\nexport type FileChangeHandler = (events: watcher.Event[]) => Promise<void>\n\ntype EmptyObject = Record<never, never>\ntype FileWatcherEvent = {\n error: unknown\n close: EmptyObject\n}\n\n/**\n * Wraps the Parcel file watcher to ensure errors can be catched in an async/await fashion\n */\nexport class FileWatcher {\n public static async watch(dir: string, fn: FileChangeHandler, opt?: watcher.Options) {\n const eventEmitter = new EventEmitter<FileWatcherEvent>()\n const subscription = await watcher.subscribe(\n dir,\n async (err: Error | null, events: watcher.Event[]) => {\n if (err) {\n eventEmitter.emit('error', err)\n return\n }\n\n try {\n await fn(events)\n } catch (thrown) {\n eventEmitter.emit('error', thrown)\n }\n },\n opt\n )\n return new FileWatcher(subscription, eventEmitter)\n }\n\n private constructor(\n private
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,2BAA6B;AAatB,MAAM,YAAY;AAAA,EAsBf,YACE,
|
|
4
|
+
"sourcesContent": ["import watcher from '@parcel/watcher'\nimport { EventEmitter } from './event-emitter'\n\nexport type FileChangeHandler = (events: watcher.Event[]) => Promise<void>\n\ntype EmptyObject = Record<never, never>\ntype FileWatcherEvent = {\n error: unknown\n close: EmptyObject\n}\n\n/**\n * Wraps the Parcel file watcher to ensure errors can be catched in an async/await fashion\n */\nexport class FileWatcher {\n public static async watch(dir: string, fn: FileChangeHandler, opt?: watcher.Options) {\n const eventEmitter = new EventEmitter<FileWatcherEvent>()\n const subscription = await watcher.subscribe(\n dir,\n async (err: Error | null, events: watcher.Event[]) => {\n if (err) {\n eventEmitter.emit('error', err)\n return\n }\n\n try {\n await fn(events)\n } catch (thrown) {\n eventEmitter.emit('error', thrown)\n }\n },\n opt\n )\n return new FileWatcher(subscription, eventEmitter)\n }\n\n private constructor(\n private _subscription: watcher.AsyncSubscription,\n private _errorEmitter: EventEmitter<FileWatcherEvent>\n ) {}\n\n public async close() {\n await this._subscription.unsubscribe()\n this._errorEmitter.emit('close', {})\n }\n\n public wait = () =>\n new Promise((resolve, reject) => {\n this._errorEmitter.once('error', reject)\n this._errorEmitter.once('close', resolve)\n })\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,2BAA6B;AAatB,MAAM,YAAY;AAAA,EAsBf,YACE,eACA,eACR;AAFQ;AACA;AAAA,EACP;AAAA,EAxBH,aAAoB,MAAM,KAAa,IAAuB,KAAuB;AACnF,UAAM,eAAe,IAAI,kCAA+B;AACxD,UAAM,eAAe,MAAM,eAAAA,QAAQ;AAAA,MACjC;AAAA,MACA,OAAO,KAAmB,WAA4B;AACpD,YAAI,KAAK;AACP,uBAAa,KAAK,SAAS,GAAG;AAC9B;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,GAAG,MAAM;AAAA,QACjB,SAAS,QAAP;AACA,uBAAa,KAAK,SAAS,MAAM;AAAA,QACnC;AAAA,MACF;AAAA,MACA;AAAA,IACF;AACA,WAAO,IAAI,YAAY,cAAc,YAAY;AAAA,EACnD;AAAA,EAOA,MAAa,QAAQ;AACnB,UAAM,KAAK,cAAc,YAAY;AACrC,SAAK,cAAc,KAAK,SAAS,CAAC,CAAC;AAAA,EACrC;AAAA,EAEO,OAAO,MACZ,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,SAAK,cAAc,KAAK,SAAS,MAAM;AACvC,SAAK,cAAc,KAAK,SAAS,OAAO;AAAA,EAC1C,CAAC;AACL;",
|
|
6
6
|
"names": ["watcher"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/prompt-utils.ts"],
|
|
4
|
-
"sourcesContent": ["import prompts from 'prompts'\nimport type { Logger } from '../logger'\n\nexport type CLIPromptsProps = {\n confirm: boolean\n}\n\nexport type CLIPromptsChoice<V extends string> = {\n title: string\n value: V\n}\n\ntype PasswordOptions = Partial<{\n default: string | undefined\n initial: string\n}>\ntype SelectOptions<V extends string> = Partial<{\n default: V | undefined\n initial: CLIPromptsChoice<V>\n choices: CLIPromptsChoice<V>[]\n}>\ntype TextOptions = Partial<{\n default: string | undefined\n initial: string\n}>\n\nexport class CLIPrompt {\n constructor(private _props: CLIPromptsProps, private _logger: Logger) {}\n\n public async confirm(message: string): Promise<boolean> {\n if (this._props.confirm) {\n this._logger.debug(`Confirming automatically (non-interactive mode): ${message}`)\n return true\n }\n\n const { confirm } = await this._prompts({\n type: 'confirm',\n name: 'confirm',\n message,\n initial: false,\n })\n\n if (!confirm) {\n return false\n }\n return true\n }\n\n public async password(message: string, opts: PasswordOptions = {}): Promise<string | undefined> {\n if (this._props.confirm) {\n this._logger.debug(`Return default (non-interactive mode): ${message}`)\n return opts?.default\n }\n\n const { prompted } = await this._prompts({\n type: 'password',\n name: 'prompted',\n message,\n initial: opts?.initial,\n })\n\n return prompted ? prompted : undefined\n }\n\n public async select<V extends string>(message: string, opts: SelectOptions<V> = {}): Promise<V | undefined> {\n if (this._props.confirm) {\n this._logger.debug(`Return default (non-interactive mode): ${message}`)\n return opts?.default\n }\n\n const { prompted } = await this._prompts({\n type: 'autocomplete',\n name: 'prompted',\n message,\n initial: opts?.initial?.value,\n choices: opts?.choices,\n })\n return prompted ? prompted : undefined\n }\n\n public async text(message: string, opts: TextOptions = {}): Promise<string | undefined> {\n if (this._props.confirm) {\n this._logger.debug(`Return default (non-interactive mode): ${message}`)\n return opts?.default\n }\n\n const { prompted } = await this._prompts({\n type: 'text',\n name: 'prompted',\n message,\n initial: opts?.initial,\n })\n\n return prompted ? prompted : undefined\n }\n\n private _prompts = (...args: Parameters<typeof prompts>): ReturnType<typeof prompts> => {\n this._logger.cleanup()\n return prompts(...args)\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AA0Bb,MAAM,UAAU;AAAA,
|
|
4
|
+
"sourcesContent": ["import prompts from 'prompts'\nimport type { Logger } from '../logger'\n\nexport type CLIPromptsProps = {\n confirm: boolean\n}\n\nexport type CLIPromptsChoice<V extends string> = {\n title: string\n value: V\n}\n\ntype PasswordOptions = Partial<{\n default: string | undefined\n initial: string\n}>\ntype SelectOptions<V extends string> = Partial<{\n default: V | undefined\n initial: CLIPromptsChoice<V>\n choices: CLIPromptsChoice<V>[]\n}>\ntype TextOptions = Partial<{\n default: string | undefined\n initial: string\n}>\n\nexport class CLIPrompt {\n public constructor(private _props: CLIPromptsProps, private _logger: Logger) {}\n\n public async confirm(message: string): Promise<boolean> {\n if (this._props.confirm) {\n this._logger.debug(`Confirming automatically (non-interactive mode): ${message}`)\n return true\n }\n\n const { confirm } = await this._prompts({\n type: 'confirm',\n name: 'confirm',\n message,\n initial: false,\n })\n\n if (!confirm) {\n return false\n }\n return true\n }\n\n public async password(message: string, opts: PasswordOptions = {}): Promise<string | undefined> {\n if (this._props.confirm) {\n this._logger.debug(`Return default (non-interactive mode): ${message}`)\n return opts?.default\n }\n\n const { prompted } = await this._prompts({\n type: 'password',\n name: 'prompted',\n message,\n initial: opts?.initial,\n })\n\n return prompted ? prompted : undefined\n }\n\n public async select<V extends string>(message: string, opts: SelectOptions<V> = {}): Promise<V | undefined> {\n if (this._props.confirm) {\n this._logger.debug(`Return default (non-interactive mode): ${message}`)\n return opts?.default\n }\n\n const { prompted } = await this._prompts({\n type: 'autocomplete',\n name: 'prompted',\n message,\n initial: opts?.initial?.value,\n choices: opts?.choices,\n })\n return prompted ? prompted : undefined\n }\n\n public async text(message: string, opts: TextOptions = {}): Promise<string | undefined> {\n if (this._props.confirm) {\n this._logger.debug(`Return default (non-interactive mode): ${message}`)\n return opts?.default\n }\n\n const { prompted } = await this._prompts({\n type: 'text',\n name: 'prompted',\n message,\n initial: opts?.initial,\n })\n\n return prompted ? prompted : undefined\n }\n\n private _prompts = (...args: Parameters<typeof prompts>): ReturnType<typeof prompts> => {\n this._logger.cleanup()\n return prompts(...args)\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AA0Bb,MAAM,UAAU;AAAA,EACd,YAAoB,QAAiC,SAAiB;AAAlD;AAAiC;AAAA,EAAkB;AAAA,EAE9E,MAAa,QAAQ,SAAmC;AACtD,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,oDAAoD,SAAS;AAChF,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,SAAS;AAAA,MACtC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,SAAS,SAAiB,OAAwB,CAAC,GAAgC;AAC9F,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,0CAA0C,SAAS;AACtE,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,SAAS;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,WAAO,WAAW,WAAW;AAAA,EAC/B;AAAA,EAEA,MAAa,OAAyB,SAAiB,OAAyB,CAAC,GAA2B;AAC1G,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,0CAA0C,SAAS;AACtE,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,SAAS;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM,SAAS;AAAA,MACxB,SAAS,MAAM;AAAA,IACjB,CAAC;AACD,WAAO,WAAW,WAAW;AAAA,EAC/B;AAAA,EAEA,MAAa,KAAK,SAAiB,OAAoB,CAAC,GAAgC;AACtF,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,0CAA0C,SAAS;AACtE,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,SAAS;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,WAAO,WAAW,WAAW;AAAA,EAC/B;AAAA,EAEQ,WAAW,IAAI,SAAiE;AACtF,SAAK,QAAQ,QAAQ;AACrB,eAAO,eAAAA,SAAQ,GAAG,IAAI;AAAA,EACxB;AACF;",
|
|
6
6
|
"names": ["prompts"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/tunnel-utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { TunnelTail, ClientCloseEvent, ClientErrorEvent } from '@bpinternal/tunnel'\nimport { Logger } from '../logger'\nimport { EventEmitter } from './event-emitter'\n\nexport type ReconnectionTriggerEvent =\n | {\n type: 'init'\n ev: null\n }\n | {\n type: 'error'\n ev: ClientErrorEvent\n }\n | {\n type: 'close'\n ev: ClientCloseEvent\n }\n\nexport type ReconnectedEvent = {\n tunnel: TunnelTail\n ev: ReconnectionTriggerEvent\n}\n\nexport class ReconnectionFailedError extends Error {\n public constructor(public readonly event: ReconnectionTriggerEvent) {\n const reason = ReconnectionFailedError._reason(event)\n super(`Reconnection failed: ${reason}`)\n }\n\n private static _reason(event: ReconnectionTriggerEvent): string {\n if (event.type === 'error') {\n return 'error'\n }\n\n if (event.type === 'close') {\n return `${event.ev.code} ${event.ev.reason}`\n }\n\n return 'init'\n }\n}\n\nexport class TunnelSupervisor {\n private _tunnel?: TunnelTail\n private _closed = false\n private _started = false\n\n public readonly events = new EventEmitter<{\n connectionFailed: ReconnectionTriggerEvent\n manuallyClosed: null\n connected: {\n tunnel: TunnelTail\n ev: ReconnectionTriggerEvent\n }\n }>()\n\n constructor(private _tunnelUrl: string, private _tunnelId: string, private _logger: Logger) {}\n\n public async start(): Promise<void> {\n if (this._closed) {\n throw new Error('Cannot start: Tunnel is closed')\n }\n if (this._started) {\n throw new Error('Cannot start: Tunnel is already started')\n }\n\n this._started = true\n const tunnel = await this._reconnect({ type: 'init', ev: null })\n this._tunnel = tunnel\n }\n\n public get closed(): boolean {\n return this._closed\n }\n\n /**\n * @returns Promise that rejects when a reconnection attempt fails and resolves when the tunnel is closed manually\n */\n public async wait(): Promise<void> {\n if (this._closed) {\n throw new Error('Cannot wait: Tunnel is closed')\n }\n\n return new Promise((resolve, reject) => {\n this.events.on('connectionFailed', (ev) => {\n reject(new ReconnectionFailedError(ev))\n })\n\n this.events.on('manuallyClosed', () => {\n resolve()\n })\n })\n }\n\n public close(): void {\n if (this._closed) {\n return\n }\n\n this._closed = true\n this._tunnel?.close()\n this.events.emit('manuallyClosed', null)\n }\n\n private _reconnectSync(ev: ReconnectionTriggerEvent): void {\n void this._reconnect(ev)\n .then((t) => {\n this._tunnel = t\n })\n .catch(() => this.events.emit('connectionFailed', ev))\n }\n\n private async _reconnect(ev: ReconnectionTriggerEvent): Promise<TunnelTail> {\n const newTunnel = async () => {\n const tunnel = await TunnelTail.new(this._tunnelUrl, this._tunnelId)\n this._registerListeners(tunnel)\n this.events.emit('connected', { tunnel, ev })\n return tunnel\n }\n\n if (ev.type === 'init') {\n // skip logging on the first connection attempt\n return newTunnel()\n }\n\n const line = this._logger.line()\n line.started('Reconnecting tunnel...')\n const tunnel = await newTunnel()\n line.success('Reconnected')\n line.commit()\n return tunnel\n }\n\n private _registerListeners(tunnel: TunnelTail) {\n tunnel.events.on('error', ({ target, type }) => {\n this._logger.error(`Tunnel error: ${type}`)\n this._reconnectSync({ type: 'error', ev: { target, type } })\n })\n tunnel.events.on('close', ({ code, reason, target, type, wasClean }) => {\n this._logger.error(`Tunnel closed: ${code} ${reason}`)\n this._reconnectSync({ type: 'close', ev: { code, reason, target, type, wasClean } })\n })\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+D;AAE/D,2BAA6B;AAqBtB,MAAM,gCAAgC,MAAM;AAAA,EAC1C,YAA4B,OAAiC;AAClE,UAAM,SAAS,wBAAwB,QAAQ,KAAK;AACpD,UAAM,wBAAwB,QAAQ;AAFL;AAAA,EAGnC;AAAA,EAEA,OAAe,QAAQ,OAAyC;AAC9D,QAAI,MAAM,SAAS,SAAS;AAC1B,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,aAAO,GAAG,MAAM,GAAG,QAAQ,MAAM,GAAG;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AACF;AAEO,MAAM,iBAAiB;AAAA,
|
|
4
|
+
"sourcesContent": ["import { TunnelTail, ClientCloseEvent, ClientErrorEvent } from '@bpinternal/tunnel'\nimport { Logger } from '../logger'\nimport { EventEmitter } from './event-emitter'\n\nexport type ReconnectionTriggerEvent =\n | {\n type: 'init'\n ev: null\n }\n | {\n type: 'error'\n ev: ClientErrorEvent\n }\n | {\n type: 'close'\n ev: ClientCloseEvent\n }\n\nexport type ReconnectedEvent = {\n tunnel: TunnelTail\n ev: ReconnectionTriggerEvent\n}\n\nexport class ReconnectionFailedError extends Error {\n public constructor(public readonly event: ReconnectionTriggerEvent) {\n const reason = ReconnectionFailedError._reason(event)\n super(`Reconnection failed: ${reason}`)\n }\n\n private static _reason(event: ReconnectionTriggerEvent): string {\n if (event.type === 'error') {\n return 'error'\n }\n\n if (event.type === 'close') {\n return `${event.ev.code} ${event.ev.reason}`\n }\n\n return 'init'\n }\n}\n\nexport class TunnelSupervisor {\n private _tunnel?: TunnelTail\n private _closed = false\n private _started = false\n\n public readonly events = new EventEmitter<{\n connectionFailed: ReconnectionTriggerEvent\n manuallyClosed: null\n connected: {\n tunnel: TunnelTail\n ev: ReconnectionTriggerEvent\n }\n }>()\n\n public constructor(private _tunnelUrl: string, private _tunnelId: string, private _logger: Logger) {}\n\n public async start(): Promise<void> {\n if (this._closed) {\n throw new Error('Cannot start: Tunnel is closed')\n }\n if (this._started) {\n throw new Error('Cannot start: Tunnel is already started')\n }\n\n this._started = true\n const tunnel = await this._reconnect({ type: 'init', ev: null })\n this._tunnel = tunnel\n }\n\n public get closed(): boolean {\n return this._closed\n }\n\n /**\n * @returns Promise that rejects when a reconnection attempt fails and resolves when the tunnel is closed manually\n */\n public async wait(): Promise<void> {\n if (this._closed) {\n throw new Error('Cannot wait: Tunnel is closed')\n }\n\n return new Promise((resolve, reject) => {\n this.events.on('connectionFailed', (ev) => {\n reject(new ReconnectionFailedError(ev))\n })\n\n this.events.on('manuallyClosed', () => {\n resolve()\n })\n })\n }\n\n public close(): void {\n if (this._closed) {\n return\n }\n\n this._closed = true\n this._tunnel?.close()\n this.events.emit('manuallyClosed', null)\n }\n\n private _reconnectSync(ev: ReconnectionTriggerEvent): void {\n void this._reconnect(ev)\n .then((t) => {\n this._tunnel = t\n })\n .catch(() => this.events.emit('connectionFailed', ev))\n }\n\n private async _reconnect(ev: ReconnectionTriggerEvent): Promise<TunnelTail> {\n const newTunnel = async () => {\n const tunnel = await TunnelTail.new(this._tunnelUrl, this._tunnelId)\n this._registerListeners(tunnel)\n this.events.emit('connected', { tunnel, ev })\n return tunnel\n }\n\n if (ev.type === 'init') {\n // skip logging on the first connection attempt\n return newTunnel()\n }\n\n const line = this._logger.line()\n line.started('Reconnecting tunnel...')\n const tunnel = await newTunnel()\n line.success('Reconnected')\n line.commit()\n return tunnel\n }\n\n private _registerListeners(tunnel: TunnelTail) {\n tunnel.events.on('error', ({ target, type }) => {\n this._logger.error(`Tunnel error: ${type}`)\n this._reconnectSync({ type: 'error', ev: { target, type } })\n })\n tunnel.events.on('close', ({ code, reason, target, type, wasClean }) => {\n this._logger.error(`Tunnel closed: ${code} ${reason}`)\n this._reconnectSync({ type: 'close', ev: { code, reason, target, type, wasClean } })\n })\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["tunnel"]
|
|
7
7
|
}
|
package/e2e/index.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@botpress/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Botpress CLI",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "pnpm run bundle && pnpm run template:gen",
|
|
@@ -21,11 +21,14 @@
|
|
|
21
21
|
"main": "dist/index.js",
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@botpress/client": "0.30.2",
|
|
24
|
-
"@botpress/sdk": "0.11.
|
|
24
|
+
"@botpress/sdk": "0.11.5",
|
|
25
25
|
"@bpinternal/const": "^0.0.20",
|
|
26
26
|
"@bpinternal/tunnel": "^0.1.1",
|
|
27
27
|
"@bpinternal/yargs-extra": "^0.0.3",
|
|
28
28
|
"@parcel/watcher": "^2.1.0",
|
|
29
|
+
"@stoplight/spectral-core": "^1.19.1",
|
|
30
|
+
"@stoplight/spectral-functions": "^1.9.0",
|
|
31
|
+
"@stoplight/spectral-parsers": "^1.0.4",
|
|
29
32
|
"@types/lodash": "^4.14.191",
|
|
30
33
|
"@types/node": "^18.11.17",
|
|
31
34
|
"@types/verror": "^1.10.6",
|