diff --git a/.github/dev.js b/.github/dev.js index 2d9595391e..43e49c3da4 100644 --- a/.github/dev.js +++ b/.github/dev.js @@ -40,6 +40,16 @@ if (DASH_DASH_ARGS.includes('ghost')) { commands = [COMMAND_GHOST, COMMAND_ADMIN]; } +if (DASH_DASH_ARGS.includes('revisions') || DASH_DASH_ARGS.includes('all')) { + commands.push({ + name: 'post-revisions', + command: 'yarn dev', + cwd: path.resolve(__dirname, '../ghost/post-revisions'), + prefixColor: 'green', + env: {} + }); +} + if (DASH_DASH_ARGS.includes('portal') || DASH_DASH_ARGS.includes('all')) { commands.push({ name: 'portal', diff --git a/.gitignore b/.gitignore index c82c66ed44..ca1075a8ad 100644 --- a/.gitignore +++ b/.gitignore @@ -135,3 +135,6 @@ Caddyfile # Announcement-Bar /ghost/announcement-bar/umd /ghost/announcement-bar/build + +/ghost/post-revisions/build +/ghost/post-revisions/tsconfig.tsbuildinfo diff --git a/ghost/core/core/server/models/post.js b/ghost/core/core/server/models/post.js index 93902ef0b3..1e70c0cbc9 100644 --- a/ghost/core/core/server/models/post.js +++ b/ghost/core/core/server/models/post.js @@ -19,7 +19,7 @@ const urlUtils = require('../../shared/url-utils'); const {Tag} = require('./tag'); const {Newsletter} = require('./newsletter'); const {BadRequestError} = require('@tryghost/errors'); -const PostRevisions = require('@tryghost/post-revisions'); +const {PostRevisions} = require('@tryghost/post-revisions'); const labs = require('../../shared/labs'); const messages = { diff --git a/ghost/core/core/server/services/users.js b/ghost/core/core/server/services/users.js index 0b144358cf..7fa5a2e907 100644 --- a/ghost/core/core/server/services/users.js +++ b/ghost/core/core/server/services/users.js @@ -4,7 +4,7 @@ const path = require('path'); /** * @TODO: pass these in as dependencies */ -const PostRevisions = require('@tryghost/post-revisions'); +const {PostRevisions} = require('@tryghost/post-revisions'); const labs = require('../../shared/labs'); /** diff --git a/ghost/post-revisions/.eslintrc.js b/ghost/post-revisions/.eslintrc.js index c9c1bcb522..ecc28524e8 100644 --- a/ghost/post-revisions/.eslintrc.js +++ b/ghost/post-revisions/.eslintrc.js @@ -1,4 +1,5 @@ module.exports = { + parser: '@typescript-eslint/parser', plugins: ['ghost'], extends: [ 'plugin:ghost/node' diff --git a/ghost/post-revisions/index.js b/ghost/post-revisions/index.js deleted file mode 100644 index 9f813a0b62..0000000000 --- a/ghost/post-revisions/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/post-revisions'); diff --git a/ghost/post-revisions/package.json b/ghost/post-revisions/package.json index 0906d9d763..0238a25d08 100644 --- a/ghost/post-revisions/package.json +++ b/ghost/post-revisions/package.json @@ -4,23 +4,28 @@ "repository": "https://github.com/TryGhost/Ghost/tree/main/packages/post-revisions", "author": "Ghost Foundation", "private": true, - "main": "index.js", + "main": "build/index.js", + "types": "build/index.d.ts", "scripts": { - "dev": "echo \"Implement me!\"", - "test:unit": "NODE_ENV=testing c8 --all --check-coverage --100 --reporter text --reporter cobertura mocha './test/**/*.test.js'", - "test": "yarn test:unit", - "lint:code": "eslint *.js lib/ --ext .js --cache", + "dev": "tsc --watch --preserveWatchOutput --sourceMap", + "build": "tsc", + "prepare": "tsc", + "test:types": "tsc --noEmit", + "test:unit": "NODE_ENV=testing c8 --src src --all --check-coverage --100 --reporter text --reporter cobertura mocha -r ts-node/register './test/**/*.test.ts'", + "test": "yarn test:unit && yarn test:types", + "lint:code": "eslint src/ --ext .ts --cache", "lint": "yarn lint:code && yarn lint:test", - "lint:test": "eslint -c test/.eslintrc.js test/ --ext .js --cache" + "lint:test": "eslint -c test/.eslintrc.js test/ --ext .ts --cache" }, "files": [ - "index.js", - "lib" + "build" ], "devDependencies": { "c8": "7.13.0", "mocha": "10.2.0", - "sinon": "15.0.3" + "sinon": "15.0.3", + "ts-node": "10.9.1", + "typescript": "5.0.4" }, "dependencies": {} } diff --git a/ghost/post-revisions/lib/post-revisions.js b/ghost/post-revisions/src/PostRevisions.ts similarity index 66% rename from ghost/post-revisions/lib/post-revisions.js rename to ghost/post-revisions/src/PostRevisions.ts index 011211e368..28c41310bf 100644 --- a/ghost/post-revisions/lib/post-revisions.js +++ b/ghost/post-revisions/src/PostRevisions.ts @@ -1,52 +1,54 @@ -/** - * @typedef {object} PostLike - * @property {string} id - * @property {string} lexical - * @property {string} html - * @property {string} author_id - * @property {string} feature_image - * @property {string} feature_image_alt - * @property {string} feature_image_caption - * @property {string} title - * @property {string} reason - * @property {string} post_status - */ +type PostLike = { + id: string; + lexical: string; + html: string; + author_id: string; + feature_image: string | null; + feature_image_alt: string | null; + feature_image_caption: string | null; + title: string; + reason: string; + post_status: string; +} -/** - * @typedef {object} Revision - * @property {string} post_id - * @property {string} lexical - * @property {number} created_at_ts - * @property {string} author_id - * @property {string} feature_image - * @property {string} feature_image_alt - * @property {string} feature_image_caption - * @property {string} title - * @property {string} reason - * @property {string} post_status - */ +type Revision = { + post_id: string; + lexical: string; + author_id: string; + feature_image: string | null; + feature_image_alt: string | null; + feature_image_caption: string | null; + title: string; + post_status: string; + reason: string; + created_at_ts: number; +} -class PostRevisions { - /** - * @param {object} deps - * @param {object} deps.config - * @param {number} deps.config.max_revisions - * @param {number} deps.config.revision_interval_ms - * @param {object} deps.model - */ - constructor(deps) { +type PostRevisionsDeps = { + config: { + max_revisions: number; + revision_interval_ms: number; + }, + model: any +} + +type RevisionResult = { + value: true; + reason: string; +} | { + value: false +} + +export class PostRevisions { + config: PostRevisionsDeps['config']; + model: any; + + constructor(deps: PostRevisionsDeps) { this.config = deps.config; this.model = deps.model; } - /** - * @param {PostLike} previous - * @param {PostLike} current - * @param {Revision[]} revisions - * @param {object} options - * @returns {object} - */ - shouldGenerateRevision(current, revisions, options) { + shouldGenerateRevision(current: PostLike, revisions: Revision[], options?: { isPublished?: boolean; forceRevision?: boolean; newStatus?: string; olderStatus?: string; }): RevisionResult { const latestRevision = revisions[revisions.length - 1]; // If there's no revisions for this post, we should always save a revision if (revisions.length === 0) { @@ -81,14 +83,7 @@ class PostRevisions { return {value: false}; } - /** - * @param {PostLike} previous - * @param {PostLike} current - * @param {Revision[]} revisions - * @param {object} options - * @returns {Promise} - */ - async getRevisions(current, revisions, options) { + async getRevisions(current: PostLike, revisions: Revision[], options?: { isPublished?: boolean; forceRevision?: boolean; newStatus?: string; olderStatus?: string; }): Promise { const shouldGenerateRevision = this.shouldGenerateRevision(current, revisions, options); if (!shouldGenerateRevision.value) { return revisions; @@ -112,11 +107,7 @@ class PostRevisions { } } - /** - * @param {PostLike} input - * @returns {Revision} - */ - convertPostLikeToRevision(input, offset = 0) { + convertPostLikeToRevision(input: PostLike, offset = 0): Revision { return { post_id: input.id, lexical: input.lexical, @@ -126,16 +117,12 @@ class PostRevisions { feature_image_alt: input.feature_image_alt, feature_image_caption: input.feature_image_caption, title: input.title, + reason: input.reason, post_status: input.post_status }; } - /** - * @param {string} authorId - * @param {object} options - * @param {object} options.transacting - */ - async removeAuthorFromRevisions(authorId, options) { + async removeAuthorFromRevisions(authorId: string, options: any): Promise { const revisions = await this.model.findAll({ filter: `author_id:${authorId}`, columns: ['id'], @@ -143,7 +130,7 @@ class PostRevisions { }); const revisionIds = revisions.toJSON() - .map(({id}) => id); + .map(({id}: {id: string}) => id); if (revisionIds.length === 0) { return; @@ -159,5 +146,3 @@ class PostRevisions { }); } } - -module.exports = PostRevisions; diff --git a/ghost/post-revisions/src/index.ts b/ghost/post-revisions/src/index.ts new file mode 100644 index 0000000000..d57c99a2ee --- /dev/null +++ b/ghost/post-revisions/src/index.ts @@ -0,0 +1 @@ +export * from './PostRevisions'; diff --git a/ghost/post-revisions/test/.eslintrc.js b/ghost/post-revisions/test/.eslintrc.js index 829b601eb0..6fe6dc1504 100644 --- a/ghost/post-revisions/test/.eslintrc.js +++ b/ghost/post-revisions/test/.eslintrc.js @@ -1,4 +1,5 @@ module.exports = { + parser: '@typescript-eslint/parser', plugins: ['ghost'], extends: [ 'plugin:ghost/test' diff --git a/ghost/post-revisions/test/hello.test.js b/ghost/post-revisions/test/PostRevisions.test.ts similarity index 68% rename from ghost/post-revisions/test/hello.test.js rename to ghost/post-revisions/test/PostRevisions.test.ts index 9df3b27ccf..b02d754dfc 100644 --- a/ghost/post-revisions/test/hello.test.js +++ b/ghost/post-revisions/test/PostRevisions.test.ts @@ -1,106 +1,139 @@ -const assert = require('assert'); -const sinon = require('sinon'); -const PostRevisions = require('..'); +import assert from 'assert'; +import sinon from 'sinon'; +import {PostRevisions} from '../src'; const config = { max_revisions: 10, revision_interval_ms: 1000 }; +function makePostLike(data: any = {}) { + return Object.assign({ + id: 'fakeid', + lexical: 'blah', + html: 'blah', + author_id: 'fakeauthorid', + feature_image: data.feature_image || null, + feature_image_alt: data.feature_image_alt || null, + feature_image_caption: data.feature_image_caption || null, + title: 'Title', + reason: 'reason', + post_status: 'published' + }, data); +} + +function makeRevision(data: any = {}) { + return Object.assign({ + post_id: 'fakeid', + created_at_ts: Date.now(), + lexical: 'blah', + html: 'blah', + author_id: 'fakeauthorid', + feature_image: data.feature_image || null, + feature_image_alt: data.feature_image_alt || null, + feature_image_caption: data.feature_image_caption || null, + title: 'Title', + reason: 'reason', + post_status: 'published' + }, data); +} + describe('PostRevisions', function () { describe('shouldGenerateRevision', function () { it('should return true if there are no revisions', function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); const expected = {value: true, reason: 'initial_revision'}; - const actual = postRevisions.shouldGenerateRevision({}, []); + const actual = postRevisions.shouldGenerateRevision(makePostLike(), []); assert.deepEqual(actual, expected); }); it('should return false if the current and previous html values are the same', function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); const expected = {value: false}; - const actual = postRevisions.shouldGenerateRevision({ + const actual = postRevisions.shouldGenerateRevision(makePostLike({ lexical: 'current', html: 'blah' - }, [{ + }), [makeRevision({ lexical: 'blah' - }]); + })]); assert.deepEqual(actual, expected); }); it('should return true if forceRevision is true and the lexical has changed since the latest revision', function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); const expected = {value: true, reason: 'explicit_save'}; - const actual = postRevisions.shouldGenerateRevision({ - lexical: 'blah', - html: 'blah2' - }, [{ + const actual = postRevisions.shouldGenerateRevision(makePostLike({ lexical: 'blah' - }, { + }), [{ lexical: 'blah2' - }], { - forceRevision: true + }, { + lexical: 'blah3' + }].map(makeRevision), { + forceRevision: true, + isPublished: false }); assert.deepEqual(actual, expected); }); it('should return true if the current and previous title values are different and forceRevision is true', function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); const expected = {value: true, reason: 'explicit_save'}; - const actual = postRevisions.shouldGenerateRevision({ + const actual = postRevisions.shouldGenerateRevision(makePostLike({ lexical: 'blah', html: 'blah', title: 'blah2' - }, [{ + }), [{ lexical: 'blah', title: 'not blah' - }], { - forceRevision: true + }].map(makeRevision), { + forceRevision: true, + isPublished: false }); assert.deepEqual(actual, expected); }); it('should return true if the current and previous feature_image values are different and forceRevision is true', function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); const expected = {value: true, reason: 'explicit_save'}; - const actual = postRevisions.shouldGenerateRevision({ + const actual = postRevisions.shouldGenerateRevision(makePostLike({ lexical: 'blah', html: 'blah', title: 'blah', feature_image: 'new' - }, [{ + }), [{ lexical: 'blah', html: 'blah', title: 'blah', feature_image: null - }], { - forceRevision: true + }].map(makeRevision), { + forceRevision: true, + isPublished: false }); assert.deepEqual(actual, expected); }); it('should return true if post is unpublished and forceRevision is true', function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); const expected = {value: true, reason: 'unpublished'}; - const actual = postRevisions.shouldGenerateRevision({ + const actual = postRevisions.shouldGenerateRevision(makePostLike({ lexical: 'blah', html: 'blah', title: 'blah2' - }, [{ + }), [makeRevision({ lexical: 'blah' - }], { + })], { isPublished: false, forceRevision: true, newStatus: 'draft', @@ -111,16 +144,17 @@ describe('PostRevisions', function () { }); it('should always return true if isPublished is true', function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); const expected = {value: true, reason: 'published'}; - const actual = postRevisions.shouldGenerateRevision({ + const actual = postRevisions.shouldGenerateRevision(makePostLike({ lexical: 'blah', html: 'blah', title: 'blah2' - }, [{ + }), [{ lexical: 'blah' - }], { + }].map(makeRevision), { + forceRevision: false, isPublished: true }); @@ -128,17 +162,17 @@ describe('PostRevisions', function () { }); it('should return true if the latest revision was more than the interval', function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); const expected = {value: true, reason: 'background_save'}; - const actual = postRevisions.shouldGenerateRevision({ + const actual = postRevisions.shouldGenerateRevision(makePostLike({ lexical: 'blah', html: 'blah', title: 'blah' - }, [{ - lexical: 'blah', + }), [{ + lexical: 'blah2', created_at_ts: Date.now() - 2000 - }], {}); + }].map(makeRevision), {}); assert.deepEqual(actual, expected); }); @@ -146,44 +180,46 @@ describe('PostRevisions', function () { describe('getRevisions', function () { it('returns the original revisions if there is no previous', async function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); const expected = [{ lexical: 'blah' - }]; - const actual = await postRevisions.getRevisions({}, [{ + }].map(makeRevision); + + const actual = await postRevisions.getRevisions(makePostLike({}), [{ lexical: 'blah' - }]); + }].map(makeRevision)); assert.deepEqual(actual, expected); }); it('returns the original revisions if the current and previous', async function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); const expected = [{ lexical: 'revision' - }]; - const actual = await postRevisions.getRevisions({ + }].map(makeRevision); + + const actual = await postRevisions.getRevisions(makePostLike({ lexical: 'blah', html: 'blah' - }, [{ + }), [{ lexical: 'revision' - }]); + }].map(makeRevision)); assert.deepEqual(actual, expected); }); it('returns one revision when there are no existing revisions', async function () { - const postRevisions = new PostRevisions({config}); + const postRevisions = new PostRevisions({config, model: {}}); - const actual = await postRevisions.getRevisions({ + const actual = await postRevisions.getRevisions(makePostLike({ id: '1', lexical: 'current', html: 'current', author_id: '123', title: 'foo bar baz' - }, []); + }), []); assert.equal(actual.length, 1); assert.equal(actual[0].lexical, 'current'); @@ -194,21 +230,23 @@ describe('PostRevisions', function () { it('does not limit the number of revisions if under the max_revisions count', async function () { const postRevisions = new PostRevisions({ config: { - max_revisions: 2 - } + max_revisions: 2, + revision_interval_ms: config.revision_interval_ms + }, + model: {} }); - const revisions = await postRevisions.getRevisions({ + const revisions = await postRevisions.getRevisions(makePostLike({ id: '1', lexical: 'current', html: 'current' - }, []); + }), []); - const actual = await postRevisions.getRevisions({ + const actual = await postRevisions.getRevisions(makePostLike({ id: '1', lexical: 'new', html: 'new' - }, revisions, { + }), revisions, { forceRevision: true }); @@ -218,21 +256,23 @@ describe('PostRevisions', function () { it('limits the number of revisions to the max_revisions count', async function () { const postRevisions = new PostRevisions({ config: { - max_revisions: 1 - } + max_revisions: 1, + revision_interval_ms: config.revision_interval_ms + }, + model: {} }); - const revisions = await postRevisions.getRevisions({ + const revisions = await postRevisions.getRevisions(makePostLike({ id: '1', lexical: 'current', html: 'current' - }, []); + }), []); - const actual = await postRevisions.getRevisions({ + const actual = await postRevisions.getRevisions(makePostLike({ id: '1', lexical: 'new', html: 'new' - }, revisions, { + }), revisions, { forceRevision: true }); @@ -270,6 +310,7 @@ describe('PostRevisions', function () { bulkEdit: sinon.stub().resolves() }; const postRevisions = new PostRevisions({ + config, model: modelStub }); @@ -299,6 +340,7 @@ describe('PostRevisions', function () { bulkEdit: sinon.stub().resolves() }; const postRevisions = new PostRevisions({ + config, model: modelStub }); diff --git a/ghost/post-revisions/tsconfig.json b/ghost/post-revisions/tsconfig.json new file mode 100644 index 0000000000..b0d3bce467 --- /dev/null +++ b/ghost/post-revisions/tsconfig.json @@ -0,0 +1,110 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2022", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": ["es2019"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + "rootDir": "src", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "build", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["src/**/*"] +} diff --git a/package.json b/package.json index 67b2af1d9d..0f51881ff6 100644 --- a/package.json +++ b/package.json @@ -127,6 +127,7 @@ "eslint-plugin-ghost": "2.16.0", "husky": "8.0.3", "lerna": "6.6.1", - "lint-staged": "13.1.2" + "lint-staged": "13.1.2", + "ts-node": "10.9.1" } } diff --git a/yarn.lock b/yarn.lock index 2ec3ba81cf..f199d13e87 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1836,6 +1836,13 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" @@ -3218,6 +3225,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -3236,6 +3248,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -6175,6 +6195,26 @@ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + "@tufjs/models@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.1.tgz#cc8bb0478188b4b6e58d5528668212724aac87ac" @@ -7275,7 +7315,7 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.2.0: +acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1, acorn-walk@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== @@ -7295,7 +7335,7 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.1.0, acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1, acorn@^8.8.2: +acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1, acorn@^8.8.2: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -7499,6 +7539,13 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== +ansi-split@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ansi-split/-/ansi-split-1.0.1.tgz#3cab03754ab6f1d64d4ad13cd10f22fc36db4a45" + integrity sha512-RRxQym4DFtDNmHIkW6aeFVvrXURb11lGAEPXNiryjCe8bK8RsANjzJ0M2aGOkvBYwP4Bl/xZ8ijtr6D3j1x/eg== + dependencies: + ansi-regex "^3.0.0" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -7649,6 +7696,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -11685,6 +11737,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cron-validate@1.4.5, cron-validate@^1.4.1: version "1.4.5" resolved "https://registry.yarnpkg.com/cron-validate/-/cron-validate-1.4.5.tgz#eceb221f7558e6302e5f84c7b3a454fdf4d064c3" @@ -12512,6 +12569,11 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== +detect-indent@6.1.0, detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -12524,11 +12586,6 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - detect-libc@^2.0.0, detect-libc@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" @@ -12598,7 +12655,7 @@ diff@5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== -diff@^4.0.2: +diff@^4.0.1, diff@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== @@ -15678,7 +15735,7 @@ fast-glob@3.2.7: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: +fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.5, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -15934,7 +15991,7 @@ find-index@^1.1.0: resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.1.tgz#4b221f8d46b7f8bea33d8faed953f3ca7a081cbc" integrity sha512-XYKutXMrIK99YMUPf91KX5QVJoG31/OsgftD6YoTPAObfQIxM4ziA9f0J1AsqKhJmo+IeaIPP0CFopTD4bdUBw== -find-root@^1.1.0: +find-root@1.1.0, find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== @@ -16821,6 +16878,17 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + glob@8.1.0, glob@^8.0.1, glob@^8.0.3: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" @@ -16854,7 +16922,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.4, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -17842,7 +17910,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.0, ignore@^5.0.4, ignore@^5.1.1, ignore@^5.2.0: +ignore@^5.0.0, ignore@^5.0.4, ignore@^5.1.1, ignore@^5.1.8, ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -20804,6 +20872,11 @@ lodash.flatten@^4.2.0, lodash.flatten@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== +lodash.flattendeep@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== + lodash.foreach@^4.3.0, lodash.foreach@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" @@ -21233,6 +21306,11 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: version "10.2.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" @@ -21672,6 +21750,11 @@ methods@^1.1.2, methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micro-memoize@^4.0.9: + version "4.0.14" + resolved "https://registry.yarnpkg.com/micro-memoize/-/micro-memoize-4.0.14.tgz#d1239ce2e5831125ac518509f5a23b54e7ca3e17" + integrity sha512-2tzWP1w2Hh+r7kCYa4f//jpBEA6dAueiuLco38NxfjF9Py3KCCI7wVOTdCvOhmTC043t+ulclVBdl3v+s+UJIQ== + micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -22205,6 +22288,17 @@ moment@2.24.0, moment@2.27.0, moment@2.29.1, moment@2.29.3, moment@2.29.4, "mome resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== +monobundle@TryGhost/monobundle#3f1cb946d41d2650d657817c7088574e7c964ac5: + version "0.1.0" + resolved "https://codeload.github.com/TryGhost/monobundle/tar.gz/3f1cb946d41d2650d657817c7088574e7c964ac5" + dependencies: + detect-indent "6.1.0" + detect-newline "3.1.0" + find-root "1.1.0" + glob "8.0.3" + lodash.flattendeep "4.4.0" + ultra-runner "3.10.5" + moo@^0.5.0, moo@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" @@ -22992,6 +23086,13 @@ npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1: npm-package-arg "^9.0.1" proc-log "^2.0.0" +npm-run-path@4.0.1, npm-run-path@^4.0.0, npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -23006,13 +23107,6 @@ npm-run-path@^3.0.0: dependencies: path-key "^3.0.0" -npm-run-path@^4.0.0, npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - npm-run-path@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" @@ -24044,6 +24138,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatc resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pid-cwd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pid-cwd/-/pid-cwd-1.2.0.tgz#c14c03d812b1d23f97aee27767957fc16272c979" + integrity sha512-8QQzIdBmy4bd2l1NKWON1X8flO5TQQRzU2uRDua/XaxSC0iJ+rgbDrlX76t0W3DaJ7OevTYpftyvQ6oMe3hclQ== + pidtree@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" @@ -25558,6 +25657,11 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== +ps-list@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/ps-list/-/ps-list-7.2.0.tgz#3d110e1de8249a4b178c9b1cf2a215d1e4e42fc0" + integrity sha512-v4Bl6I3f2kJfr5o80ShABNHAokIgY+wFDTQfE+X3zWYgSGQOCBeYptLZUpoOALBqO5EawmDN/tjTldJesd0ujQ== + pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -27368,6 +27472,11 @@ shell-quote@^1.7.3, shell-quote@^1.8.0: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== +shellwords-ts@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shellwords-ts/-/shellwords-ts-3.0.1.tgz#7c2ed81ea6d0804705a95a5625682363972600e2" + integrity sha512-GabK4ApLMqHFRGlpgNqg8dmtHTnYHt0WUUJkIeMd3QaDrUUBEDXHSSNi3I0PzMimg8W+I0EN4TshQxsnHv1cwg== + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -29360,6 +29469,25 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-node@10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.14.1: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" @@ -29379,6 +29507,11 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -29480,7 +29613,7 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.21.3: +type-fest@^0.21.2, type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== @@ -29534,6 +29667,11 @@ typescript-memoize@^1.0.0-alpha.3, typescript-memoize@^1.0.1: resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.1.1.tgz#02737495d5df6ebf72c07ba0d002e8f4cf5ccfa0" integrity sha512-GQ90TcKpIH4XxYTI2F98yEQYZgjNMOGPpOgdjIBhaLaWji5HPWlRnZ4AeA1hfBxtY7bCGDJsqDDHk/KaHOl5bA== +typescript@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== + "typescript@^3 || ^4", typescript@^4.2.4: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" @@ -29561,6 +29699,30 @@ uid-safe@~2.1.5: dependencies: random-bytes "~1.0.0" +ultra-runner@3.10.5: + version "3.10.5" + resolved "https://registry.yarnpkg.com/ultra-runner/-/ultra-runner-3.10.5.tgz#7a723b64326642a6d4649ca4cd51a9900c7eccd2" + integrity sha512-0U2OPII7sbvtbu9rhDlUUkP4Au/DPz2Tzbnawd/XwDuUruDqd+t/Bmel3cLJxl3yMLHf0OY0TMcIx9zzxdlAZw== + dependencies: + ansi-split "^1.0.1" + chalk "^4.1.0" + cross-spawn "^7.0.3" + fast-glob "^3.2.5" + globrex "^0.1.2" + ignore "^5.1.8" + json5 "^2.2.0" + micro-memoize "^4.0.9" + npm-run-path "4.0.1" + pid-cwd "^1.2.0" + ps-list "^7.2.0" + shellwords-ts "^3.0.0" + string-width "^4.2.0" + tslib "2.1.0" + type-fest "^0.21.2" + wrap-ansi "^7.0.0" + yamljs "^0.3.0" + yargs "^16.2.0" + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -29991,6 +30153,11 @@ uuid@^7.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + v8-compile-cache@2.3.0, v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1, v8-compile-cache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -31173,6 +31340,14 @@ yaml@^2.1.1, yaml@^2.1.3: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== +yamljs@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.3.0.tgz#dc060bf267447b39f7304e9b2bfbe8b5a7ddb03b" + integrity sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ== + dependencies: + argparse "^1.0.7" + glob "^7.0.5" + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -31268,6 +31443,11 @@ yjs@13.5.50: dependencies: lib0 "^0.2.49" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"