diff --git a/changelog.md b/changelog.md index 9e84044..741e296 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,9 @@ # Changelog +## 9.3.1 + +- Add `GlueIcebergTable` shortcut for creating AWS Glue tables backed by Apache Iceberg format with support for table optimizers. + ## 9.2.1 - Refactor tests to use `jest` instead of `tape` & update linting dependencies to fix security vulnerabilities. diff --git a/lib/shortcuts/api.md b/lib/shortcuts/api.md index 04f2abd..9d8c661 100644 --- a/lib/shortcuts/api.md +++ b/lib/shortcuts/api.md @@ -12,6 +12,9 @@ a Lambda permission.
Create a Glue Database.
Create a Glue table backed by Apache Iceberg format on S3.
+Create a Glue Table backed by line-delimited JSON files on S3.
Object | | Options for creating an Iceberg table. |
+| options.LogicalName | String | | The logical name of the Glue Table within the CloudFormation template. |
+| options.Name | String | | The name of the table. |
+| options.DatabaseName | String | | The name of the database the table resides in. |
+| options.Location | String | | The physical location of the table (S3 URI). Required. |
+| options.Schema | Object | | Full Iceberg schema definition with Type: "struct" and Fields array. Each field must have Id (integer), Name (string), Type (string or object for complex types), and Required (boolean). See [AWS documentation](https://docs.aws.amazon.com/glue/latest/webapi/API_IcebergSchema.html). |
+| [options.PartitionSpec] | Object | | Iceberg partition specification. See [AWS documentation](https://docs.aws.amazon.com/glue/latest/webapi/API_IcebergPartitionSpec.html). |
+| [options.WriteOrder] | Object | | Iceberg write order specification. See [AWS documentation](https://docs.aws.amazon.com/glue/latest/webapi/API_IcebergSortOrder.html). |
+| [options.CatalogId] | String | AccountId | The AWS account ID for the account in which to create the table. |
+| [options.IcebergVersion] | String | '2' | The table version for the Iceberg table. |
+| [options.EnableOptimizer] | Boolean | false | Whether to enable the snapshot retention optimizer. |
+| [options.OptimizerRoleArn] | String | | The ARN of the IAM role for the retention optimizer. Required if EnableOptimizer is true. |
+| [options.SnapshotRetentionPeriodInDays] | Number | 5 | The number of days to retain snapshots. |
+| [options.NumberOfSnapshotsToRetain] | Number | 1 | The minimum number of snapshots to retain. |
+| [options.CleanExpiredFiles] | Boolean | true | Whether to delete expired data files after expiring snapshots. |
+| [options.EnableCompaction] | Boolean | false | Whether to enable the compaction optimizer. |
+| [options.CompactionRoleArn] | String | | The ARN of the IAM role for the compaction optimizer. Required if EnableCompaction is true. |
+| [options.EnableOrphanFileDeletion] | Boolean | false | Whether to enable the orphan file deletion optimizer. |
+| [options.OrphanFileDeletionRoleArn] | String | | The ARN of the IAM role for the orphan file deletion optimizer. Required if EnableOrphanFileDeletion is true. |
+| [options.OrphanFileRetentionPeriodInDays] | Number | 3 | The number of days to retain orphan files before deleting them. |
+| [options.OrphanFileDeletionLocation] | String | | The S3 location to scan for orphan files. |
+
## GlueJsonTable
diff --git a/lib/shortcuts/glue-iceberg-table.js b/lib/shortcuts/glue-iceberg-table.js
new file mode 100644
index 0000000..f2ca8ec
--- /dev/null
+++ b/lib/shortcuts/glue-iceberg-table.js
@@ -0,0 +1,187 @@
+'use strict';
+
+/**
+ * Create a Glue table backed by Apache Iceberg format on S3.
+ *
+ * @param {Object} options - Options for creating an Iceberg table.
+ * @param {String} options.LogicalName - The logical name of the Glue Table within the CloudFormation template.
+ * @param {String} options.Name - The name of the table.
+ * @param {String} options.DatabaseName - The name of the database the table resides in.
+ * @param {String} options.Location - The physical location of the table (S3 URI). Required.
+ * @param {Object} options.Schema - Full Iceberg schema definition with Type: "struct" and Fields array.
+ * Each field must have Id (integer), Name (string), Type (string or object for complex types), and Required (boolean).
+ * See [AWS
+ * documentation](https://docs.aws.amazon.com/glue/latest/webapi/API_IcebergSchema.html).
+ * @param {Object} [options.PartitionSpec] - Iceberg partition specification. See [AWS
+ * documentation](https://docs.aws.amazon.com/glue/latest/webapi/API_IcebergPartitionSpec.html).
+ * @param {Object} [options.WriteOrder] - Iceberg write order specification. See [AWS
+ * documentation](https://docs.aws.amazon.com/glue/latest/webapi/API_IcebergSortOrder.html).
+ * @param {String} [options.CatalogId=AccountId] - The AWS account ID for the account in which to create the table.
+ * @param {String} [options.IcebergVersion='2'] - The table version for the Iceberg table.
+ * @param {Boolean} [options.EnableOptimizer=false] - Whether to enable the snapshot retention optimizer.
+ * @param {String} [options.OptimizerRoleArn=undefined] - The ARN of the IAM role for the retention optimizer. Required if EnableOptimizer is true.
+ * @param {Number} [options.SnapshotRetentionPeriodInDays=5] - The number of days to retain snapshots.
+ * @param {Number} [options.NumberOfSnapshotsToRetain=1] - The minimum number of snapshots to retain.
+ * @param {Boolean} [options.CleanExpiredFiles=true] - Whether to delete expired data files after expiring snapshots.
+ * @param {Boolean} [options.EnableCompaction=false] - Whether to enable the compaction optimizer.
+ * @param {String} [options.CompactionRoleArn=undefined] - The ARN of the IAM role for the compaction optimizer. Required if EnableCompaction is true.
+ * @param {Boolean} [options.EnableOrphanFileDeletion=false] - Whether to enable the orphan file deletion optimizer.
+ * @param {String} [options.OrphanFileDeletionRoleArn=undefined] - The ARN of the IAM role for the orphan file deletion optimizer. Required if EnableOrphanFileDeletion is true.
+ * @param {Number} [options.OrphanFileRetentionPeriodInDays=3] - The number of days to retain orphan files before deleting them.
+ * @param {String} [options.OrphanFileDeletionLocation=undefined] - The S3 location to scan for orphan files.
+ */
+class GlueIcebergTable {
+ constructor(options) {
+ if (!options) throw new Error('Options required');
+ const {
+ LogicalName,
+ Name,
+ DatabaseName,
+ Location,
+ Schema,
+ PartitionSpec,
+ WriteOrder,
+ CatalogId = { Ref: 'AWS::AccountId' },
+ IcebergVersion = '2',
+ EnableOptimizer = false,
+ OptimizerRoleArn,
+ SnapshotRetentionPeriodInDays = 5,
+ NumberOfSnapshotsToRetain = 1,
+ CleanExpiredFiles = true,
+ EnableCompaction = false,
+ CompactionRoleArn,
+ EnableOrphanFileDeletion = false,
+ OrphanFileDeletionRoleArn,
+ OrphanFileRetentionPeriodInDays = 3,
+ OrphanFileDeletionLocation
+ } = options;
+
+ // Validate required fields
+ const required = [LogicalName, Name, DatabaseName, Location, Schema];
+ if (required.some((variable) => !variable))
+ throw new Error('You must provide a LogicalName, Name, DatabaseName, Location, and Schema');
+
+ if (EnableOptimizer && !OptimizerRoleArn)
+ throw new Error('You must provide an OptimizerRoleArn when EnableOptimizer is true');
+
+ if (EnableCompaction && !CompactionRoleArn)
+ throw new Error('You must provide a CompactionRoleArn when EnableCompaction is true');
+
+ if (EnableOrphanFileDeletion && !OrphanFileDeletionRoleArn)
+ throw new Error('You must provide an OrphanFileDeletionRoleArn when EnableOrphanFileDeletion is true');
+
+ // Build the Iceberg table resource (no TableInput!)
+ this.Resources = {
+ [LogicalName]: {
+ Type: 'AWS::Glue::Table',
+ Properties: {
+ CatalogId,
+ DatabaseName,
+ Name,
+ OpenTableFormatInput: {
+ IcebergInput: {
+ MetadataOperation: 'CREATE', // NOTE: this is _always_ CREATE because it's about creating a new metadata version, not creating a new table
+ Version: IcebergVersion,
+ IcebergTableInput: {
+ Location,
+ Schema
+ }
+ }
+ }
+ }
+ }
+ };
+
+ // Add optional PartitionSpec if provided
+ if (PartitionSpec) {
+ this.Resources[LogicalName].Properties.OpenTableFormatInput.IcebergInput.IcebergTableInput.PartitionSpec = PartitionSpec;
+ }
+
+ // Add optional WriteOrder if provided
+ if (WriteOrder) {
+ this.Resources[LogicalName].Properties.OpenTableFormatInput.IcebergInput.IcebergTableInput.WriteOrder = WriteOrder;
+ }
+
+ // Optionally add TableOptimizer for configuring snapshot retention
+ if (EnableOptimizer) {
+ const optimizerLogicalName = `${LogicalName}RetentionOptimizer`;
+ this.Resources[optimizerLogicalName] = {
+ Type: 'AWS::Glue::TableOptimizer',
+ DependsOn: LogicalName,
+ Properties: {
+ CatalogId,
+ DatabaseName,
+ TableName: Name,
+ Type: 'retention',
+ TableOptimizerConfiguration: {
+ RoleArn: OptimizerRoleArn,
+ Enabled: true,
+ RetentionConfiguration: {
+ IcebergConfiguration: {
+ SnapshotRetentionPeriodInDays,
+ NumberOfSnapshotsToRetain,
+ CleanExpiredFiles
+ }
+ }
+ }
+ }
+ };
+ }
+
+ // Optionally add TableOptimizer for compaction
+ // NOTE: CloudFormation does not support CompactionConfiguration properties
+ // (strategy, minInputFiles, deleteFileThreshold). These must be configured
+ // via AWS CLI/API after stack creation, or will use AWS defaults.
+ // See: https://github.com/aws-cloudformation/cloudformation-coverage-roadmap/issues/2257
+ if (EnableCompaction) {
+ const compactionLogicalName = `${LogicalName}CompactionOptimizer`;
+ this.Resources[compactionLogicalName] = {
+ Type: 'AWS::Glue::TableOptimizer',
+ DependsOn: LogicalName,
+ Properties: {
+ CatalogId,
+ DatabaseName,
+ TableName: Name,
+ Type: 'compaction',
+ TableOptimizerConfiguration: {
+ RoleArn: CompactionRoleArn,
+ Enabled: true
+ }
+ }
+ };
+ }
+
+ // Optionally add TableOptimizer for orphan file deletion
+ if (EnableOrphanFileDeletion) {
+ const orphanLogicalName = `${LogicalName}OrphanFileDeletionOptimizer`;
+ const icebergConfiguration = {
+ OrphanFileRetentionPeriodInDays
+ };
+
+ // Only add Location if specified, otherwise it defaults to table location
+ if (OrphanFileDeletionLocation) {
+ icebergConfiguration.Location = OrphanFileDeletionLocation;
+ }
+
+ this.Resources[orphanLogicalName] = {
+ Type: 'AWS::Glue::TableOptimizer',
+ DependsOn: LogicalName,
+ Properties: {
+ CatalogId,
+ DatabaseName,
+ TableName: Name,
+ Type: 'orphan_file_deletion',
+ TableOptimizerConfiguration: {
+ RoleArn: OrphanFileDeletionRoleArn,
+ Enabled: true,
+ OrphanFileDeletionConfiguration: {
+ IcebergConfiguration: icebergConfiguration
+ }
+ }
+ }
+ };
+ }
+ }
+}
+
+module.exports = GlueIcebergTable;
diff --git a/lib/shortcuts/index.js b/lib/shortcuts/index.js
index 54e40fe..63fa0f9 100644
--- a/lib/shortcuts/index.js
+++ b/lib/shortcuts/index.js
@@ -16,6 +16,7 @@ module.exports = {
GlueJsonTable: require('./glue-json-table'),
GlueOrcTable: require('./glue-orc-table'),
GlueParquetTable: require('./glue-parquet-table'),
+ GlueIcebergTable: require('./glue-iceberg-table'),
GluePrestoView: require('./glue-presto-view'),
GlueSparkView: require('./glue-spark-view'),
hookshot: require('./hookshot'),
diff --git a/package-lock.json b/package-lock.json
index 84552d3..b2fb835 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@mapbox/cloudfriend",
- "version": "9.2.1",
+ "version": "9.3.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@mapbox/cloudfriend",
- "version": "9.2.1",
+ "version": "9.3.1",
"license": "ISC",
"dependencies": {
"@aws-sdk/client-cloudformation": "^3.848.0",
@@ -22,7 +22,7 @@
"eslint": "^8.57.0",
"eslint-plugin-node": "^6.0.1",
"jest": "^29.7.0",
- "jsdoc-to-markdown": "^7.1.1"
+ "jsdoc-to-markdown": "^9.1.3"
},
"engines": {
"node": ">=20"
@@ -1902,10 +1902,11 @@
}
},
"node_modules/@jsdoc/salty": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.5.tgz",
- "integrity": "sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==",
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz",
+ "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"lodash": "^4.17.21"
},
@@ -2669,26 +2670,29 @@
}
},
"node_modules/@types/linkify-it": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
- "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==",
- "dev": true
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/markdown-it": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
- "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/linkify-it": "*",
- "@types/mdurl": "*"
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
}
},
"node_modules/@types/mdurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
- "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
- "dev": true
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/node": {
"version": "25.2.1",
@@ -3031,27 +3035,6 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/ansi-escape-sequences": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz",
- "integrity": "sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw==",
- "dev": true,
- "dependencies": {
- "array-back": "^3.0.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ansi-escape-sequences/node_modules/array-back": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
- "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -3106,6 +3089,7 @@
"resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz",
"integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12.17"
}
@@ -3292,7 +3276,8 @@
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/bowser": {
"version": "2.11.0",
@@ -3375,26 +3360,24 @@
"dev": true
},
"node_modules/cache-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-2.0.0.tgz",
- "integrity": "sha512-4gkeHlFpSKgm3vm2gJN5sPqfmijYRFYCQ6tv5cLw0xVmT6r1z1vd4FNnpuOREco3cBs1G709sZ72LdgddKvL5w==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-3.0.1.tgz",
+ "integrity": "sha512-itTIMLEKbh6Dw5DruXbxAgcyLnh/oPGVLBfTPqBOftASxHe8bAeXy7JkO4F0LvHqht7XqP5O/09h5UcHS2w0FA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-back": "^4.0.1",
- "fs-then-native": "^2.0.0",
- "mkdirp2": "^1.0.4"
+ "array-back": "^6.2.2"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/cache-point/node_modules/array-back": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
- "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
- "dev": true,
- "engines": {
- "node": ">=8"
+ "node": ">=12.17"
+ },
+ "peerDependencies": {
+ "@75lb/nature": "latest"
+ },
+ "peerDependenciesMeta": {
+ "@75lb/nature": {
+ "optional": true
+ }
}
},
"node_modules/callsites": {
@@ -3442,6 +3425,7 @@
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
"integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"lodash": "^4.17.15"
},
@@ -3466,6 +3450,22 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/chalk-template": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz",
+ "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk-template?sponsor=1"
+ }
+ },
"node_modules/char-regex": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
@@ -3509,19 +3509,6 @@
"node": ">= 0.12.0"
}
},
- "node_modules/collect-all": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.4.tgz",
- "integrity": "sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==",
- "dev": true,
- "dependencies": {
- "stream-connect": "^1.0.2",
- "stream-via": "^1.0.4"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/collect-v8-coverage": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
@@ -3550,100 +3537,53 @@
"license": "MIT"
},
"node_modules/command-line-args": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
- "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.1.tgz",
+ "integrity": "sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-back": "^3.1.0",
- "find-replace": "^3.0.0",
+ "array-back": "^6.2.2",
+ "find-replace": "^5.0.2",
"lodash.camelcase": "^4.3.0",
- "typical": "^4.0.0"
+ "typical": "^7.2.0"
},
"engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/command-line-args/node_modules/array-back": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
- "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/command-line-args/node_modules/typical": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
- "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/command-line-tool": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/command-line-tool/-/command-line-tool-0.8.0.tgz",
- "integrity": "sha512-Xw18HVx/QzQV3Sc5k1vy3kgtOeGmsKIqwtFFoyjI4bbcpSgnw2CWVULvtakyw4s6fhyAdI6soQQhXc2OzJy62g==",
- "dev": true,
- "dependencies": {
- "ansi-escape-sequences": "^4.0.0",
- "array-back": "^2.0.0",
- "command-line-args": "^5.0.0",
- "command-line-usage": "^4.1.0",
- "typical": "^2.6.1"
+ "node": ">=12.20"
},
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/command-line-tool/node_modules/array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
- "dev": true,
- "dependencies": {
- "typical": "^2.6.1"
+ "peerDependencies": {
+ "@75lb/nature": "latest"
},
- "engines": {
- "node": ">=4"
+ "peerDependenciesMeta": {
+ "@75lb/nature": {
+ "optional": true
+ }
}
},
"node_modules/command-line-usage": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
- "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
- "dev": true,
- "dependencies": {
- "ansi-escape-sequences": "^4.0.0",
- "array-back": "^2.0.0",
- "table-layout": "^0.4.2",
- "typical": "^2.6.1"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/command-line-usage/node_modules/array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz",
+ "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "typical": "^2.6.1"
+ "array-back": "^6.2.2",
+ "chalk-template": "^0.4.0",
+ "table-layout": "^4.1.0",
+ "typical": "^7.1.1"
},
"engines": {
- "node": ">=4"
+ "node": ">=12.20.0"
}
},
"node_modules/common-sequence": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-2.0.2.tgz",
- "integrity": "sha512-jAg09gkdkrDO9EWTdXfv80WWH3yeZl5oT69fGfedBNS9pXUKYInVJ1bJ+/ht2+Moeei48TmSbQDYMc8EOx9G0g==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-3.0.0.tgz",
+ "integrity": "sha512-g/CgSYk93y+a1IKm50tKl7kaT/OjjTYVQlEbUlt/49ZLV1mcKpUU7iyDiqTAeLdb4QDtQfq3ako8y8v//fzrWQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=12.17"
}
},
"node_modules/concat-map": {
@@ -3707,6 +3647,16 @@
"node": ">= 8"
}
},
+ "node_modules/current-module-paths": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/current-module-paths/-/current-module-paths-1.1.3.tgz",
+ "integrity": "sha512-7AH+ZTRKikdK4s1RmY0l6067UD/NZc7p3zZVZxvmnH80G31kr0y0W0E6ibYM4IS01MEm8DiC5FnTcgcgkbFHoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.17"
+ }
+ },
"node_modules/debug": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
@@ -3740,15 +3690,6 @@
}
}
},
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -3801,26 +3742,30 @@
}
},
"node_modules/dmd": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/dmd/-/dmd-6.1.0.tgz",
- "integrity": "sha512-0zQIJ873gay1scCTFZvHPWM9mVJBnaylB2NQDI8O9u8O32m00Jb6uxDKexZm8hjTRM7RiWe0FJ32pExHoXdwoQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/dmd/-/dmd-7.1.1.tgz",
+ "integrity": "sha512-Ap2HP6iuOek7eShReDLr9jluNJm9RMZESlt29H/Xs1qrVMkcS9X6m5h1mBC56WMxNiSo0wvjGICmZlYUSFjwZQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"array-back": "^6.2.2",
- "cache-point": "^2.0.0",
- "common-sequence": "^2.0.2",
- "file-set": "^4.0.2",
- "handlebars": "^4.7.7",
- "marked": "^4.0.12",
- "object-get": "^2.1.1",
- "reduce-flatten": "^3.0.1",
- "reduce-unique": "^2.0.1",
- "reduce-without": "^1.0.1",
- "test-value": "^3.0.0",
- "walk-back": "^5.1.0"
+ "cache-point": "^3.0.0",
+ "common-sequence": "^3.0.0",
+ "file-set": "^5.2.2",
+ "handlebars": "^4.7.8",
+ "marked": "^4.3.0",
+ "walk-back": "^5.1.1"
},
"engines": {
- "node": ">=12"
+ "node": ">=12.17"
+ },
+ "peerDependencies": {
+ "@75lb/nature": "latest"
+ },
+ "peerDependenciesMeta": {
+ "@75lb/nature": {
+ "optional": true
+ }
}
},
"node_modules/doctrine": {
@@ -3879,10 +3824,14 @@
}
},
"node_modules/entities": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
- "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
@@ -4322,7 +4271,6 @@
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
@@ -4340,7 +4288,6 @@
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
- "peer": true,
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -4414,25 +4361,25 @@
}
},
"node_modules/file-set": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/file-set/-/file-set-4.0.2.tgz",
- "integrity": "sha512-fuxEgzk4L8waGXaAkd8cMr73Pm0FxOVkn8hztzUW7BAHhOGH90viQNXbiOsnecCWmfInqU6YmAMwxRMdKETceQ==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/file-set/-/file-set-5.3.0.tgz",
+ "integrity": "sha512-FKCxdjLX0J6zqTWdT0RXIxNF/n7MyXXnsSUp0syLEOCKdexvPZ02lNNv2a+gpK9E3hzUYF3+eFZe32ci7goNUg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-back": "^5.0.0",
- "glob": "^7.1.6"
+ "array-back": "^6.2.2",
+ "fast-glob": "^3.3.2"
},
"engines": {
- "node": ">=10"
- }
- },
- "node_modules/file-set/node_modules/array-back": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-5.0.0.tgz",
- "integrity": "sha512-kgVWwJReZWmVuWOQKEOohXKJX+nD02JAZ54D1RRWlv8L0NebauKAaFxACKzB74RTclt1+WNz5KHaLRDAPZbDEw==",
- "dev": true,
- "engines": {
- "node": ">=10"
+ "node": ">=12.17"
+ },
+ "peerDependencies": {
+ "@75lb/nature": "latest"
+ },
+ "peerDependenciesMeta": {
+ "@75lb/nature": {
+ "optional": true
+ }
}
},
"node_modules/fill-range": {
@@ -4449,24 +4396,21 @@
}
},
"node_modules/find-replace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
- "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
- "dev": true,
- "dependencies": {
- "array-back": "^3.0.1"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/find-replace/node_modules/array-back": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
- "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz",
+ "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@75lb/nature": "latest"
+ },
+ "peerDependenciesMeta": {
+ "@75lb/nature": {
+ "optional": true
+ }
}
},
"node_modules/find-up": {
@@ -4508,15 +4452,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/fs-then-native": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz",
- "integrity": "sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -4707,13 +4642,14 @@
"license": "MIT"
},
"node_modules/handlebars": {
- "version": "4.7.7",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
- "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"minimist": "^1.2.5",
- "neo-async": "^2.6.0",
+ "neo-async": "^2.6.2",
"source-map": "^0.6.1",
"wordwrap": "^1.0.0"
},
@@ -5758,26 +5694,28 @@
"resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
"integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"xmlcreate": "^2.0.4"
}
},
"node_modules/jsdoc": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz",
- "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.5.tgz",
+ "integrity": "sha512-P4C6MWP9yIlMiK8nwoZvxN84vb6MsnXcHuy7XzVOvQoCizWX5JFCBsWIIWKXBltpoRZXddUOVQmCTOZt9yDj9g==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"@babel/parser": "^7.20.15",
"@jsdoc/salty": "^0.2.1",
- "@types/markdown-it": "^12.2.3",
+ "@types/markdown-it": "^14.1.1",
"bluebird": "^3.7.2",
"catharsis": "^0.9.0",
"escape-string-regexp": "^2.0.0",
"js2xmlparser": "^4.0.2",
"klaw": "^3.0.0",
- "markdown-it": "^12.3.2",
- "markdown-it-anchor": "^8.4.1",
+ "markdown-it": "^14.1.0",
+ "markdown-it-anchor": "^8.6.7",
"marked": "^4.0.10",
"mkdirp": "^1.0.4",
"requizzle": "^0.2.3",
@@ -5792,78 +5730,76 @@
}
},
"node_modules/jsdoc-api": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-7.2.0.tgz",
- "integrity": "sha512-93YDnlm/OYTlLOFeNs4qAv0RBCJ0kGj67xQaWy8wrbk97Rw1EySitoOTHsTHXPEs3uyx2IStPKGrbE7LTnZXbA==",
+ "version": "9.3.5",
+ "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-9.3.5.tgz",
+ "integrity": "sha512-TQwh1jA8xtCkIbVwm/XA3vDRAa5JjydyKx1cC413Sh3WohDFxcMdwKSvn4LOsq2xWyAmOU/VnSChTQf6EF0R8g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"array-back": "^6.2.2",
- "cache-point": "^2.0.0",
- "collect-all": "^1.0.4",
- "file-set": "^4.0.2",
- "fs-then-native": "^2.0.0",
- "jsdoc": "^4.0.0",
+ "cache-point": "^3.0.1",
+ "current-module-paths": "^1.1.2",
+ "file-set": "^5.3.0",
+ "jsdoc": "^4.0.4",
"object-to-spawn-args": "^2.0.1",
- "temp-path": "^1.0.0",
- "walk-back": "^5.1.0"
+ "walk-back": "^5.1.1"
},
"engines": {
"node": ">=12.17"
+ },
+ "peerDependencies": {
+ "@75lb/nature": "latest"
+ },
+ "peerDependenciesMeta": {
+ "@75lb/nature": {
+ "optional": true
+ }
}
},
"node_modules/jsdoc-parse": {
- "version": "6.2.4",
- "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-6.2.4.tgz",
- "integrity": "sha512-MQA+lCe3ioZd0uGbyB3nDCDZcKgKC7m/Ivt0LgKZdUoOlMJxUWJQ3WI6GeyHp9ouznKaCjlp7CU9sw5k46yZTw==",
+ "version": "6.2.5",
+ "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-6.2.5.tgz",
+ "integrity": "sha512-8JaSNjPLr2IuEY4Das1KM6Z4oLHZYUnjRrr27hKSa78Cj0i5Lur3DzNnCkz+DfrKBDoljGMoWOiBVQbtUZJBPw==",
"dev": true,
"license": "MIT",
"dependencies": {
"array-back": "^6.2.2",
"find-replace": "^5.0.1",
- "lodash.omit": "^4.5.0",
"sort-array": "^5.0.0"
},
"engines": {
"node": ">=12"
}
},
- "node_modules/jsdoc-parse/node_modules/find-replace": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz",
- "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@75lb/nature": "latest"
- },
- "peerDependenciesMeta": {
- "@75lb/nature": {
- "optional": true
- }
- }
- },
"node_modules/jsdoc-to-markdown": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-7.1.1.tgz",
- "integrity": "sha512-CI86d63xAVNO+ENumWwmJ034lYe5iGU5GwjtTA11EuphP9tpnoi4hrKgR/J8uME0D+o4KUpVfwX1fjZhc8dEtg==",
+ "version": "9.1.3",
+ "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-9.1.3.tgz",
+ "integrity": "sha512-i9wi+6WHX0WKziv0ar88T8h7OmxA0LWdQaV23nY6uQyKvdUPzVt0o6YAaOceFuKRF5Rvlju5w/KnZBfdpDAlnw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"array-back": "^6.2.2",
- "command-line-tool": "^0.8.0",
+ "command-line-args": "^6.0.1",
+ "command-line-usage": "^7.0.3",
"config-master": "^3.1.0",
- "dmd": "^6.1.0",
- "jsdoc-api": "^7.1.1",
- "jsdoc-parse": "^6.1.0",
- "walk-back": "^5.1.0"
+ "dmd": "^7.1.1",
+ "jsdoc-api": "^9.3.5",
+ "jsdoc-parse": "^6.2.5",
+ "walk-back": "^5.1.1"
},
"bin": {
"jsdoc2md": "bin/cli.js"
},
"engines": {
"node": ">=12.17"
+ },
+ "peerDependencies": {
+ "@75lb/nature": "latest"
+ },
+ "peerDependenciesMeta": {
+ "@75lb/nature": {
+ "optional": true
+ }
}
},
"node_modules/jsdoc/node_modules/escape-string-regexp": {
@@ -5871,22 +5807,11 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
- "node_modules/jsdoc/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/jsesc": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
@@ -5956,6 +5881,7 @@
"resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
"integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"graceful-fs": "^4.1.9"
}
@@ -6002,12 +5928,13 @@
"license": "MIT"
},
"node_modules/linkify-it": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
- "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "uc.micro": "^1.0.1"
+ "uc.micro": "^2.0.0"
}
},
"node_modules/locate-path": {
@@ -6027,16 +5954,18 @@
}
},
"node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
@@ -6045,18 +5974,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/lodash.omit": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
- "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==",
- "dev": true
- },
- "node_modules/lodash.padend": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
- "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==",
- "dev": true
- },
"node_modules/makeerror": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
@@ -6068,19 +5985,21 @@
}
},
"node_modules/markdown-it": {
- "version": "12.3.2",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
- "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
+ "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"argparse": "^2.0.1",
- "entities": "~2.1.0",
- "linkify-it": "^3.0.1",
- "mdurl": "^1.0.1",
- "uc.micro": "^1.0.5"
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
},
"bin": {
- "markdown-it": "bin/markdown-it.js"
+ "markdown-it": "bin/markdown-it.mjs"
}
},
"node_modules/markdown-it-anchor": {
@@ -6088,6 +6007,7 @@
"resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
"integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
"dev": true,
+ "license": "Unlicense",
"peerDependencies": {
"@types/markdown-it": "*",
"markdown-it": "*"
@@ -6097,13 +6017,15 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
+ "dev": true,
+ "license": "Python-2.0"
},
"node_modules/marked": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz",
- "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
"dev": true,
+ "license": "MIT",
"bin": {
"marked": "bin/marked.js"
},
@@ -6112,10 +6034,11 @@
}
},
"node_modules/mdurl": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
- "dev": true
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/merge-stream": {
"version": "2.0.0",
@@ -6130,7 +6053,6 @@
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 8"
}
@@ -6175,11 +6097,18 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
},
- "node_modules/mkdirp2": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/mkdirp2/-/mkdirp2-1.0.5.tgz",
- "integrity": "sha512-xOE9xbICroUDmG1ye2h4bZ8WBie9EGmACaco8K8cx6RlkJJrxGIqjGqztAI+NMhexXBcdGbSEzI6N3EJPevxZw==",
- "dev": true
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
},
"node_modules/ms": {
"version": "2.1.3",
@@ -6198,7 +6127,8 @@
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/node-int64": {
"version": "0.4.0",
@@ -6224,17 +6154,12 @@
"node": ">=0.10.0"
}
},
- "node_modules/object-get": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.1.tgz",
- "integrity": "sha512-7n4IpLMzGGcLEMiQKsNR7vCe+N5E9LORFrtNUVy4sO3dj9a3HedZCxEL2T7QuLhcHN1NBuBsMOKaOsAYI9IIvg==",
- "dev": true
- },
"node_modules/object-to-spawn-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/object-to-spawn-args/-/object-to-spawn-args-2.0.1.tgz",
"integrity": "sha512-6FuKFQ39cOID+BMZ3QaphcC8Y4cw6LXBLyIgPU+OhIYwviJamPAn+4mITapnSBQrejB+NNp+FMskhD8Cq+Ys3w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8.0.0"
}
@@ -6470,6 +6395,16 @@
"node": ">=6"
}
},
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/pure-rand": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
@@ -6527,61 +6462,6 @@
"node": ">=4"
}
},
- "node_modules/reduce-flatten": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-3.0.1.tgz",
- "integrity": "sha512-bYo+97BmUUOzg09XwfkwALt4PQH1M5L0wzKerBt6WLm3Fhdd43mMS89HiT1B9pJIqko/6lWx3OnV4J9f2Kqp5Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/reduce-unique": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/reduce-unique/-/reduce-unique-2.0.1.tgz",
- "integrity": "sha512-x4jH/8L1eyZGR785WY+ePtyMNhycl1N2XOLxhCbzZFaqF4AXjLzqSxa2UHgJ2ZVR/HHyPOvl1L7xRnW8ye5MdA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/reduce-without": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/reduce-without/-/reduce-without-1.0.1.tgz",
- "integrity": "sha512-zQv5y/cf85sxvdrKPlfcRzlDn/OqKFThNimYmsS3flmkioKvkUGn2Qg9cJVoQiEvdxFGLE0MQER/9fZ9sUqdxg==",
- "dev": true,
- "dependencies": {
- "test-value": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/reduce-without/node_modules/array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
- "dev": true,
- "dependencies": {
- "typical": "^2.6.0"
- },
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/reduce-without/node_modules/test-value": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
- "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==",
- "dev": true,
- "dependencies": {
- "array-back": "^1.0.3",
- "typical": "^2.6.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -6596,6 +6476,7 @@
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
"integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"lodash": "^4.17.21"
}
@@ -6801,16 +6682,6 @@
}
}
},
- "node_modules/sort-array/node_modules/typical": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz",
- "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.17"
- }
- },
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -6860,39 +6731,6 @@
"node": ">=8"
}
},
- "node_modules/stream-connect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz",
- "integrity": "sha512-68Kl+79cE0RGKemKkhxTSg8+6AGrqBt+cbZAXevg2iJ6Y3zX4JhA/sZeGzLpxW9cXhmqAcE7KnJCisUmIUfnFQ==",
- "dev": true,
- "dependencies": {
- "array-back": "^1.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stream-connect/node_modules/array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
- "dev": true,
- "dependencies": {
- "typical": "^2.6.0"
- },
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/stream-via": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz",
- "integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/string-length": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
@@ -6989,31 +6827,17 @@
}
},
"node_modules/table-layout": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz",
- "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==",
- "dev": true,
- "dependencies": {
- "array-back": "^2.0.0",
- "deep-extend": "~0.6.0",
- "lodash.padend": "^4.6.1",
- "typical": "^2.6.1",
- "wordwrapjs": "^3.0.0"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/table-layout/node_modules/array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz",
+ "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "typical": "^2.6.1"
+ "array-back": "^6.2.2",
+ "wordwrapjs": "^5.1.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=12.17"
}
},
"node_modules/tapable": {
@@ -7024,42 +6848,11 @@
"license": "MIT",
"peer": true,
"engines": {
- "node": ">=6"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/temp-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz",
- "integrity": "sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==",
- "dev": true
- },
- "node_modules/test-value": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
- "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
- "dev": true,
- "dependencies": {
- "array-back": "^2.0.0",
- "typical": "^2.6.1"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/test-value/node_modules/array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
- "dev": true,
- "dependencies": {
- "typical": "^2.6.1"
- },
- "engines": {
- "node": ">=4"
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
"node_modules/text-table": {
@@ -7199,22 +6992,28 @@
}
},
"node_modules/typical": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
- "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==",
- "dev": true
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz",
+ "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.17"
+ }
},
"node_modules/uc.micro": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
- "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
- "dev": true
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/uglify-js": {
- "version": "3.17.3",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.3.tgz",
- "integrity": "sha512-JmMFDME3iufZnBpyKL+uS78LRiC+mK55zWfM5f/pWBJfpOttXAqYfdDGRukYhJuyRinvPVAtUhvy7rlDybNtFg==",
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
"dev": true,
+ "license": "BSD-2-Clause",
"optional": true,
"bin": {
"uglifyjs": "bin/uglifyjs"
@@ -7224,10 +7023,11 @@
}
},
"node_modules/underscore": {
- "version": "1.13.6",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
- "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
- "dev": true
+ "version": "1.13.7",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
+ "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/undici-types": {
"version": "7.16.0",
@@ -7300,10 +7100,11 @@
"license": "MIT"
},
"node_modules/walk-back": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz",
- "integrity": "sha512-Uhxps5yZcVNbLEAnb+xaEEMdgTXl9qAQDzKYejG2AZ7qPwRQ81lozY9ECDbjLPNWm7YsO1IK5rsP1KoQzXAcGA==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.1.tgz",
+ "integrity": "sha512-e/FRLDVdZQWFrAzU6Hdvpm7D7m2ina833gIKLptQykRK49mmCYHLHq7UqjPDbxbKLZkTkW1rFqbengdE3sLfdw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12.17"
}
@@ -7347,29 +7148,18 @@
"node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
- "dev": true
- },
- "node_modules/wordwrapjs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
- "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
"dev": true,
- "dependencies": {
- "reduce-flatten": "^1.0.1",
- "typical": "^2.6.1"
- },
- "engines": {
- "node": ">=4.0.0"
- }
+ "license": "MIT"
},
- "node_modules/wordwrapjs/node_modules/reduce-flatten": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
- "integrity": "sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ==",
+ "node_modules/wordwrapjs": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz",
+ "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12.17"
}
},
"node_modules/wrappy": {
@@ -7382,7 +7172,8 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
"integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
- "dev": true
+ "dev": true,
+ "license": "Apache-2.0"
},
"node_modules/yargs": {
"version": "17.7.2",
@@ -8880,9 +8671,9 @@
}
},
"@jsdoc/salty": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.5.tgz",
- "integrity": "sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==",
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz",
+ "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==",
"dev": true,
"requires": {
"lodash": "^4.17.21"
@@ -9448,25 +9239,25 @@
}
},
"@types/linkify-it": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
- "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
"dev": true
},
"@types/markdown-it": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
- "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
"dev": true,
"requires": {
- "@types/linkify-it": "*",
- "@types/mdurl": "*"
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
}
},
"@types/mdurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
- "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
"dev": true
},
"@types/node": {
@@ -9677,23 +9468,6 @@
"uri-js": "^4.2.2"
}
},
- "ansi-escape-sequences": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz",
- "integrity": "sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw==",
- "dev": true,
- "requires": {
- "array-back": "^3.0.1"
- },
- "dependencies": {
- "array-back": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
- "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
- "dev": true
- }
- }
- },
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -9923,22 +9697,12 @@
"dev": true
},
"cache-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-2.0.0.tgz",
- "integrity": "sha512-4gkeHlFpSKgm3vm2gJN5sPqfmijYRFYCQ6tv5cLw0xVmT6r1z1vd4FNnpuOREco3cBs1G709sZ72LdgddKvL5w==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-3.0.1.tgz",
+ "integrity": "sha512-itTIMLEKbh6Dw5DruXbxAgcyLnh/oPGVLBfTPqBOftASxHe8bAeXy7JkO4F0LvHqht7XqP5O/09h5UcHS2w0FA==",
"dev": true,
"requires": {
- "array-back": "^4.0.1",
- "fs-then-native": "^2.0.0",
- "mkdirp2": "^1.0.4"
- },
- "dependencies": {
- "array-back": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
- "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
- "dev": true
- }
+ "array-back": "^6.2.2"
}
},
"callsites": {
@@ -9978,6 +9742,15 @@
"supports-color": "^7.1.0"
}
},
+ "chalk-template": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz",
+ "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.2"
+ }
+ },
"char-regex": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
@@ -10002,16 +9775,6 @@
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
"dev": true
},
- "collect-all": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.4.tgz",
- "integrity": "sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==",
- "dev": true,
- "requires": {
- "stream-connect": "^1.0.2",
- "stream-via": "^1.0.4"
- }
- },
"collect-v8-coverage": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
@@ -10034,82 +9797,33 @@
"dev": true
},
"command-line-args": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
- "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.1.tgz",
+ "integrity": "sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg==",
"dev": true,
"requires": {
- "array-back": "^3.1.0",
- "find-replace": "^3.0.0",
+ "array-back": "^6.2.2",
+ "find-replace": "^5.0.2",
"lodash.camelcase": "^4.3.0",
- "typical": "^4.0.0"
- },
- "dependencies": {
- "array-back": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
- "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
- "dev": true
- },
- "typical": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
- "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
- "dev": true
- }
- }
- },
- "command-line-tool": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/command-line-tool/-/command-line-tool-0.8.0.tgz",
- "integrity": "sha512-Xw18HVx/QzQV3Sc5k1vy3kgtOeGmsKIqwtFFoyjI4bbcpSgnw2CWVULvtakyw4s6fhyAdI6soQQhXc2OzJy62g==",
- "dev": true,
- "requires": {
- "ansi-escape-sequences": "^4.0.0",
- "array-back": "^2.0.0",
- "command-line-args": "^5.0.0",
- "command-line-usage": "^4.1.0",
- "typical": "^2.6.1"
- },
- "dependencies": {
- "array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
- "dev": true,
- "requires": {
- "typical": "^2.6.1"
- }
- }
+ "typical": "^7.2.0"
}
},
"command-line-usage": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
- "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz",
+ "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==",
"dev": true,
"requires": {
- "ansi-escape-sequences": "^4.0.0",
- "array-back": "^2.0.0",
- "table-layout": "^0.4.2",
- "typical": "^2.6.1"
- },
- "dependencies": {
- "array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
- "dev": true,
- "requires": {
- "typical": "^2.6.1"
- }
- }
+ "array-back": "^6.2.2",
+ "chalk-template": "^0.4.0",
+ "table-layout": "^4.1.0",
+ "typical": "^7.1.1"
}
},
"common-sequence": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-2.0.2.tgz",
- "integrity": "sha512-jAg09gkdkrDO9EWTdXfv80WWH3yeZl5oT69fGfedBNS9pXUKYInVJ1bJ+/ht2+Moeei48TmSbQDYMc8EOx9G0g==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-3.0.0.tgz",
+ "integrity": "sha512-g/CgSYk93y+a1IKm50tKl7kaT/OjjTYVQlEbUlt/49ZLV1mcKpUU7iyDiqTAeLdb4QDtQfq3ako8y8v//fzrWQ==",
"dev": true
},
"concat-map": {
@@ -10161,6 +9875,12 @@
"which": "^2.0.1"
}
},
+ "current-module-paths": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/current-module-paths/-/current-module-paths-1.1.3.tgz",
+ "integrity": "sha512-7AH+ZTRKikdK4s1RmY0l6067UD/NZc7p3zZVZxvmnH80G31kr0y0W0E6ibYM4IS01MEm8DiC5FnTcgcgkbFHoA==",
+ "dev": true
+ },
"debug": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
@@ -10177,12 +9897,6 @@
"dev": true,
"requires": {}
},
- "deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true
- },
"deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -10218,23 +9932,18 @@
}
},
"dmd": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/dmd/-/dmd-6.1.0.tgz",
- "integrity": "sha512-0zQIJ873gay1scCTFZvHPWM9mVJBnaylB2NQDI8O9u8O32m00Jb6uxDKexZm8hjTRM7RiWe0FJ32pExHoXdwoQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/dmd/-/dmd-7.1.1.tgz",
+ "integrity": "sha512-Ap2HP6iuOek7eShReDLr9jluNJm9RMZESlt29H/Xs1qrVMkcS9X6m5h1mBC56WMxNiSo0wvjGICmZlYUSFjwZQ==",
"dev": true,
"requires": {
"array-back": "^6.2.2",
- "cache-point": "^2.0.0",
- "common-sequence": "^2.0.2",
- "file-set": "^4.0.2",
- "handlebars": "^4.7.7",
- "marked": "^4.0.12",
- "object-get": "^2.1.1",
- "reduce-flatten": "^3.0.1",
- "reduce-unique": "^2.0.1",
- "reduce-without": "^1.0.1",
- "test-value": "^3.0.0",
- "walk-back": "^5.1.0"
+ "cache-point": "^3.0.0",
+ "common-sequence": "^3.0.0",
+ "file-set": "^5.2.2",
+ "handlebars": "^4.7.8",
+ "marked": "^4.3.0",
+ "walk-back": "^5.1.1"
}
},
"doctrine": {
@@ -10276,9 +9985,9 @@
}
},
"entities": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
- "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"dev": true
},
"error-ex": {
@@ -10565,7 +10274,6 @@
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
- "peer": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
@@ -10579,7 +10287,6 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
- "peer": true,
"requires": {
"is-glob": "^4.0.1"
}
@@ -10634,21 +10341,13 @@
}
},
"file-set": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/file-set/-/file-set-4.0.2.tgz",
- "integrity": "sha512-fuxEgzk4L8waGXaAkd8cMr73Pm0FxOVkn8hztzUW7BAHhOGH90viQNXbiOsnecCWmfInqU6YmAMwxRMdKETceQ==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/file-set/-/file-set-5.3.0.tgz",
+ "integrity": "sha512-FKCxdjLX0J6zqTWdT0RXIxNF/n7MyXXnsSUp0syLEOCKdexvPZ02lNNv2a+gpK9E3hzUYF3+eFZe32ci7goNUg==",
"dev": true,
"requires": {
- "array-back": "^5.0.0",
- "glob": "^7.1.6"
- },
- "dependencies": {
- "array-back": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-5.0.0.tgz",
- "integrity": "sha512-kgVWwJReZWmVuWOQKEOohXKJX+nD02JAZ54D1RRWlv8L0NebauKAaFxACKzB74RTclt1+WNz5KHaLRDAPZbDEw==",
- "dev": true
- }
+ "array-back": "^6.2.2",
+ "fast-glob": "^3.3.2"
}
},
"fill-range": {
@@ -10661,21 +10360,11 @@
}
},
"find-replace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
- "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz",
+ "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==",
"dev": true,
- "requires": {
- "array-back": "^3.0.1"
- },
- "dependencies": {
- "array-back": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
- "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
- "dev": true
- }
- }
+ "requires": {}
},
"find-up": {
"version": "5.0.0",
@@ -10704,12 +10393,6 @@
"integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
"dev": true
},
- "fs-then-native": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz",
- "integrity": "sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==",
- "dev": true
- },
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -10841,13 +10524,13 @@
"dev": true
},
"handlebars": {
- "version": "4.7.7",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
- "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
"dev": true,
"requires": {
"minimist": "^1.2.5",
- "neo-async": "^2.6.0",
+ "neo-async": "^2.6.2",
"source-map": "^0.6.1",
"uglify-js": "^3.1.4",
"wordwrap": "^1.0.0"
@@ -11593,21 +11276,21 @@
}
},
"jsdoc": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz",
- "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.5.tgz",
+ "integrity": "sha512-P4C6MWP9yIlMiK8nwoZvxN84vb6MsnXcHuy7XzVOvQoCizWX5JFCBsWIIWKXBltpoRZXddUOVQmCTOZt9yDj9g==",
"dev": true,
"requires": {
"@babel/parser": "^7.20.15",
"@jsdoc/salty": "^0.2.1",
- "@types/markdown-it": "^12.2.3",
+ "@types/markdown-it": "^14.1.1",
"bluebird": "^3.7.2",
"catharsis": "^0.9.0",
"escape-string-regexp": "^2.0.0",
"js2xmlparser": "^4.0.2",
"klaw": "^3.0.0",
- "markdown-it": "^12.3.2",
- "markdown-it-anchor": "^8.4.1",
+ "markdown-it": "^14.1.0",
+ "markdown-it-anchor": "^8.6.7",
"marked": "^4.0.10",
"mkdirp": "^1.0.4",
"requizzle": "^0.2.3",
@@ -11620,66 +11303,49 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
"dev": true
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
}
}
},
"jsdoc-api": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-7.2.0.tgz",
- "integrity": "sha512-93YDnlm/OYTlLOFeNs4qAv0RBCJ0kGj67xQaWy8wrbk97Rw1EySitoOTHsTHXPEs3uyx2IStPKGrbE7LTnZXbA==",
+ "version": "9.3.5",
+ "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-9.3.5.tgz",
+ "integrity": "sha512-TQwh1jA8xtCkIbVwm/XA3vDRAa5JjydyKx1cC413Sh3WohDFxcMdwKSvn4LOsq2xWyAmOU/VnSChTQf6EF0R8g==",
"dev": true,
"requires": {
"array-back": "^6.2.2",
- "cache-point": "^2.0.0",
- "collect-all": "^1.0.4",
- "file-set": "^4.0.2",
- "fs-then-native": "^2.0.0",
- "jsdoc": "^4.0.0",
+ "cache-point": "^3.0.1",
+ "current-module-paths": "^1.1.2",
+ "file-set": "^5.3.0",
+ "jsdoc": "^4.0.4",
"object-to-spawn-args": "^2.0.1",
- "temp-path": "^1.0.0",
- "walk-back": "^5.1.0"
+ "walk-back": "^5.1.1"
}
},
"jsdoc-parse": {
- "version": "6.2.4",
- "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-6.2.4.tgz",
- "integrity": "sha512-MQA+lCe3ioZd0uGbyB3nDCDZcKgKC7m/Ivt0LgKZdUoOlMJxUWJQ3WI6GeyHp9ouznKaCjlp7CU9sw5k46yZTw==",
+ "version": "6.2.5",
+ "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-6.2.5.tgz",
+ "integrity": "sha512-8JaSNjPLr2IuEY4Das1KM6Z4oLHZYUnjRrr27hKSa78Cj0i5Lur3DzNnCkz+DfrKBDoljGMoWOiBVQbtUZJBPw==",
"dev": true,
"requires": {
"array-back": "^6.2.2",
"find-replace": "^5.0.1",
- "lodash.omit": "^4.5.0",
"sort-array": "^5.0.0"
- },
- "dependencies": {
- "find-replace": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz",
- "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==",
- "dev": true,
- "requires": {}
- }
}
},
"jsdoc-to-markdown": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-7.1.1.tgz",
- "integrity": "sha512-CI86d63xAVNO+ENumWwmJ034lYe5iGU5GwjtTA11EuphP9tpnoi4hrKgR/J8uME0D+o4KUpVfwX1fjZhc8dEtg==",
+ "version": "9.1.3",
+ "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-9.1.3.tgz",
+ "integrity": "sha512-i9wi+6WHX0WKziv0ar88T8h7OmxA0LWdQaV23nY6uQyKvdUPzVt0o6YAaOceFuKRF5Rvlju5w/KnZBfdpDAlnw==",
"dev": true,
"requires": {
"array-back": "^6.2.2",
- "command-line-tool": "^0.8.0",
+ "command-line-args": "^6.0.1",
+ "command-line-usage": "^7.0.3",
"config-master": "^3.1.0",
- "dmd": "^6.1.0",
- "jsdoc-api": "^7.1.1",
- "jsdoc-parse": "^6.1.0",
- "walk-back": "^5.1.0"
+ "dmd": "^7.1.1",
+ "jsdoc-api": "^9.3.5",
+ "jsdoc-parse": "^6.2.5",
+ "walk-back": "^5.1.1"
}
},
"jsesc": {
@@ -11765,12 +11431,12 @@
"dev": true
},
"linkify-it": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
- "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
"dev": true,
"requires": {
- "uc.micro": "^1.0.1"
+ "uc.micro": "^2.0.0"
}
},
"locate-path": {
@@ -11783,9 +11449,9 @@
}
},
"lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
"dev": true
},
"lodash.camelcase": {
@@ -11800,18 +11466,6 @@
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
- "lodash.omit": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
- "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==",
- "dev": true
- },
- "lodash.padend": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
- "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==",
- "dev": true
- },
"makeerror": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
@@ -11822,16 +11476,17 @@
}
},
"markdown-it": {
- "version": "12.3.2",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
- "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
+ "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
"dev": true,
"requires": {
"argparse": "^2.0.1",
- "entities": "~2.1.0",
- "linkify-it": "^3.0.1",
- "mdurl": "^1.0.1",
- "uc.micro": "^1.0.5"
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
},
"dependencies": {
"argparse": {
@@ -11850,15 +11505,15 @@
"requires": {}
},
"marked": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz",
- "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
"dev": true
},
"mdurl": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
"dev": true
},
"merge-stream": {
@@ -11871,8 +11526,7 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "peer": true
+ "dev": true
},
"micromatch": {
"version": "4.0.8",
@@ -11904,10 +11558,10 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
},
- "mkdirp2": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/mkdirp2/-/mkdirp2-1.0.5.tgz",
- "integrity": "sha512-xOE9xbICroUDmG1ye2h4bZ8WBie9EGmACaco8K8cx6RlkJJrxGIqjGqztAI+NMhexXBcdGbSEzI6N3EJPevxZw==",
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"dev": true
},
"ms": {
@@ -11946,12 +11600,6 @@
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
- "object-get": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.1.tgz",
- "integrity": "sha512-7n4IpLMzGGcLEMiQKsNR7vCe+N5E9LORFrtNUVy4sO3dj9a3HedZCxEL2T7QuLhcHN1NBuBsMOKaOsAYI9IIvg==",
- "dev": true
- },
"object-to-spawn-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/object-to-spawn-args/-/object-to-spawn-args-2.0.1.tgz",
@@ -12115,6 +11763,12 @@
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true
},
+ "punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "dev": true
+ },
"pure-rand": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
@@ -12142,48 +11796,6 @@
"strip-indent": "^2.0.0"
}
},
- "reduce-flatten": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-3.0.1.tgz",
- "integrity": "sha512-bYo+97BmUUOzg09XwfkwALt4PQH1M5L0wzKerBt6WLm3Fhdd43mMS89HiT1B9pJIqko/6lWx3OnV4J9f2Kqp5Q==",
- "dev": true
- },
- "reduce-unique": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/reduce-unique/-/reduce-unique-2.0.1.tgz",
- "integrity": "sha512-x4jH/8L1eyZGR785WY+ePtyMNhycl1N2XOLxhCbzZFaqF4AXjLzqSxa2UHgJ2ZVR/HHyPOvl1L7xRnW8ye5MdA==",
- "dev": true
- },
- "reduce-without": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/reduce-without/-/reduce-without-1.0.1.tgz",
- "integrity": "sha512-zQv5y/cf85sxvdrKPlfcRzlDn/OqKFThNimYmsS3flmkioKvkUGn2Qg9cJVoQiEvdxFGLE0MQER/9fZ9sUqdxg==",
- "dev": true,
- "requires": {
- "test-value": "^2.0.0"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
- "dev": true,
- "requires": {
- "typical": "^2.6.0"
- }
- },
- "test-value": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
- "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==",
- "dev": true,
- "requires": {
- "array-back": "^1.0.3",
- "typical": "^2.6.0"
- }
- }
- }
- },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -12317,14 +11929,6 @@
"requires": {
"array-back": "^6.2.2",
"typical": "^7.1.1"
- },
- "dependencies": {
- "typical": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz",
- "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==",
- "dev": true
- }
}
},
"source-map": {
@@ -12366,32 +11970,6 @@
}
}
},
- "stream-connect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz",
- "integrity": "sha512-68Kl+79cE0RGKemKkhxTSg8+6AGrqBt+cbZAXevg2iJ6Y3zX4JhA/sZeGzLpxW9cXhmqAcE7KnJCisUmIUfnFQ==",
- "dev": true,
- "requires": {
- "array-back": "^1.0.2"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
- "dev": true,
- "requires": {
- "typical": "^2.6.0"
- }
- }
- }
- },
- "stream-via": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz",
- "integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==",
- "dev": true
- },
"string-length": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
@@ -12449,27 +12027,13 @@
"dev": true
},
"table-layout": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz",
- "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz",
+ "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==",
"dev": true,
"requires": {
- "array-back": "^2.0.0",
- "deep-extend": "~0.6.0",
- "lodash.padend": "^4.6.1",
- "typical": "^2.6.1",
- "wordwrapjs": "^3.0.0"
- },
- "dependencies": {
- "array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
- "dev": true,
- "requires": {
- "typical": "^2.6.1"
- }
- }
+ "array-back": "^6.2.2",
+ "wordwrapjs": "^5.1.0"
}
},
"tapable": {
@@ -12479,33 +12043,6 @@
"dev": true,
"peer": true
},
- "temp-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz",
- "integrity": "sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==",
- "dev": true
- },
- "test-value": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
- "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
- "dev": true,
- "requires": {
- "array-back": "^2.0.0",
- "typical": "^2.6.1"
- },
- "dependencies": {
- "array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
- "dev": true,
- "requires": {
- "typical": "^2.6.1"
- }
- }
- }
- },
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -12588,28 +12125,28 @@
"peer": true
},
"typical": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
- "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==",
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz",
+ "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==",
"dev": true
},
"uc.micro": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
- "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
"dev": true
},
"uglify-js": {
- "version": "3.17.3",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.3.tgz",
- "integrity": "sha512-JmMFDME3iufZnBpyKL+uS78LRiC+mK55zWfM5f/pWBJfpOttXAqYfdDGRukYhJuyRinvPVAtUhvy7rlDybNtFg==",
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
"dev": true,
"optional": true
},
"underscore": {
- "version": "1.13.6",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
- "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
+ "version": "1.13.7",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
+ "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==",
"dev": true
},
"undici-types": {
@@ -12657,9 +12194,9 @@
}
},
"walk-back": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz",
- "integrity": "sha512-Uhxps5yZcVNbLEAnb+xaEEMdgTXl9qAQDzKYejG2AZ7qPwRQ81lozY9ECDbjLPNWm7YsO1IK5rsP1KoQzXAcGA==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.1.tgz",
+ "integrity": "sha512-e/FRLDVdZQWFrAzU6Hdvpm7D7m2ina833gIKLptQykRK49mmCYHLHq7UqjPDbxbKLZkTkW1rFqbengdE3sLfdw==",
"dev": true
},
"walker": {
@@ -12689,26 +12226,14 @@
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
"dev": true
},
"wordwrapjs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
- "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
- "dev": true,
- "requires": {
- "reduce-flatten": "^1.0.1",
- "typical": "^2.6.1"
- },
- "dependencies": {
- "reduce-flatten": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
- "integrity": "sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ==",
- "dev": true
- }
- }
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz",
+ "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==",
+ "dev": true
},
"wrappy": {
"version": "1.0.2",
diff --git a/package.json b/package.json
index 889330d..130be73 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@mapbox/cloudfriend",
- "version": "9.2.1",
+ "version": "9.3.1",
"description": "Helper functions for assembling CloudFormation templates in JavaScript",
"main": "index.js",
"engines": {
@@ -38,7 +38,7 @@
"eslint": "^8.57.0",
"eslint-plugin-node": "^6.0.1",
"jest": "^29.7.0",
- "jsdoc-to-markdown": "^7.1.1"
+ "jsdoc-to-markdown": "^9.1.3"
},
"dependencies": {
"@aws-sdk/client-cloudformation": "^3.848.0",
diff --git a/requirements.dev.txt b/requirements.dev.txt
index f76f9b7..3e6c219 100644
--- a/requirements.dev.txt
+++ b/requirements.dev.txt
@@ -1,2 +1,2 @@
-aws-sam-cli==1.142.1
-cfn-lint==1.36.1
+aws-sam-cli==1.149.0
+cfn-lint==1.41.0
diff --git a/test/fixtures/shortcuts/glue-iceberg-table-defaults.json b/test/fixtures/shortcuts/glue-iceberg-table-defaults.json
new file mode 100644
index 0000000..a454e98
--- /dev/null
+++ b/test/fixtures/shortcuts/glue-iceberg-table-defaults.json
@@ -0,0 +1,41 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Metadata": {},
+ "Parameters": {},
+ "Rules": {},
+ "Mappings": {},
+ "Conditions": {},
+ "Resources": {
+ "MyTable": {
+ "Type": "AWS::Glue::Table",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "Name": "my_table",
+ "OpenTableFormatInput": {
+ "IcebergInput": {
+ "MetadataOperation": "CREATE",
+ "Version": "2",
+ "IcebergTableInput": {
+ "Location": "s3://fake/location",
+ "Schema": {
+ "Type": "struct",
+ "Fields": [
+ {
+ "Name": "column",
+ "Type": "string",
+ "Id": 1,
+ "Required": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "Outputs": {}
+}
\ No newline at end of file
diff --git a/test/fixtures/shortcuts/glue-iceberg-table-no-defaults.json b/test/fixtures/shortcuts/glue-iceberg-table-no-defaults.json
new file mode 100644
index 0000000..ce6b1c7
--- /dev/null
+++ b/test/fixtures/shortcuts/glue-iceberg-table-no-defaults.json
@@ -0,0 +1,39 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Metadata": {},
+ "Parameters": {},
+ "Rules": {},
+ "Mappings": {},
+ "Conditions": {},
+ "Resources": {
+ "MyTable": {
+ "Type": "AWS::Glue::Table",
+ "Properties": {
+ "CatalogId": "1234",
+ "DatabaseName": "my_database",
+ "Name": "my_table",
+ "OpenTableFormatInput": {
+ "IcebergInput": {
+ "MetadataOperation": "CREATE",
+ "Version": "2",
+ "IcebergTableInput": {
+ "Location": "s3://fake/location",
+ "Schema": {
+ "Type": "struct",
+ "Fields": [
+ {
+ "Name": "column",
+ "Type": "string",
+ "Id": 1,
+ "Required": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "Outputs": {}
+}
\ No newline at end of file
diff --git a/test/fixtures/shortcuts/glue-iceberg-table-with-all-optimizers.json b/test/fixtures/shortcuts/glue-iceberg-table-with-all-optimizers.json
new file mode 100644
index 0000000..cb6eb05
--- /dev/null
+++ b/test/fixtures/shortcuts/glue-iceberg-table-with-all-optimizers.json
@@ -0,0 +1,101 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Metadata": {},
+ "Parameters": {},
+ "Rules": {},
+ "Mappings": {},
+ "Conditions": {},
+ "Resources": {
+ "MyTable": {
+ "Type": "AWS::Glue::Table",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "Name": "my_table",
+ "OpenTableFormatInput": {
+ "IcebergInput": {
+ "MetadataOperation": "CREATE",
+ "Version": "2",
+ "IcebergTableInput": {
+ "Location": "s3://fake/location",
+ "Schema": {
+ "Type": "struct",
+ "Fields": [
+ {
+ "Name": "column",
+ "Type": "string",
+ "Id": 1,
+ "Required": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "MyTableRetentionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "retention",
+ "TableOptimizerConfiguration": {
+ "RoleArn": "arn:aws:iam::123456789012:role/SharedRole",
+ "Enabled": true,
+ "RetentionConfiguration": {
+ "IcebergConfiguration": {
+ "SnapshotRetentionPeriodInDays": 5,
+ "NumberOfSnapshotsToRetain": 1,
+ "CleanExpiredFiles": true
+ }
+ }
+ }
+ }
+ },
+ "MyTableCompactionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "compaction",
+ "TableOptimizerConfiguration": {
+ "RoleArn": "arn:aws:iam::123456789012:role/SharedRole",
+ "Enabled": true
+ }
+ }
+ },
+ "MyTableOrphanFileDeletionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "orphan_file_deletion",
+ "TableOptimizerConfiguration": {
+ "RoleArn": "arn:aws:iam::123456789012:role/SharedRole",
+ "Enabled": true,
+ "OrphanFileDeletionConfiguration": {
+ "IcebergConfiguration": {
+ "OrphanFileRetentionPeriodInDays": 3
+ }
+ }
+ }
+ }
+ }
+ },
+ "Outputs": {}
+}
\ No newline at end of file
diff --git a/test/fixtures/shortcuts/glue-iceberg-table-with-both-optimizers.json b/test/fixtures/shortcuts/glue-iceberg-table-with-both-optimizers.json
new file mode 100644
index 0000000..b5c8af6
--- /dev/null
+++ b/test/fixtures/shortcuts/glue-iceberg-table-with-both-optimizers.json
@@ -0,0 +1,80 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Metadata": {},
+ "Parameters": {},
+ "Rules": {},
+ "Mappings": {},
+ "Conditions": {},
+ "Resources": {
+ "MyTable": {
+ "Type": "AWS::Glue::Table",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "Name": "my_table",
+ "OpenTableFormatInput": {
+ "IcebergInput": {
+ "MetadataOperation": "CREATE",
+ "Version": "2",
+ "IcebergTableInput": {
+ "Location": "s3://fake/location",
+ "Schema": {
+ "Type": "struct",
+ "Fields": [
+ {
+ "Name": "column",
+ "Type": "string",
+ "Id": 1,
+ "Required": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "MyTableRetentionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "retention",
+ "TableOptimizerConfiguration": {
+ "RoleArn": "arn:aws:iam::123456789012:role/RetentionRole",
+ "Enabled": true,
+ "RetentionConfiguration": {
+ "IcebergConfiguration": {
+ "SnapshotRetentionPeriodInDays": 5,
+ "NumberOfSnapshotsToRetain": 1,
+ "CleanExpiredFiles": true
+ }
+ }
+ }
+ }
+ },
+ "MyTableCompactionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "compaction",
+ "TableOptimizerConfiguration": {
+ "RoleArn": "arn:aws:iam::123456789012:role/CompactionRole",
+ "Enabled": true
+ }
+ }
+ }
+ },
+ "Outputs": {}
+}
\ No newline at end of file
diff --git a/test/fixtures/shortcuts/glue-iceberg-table-with-compaction-custom.json b/test/fixtures/shortcuts/glue-iceberg-table-with-compaction-custom.json
new file mode 100644
index 0000000..183a0c3
--- /dev/null
+++ b/test/fixtures/shortcuts/glue-iceberg-table-with-compaction-custom.json
@@ -0,0 +1,68 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Metadata": {},
+ "Parameters": {},
+ "Rules": {},
+ "Mappings": {},
+ "Conditions": {},
+ "Resources": {
+ "CompactionRole": {
+ "Type": "AWS::IAM::Role",
+ "Properties": {
+ "AssumeRolePolicyDocument": {}
+ }
+ },
+ "MyTable": {
+ "Type": "AWS::Glue::Table",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "Name": "my_table",
+ "OpenTableFormatInput": {
+ "IcebergInput": {
+ "MetadataOperation": "CREATE",
+ "Version": "2",
+ "IcebergTableInput": {
+ "Location": "s3://fake/location",
+ "Schema": {
+ "Type": "struct",
+ "Fields": [
+ {
+ "Name": "column",
+ "Type": "string",
+ "Id": 1,
+ "Required": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "MyTableCompactionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "compaction",
+ "TableOptimizerConfiguration": {
+ "RoleArn": {
+ "Fn::GetAtt": [
+ "CompactionRole",
+ "Arn"
+ ]
+ },
+ "Enabled": true
+ }
+ }
+ }
+ },
+ "Outputs": {}
+}
\ No newline at end of file
diff --git a/test/fixtures/shortcuts/glue-iceberg-table-with-compaction-defaults.json b/test/fixtures/shortcuts/glue-iceberg-table-with-compaction-defaults.json
new file mode 100644
index 0000000..eadabf9
--- /dev/null
+++ b/test/fixtures/shortcuts/glue-iceberg-table-with-compaction-defaults.json
@@ -0,0 +1,57 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Metadata": {},
+ "Parameters": {},
+ "Rules": {},
+ "Mappings": {},
+ "Conditions": {},
+ "Resources": {
+ "MyTable": {
+ "Type": "AWS::Glue::Table",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "Name": "my_table",
+ "OpenTableFormatInput": {
+ "IcebergInput": {
+ "MetadataOperation": "CREATE",
+ "Version": "2",
+ "IcebergTableInput": {
+ "Location": "s3://fake/location",
+ "Schema": {
+ "Type": "struct",
+ "Fields": [
+ {
+ "Name": "column",
+ "Type": "string",
+ "Id": 1,
+ "Required": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "MyTableCompactionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "compaction",
+ "TableOptimizerConfiguration": {
+ "RoleArn": "arn:aws:iam::123456789012:role/CompactionRole",
+ "Enabled": true
+ }
+ }
+ }
+ },
+ "Outputs": {}
+}
\ No newline at end of file
diff --git a/test/fixtures/shortcuts/glue-iceberg-table-with-optimizer-custom.json b/test/fixtures/shortcuts/glue-iceberg-table-with-optimizer-custom.json
new file mode 100644
index 0000000..66dc06b
--- /dev/null
+++ b/test/fixtures/shortcuts/glue-iceberg-table-with-optimizer-custom.json
@@ -0,0 +1,75 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Metadata": {},
+ "Parameters": {},
+ "Rules": {},
+ "Mappings": {},
+ "Conditions": {},
+ "Resources": {
+ "OptimizerRole": {
+ "Type": "AWS::IAM::Role",
+ "Properties": {
+ "AssumeRolePolicyDocument": {}
+ }
+ },
+ "MyTable": {
+ "Type": "AWS::Glue::Table",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "Name": "my_table",
+ "OpenTableFormatInput": {
+ "IcebergInput": {
+ "MetadataOperation": "CREATE",
+ "Version": "2",
+ "IcebergTableInput": {
+ "Location": "s3://fake/location",
+ "Schema": {
+ "Type": "struct",
+ "Fields": [
+ {
+ "Name": "column",
+ "Type": "string",
+ "Id": 1,
+ "Required": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "MyTableRetentionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "retention",
+ "TableOptimizerConfiguration": {
+ "RoleArn": {
+ "Fn::GetAtt": [
+ "OptimizerRole",
+ "Arn"
+ ]
+ },
+ "Enabled": true,
+ "RetentionConfiguration": {
+ "IcebergConfiguration": {
+ "SnapshotRetentionPeriodInDays": 7,
+ "NumberOfSnapshotsToRetain": 3,
+ "CleanExpiredFiles": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "Outputs": {}
+}
\ No newline at end of file
diff --git a/test/fixtures/shortcuts/glue-iceberg-table-with-optimizer-defaults.json b/test/fixtures/shortcuts/glue-iceberg-table-with-optimizer-defaults.json
new file mode 100644
index 0000000..5c0d669
--- /dev/null
+++ b/test/fixtures/shortcuts/glue-iceberg-table-with-optimizer-defaults.json
@@ -0,0 +1,64 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Metadata": {},
+ "Parameters": {},
+ "Rules": {},
+ "Mappings": {},
+ "Conditions": {},
+ "Resources": {
+ "MyTable": {
+ "Type": "AWS::Glue::Table",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "Name": "my_table",
+ "OpenTableFormatInput": {
+ "IcebergInput": {
+ "MetadataOperation": "CREATE",
+ "Version": "2",
+ "IcebergTableInput": {
+ "Location": "s3://fake/location",
+ "Schema": {
+ "Type": "struct",
+ "Fields": [
+ {
+ "Name": "column",
+ "Type": "string",
+ "Id": 1,
+ "Required": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "MyTableRetentionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "retention",
+ "TableOptimizerConfiguration": {
+ "RoleArn": "arn:aws:iam::123456789012:role/OptimizerRole",
+ "Enabled": true,
+ "RetentionConfiguration": {
+ "IcebergConfiguration": {
+ "SnapshotRetentionPeriodInDays": 5,
+ "NumberOfSnapshotsToRetain": 1,
+ "CleanExpiredFiles": true
+ }
+ }
+ }
+ }
+ }
+ },
+ "Outputs": {}
+}
\ No newline at end of file
diff --git a/test/fixtures/shortcuts/glue-iceberg-table-with-orphan-deletion-custom.json b/test/fixtures/shortcuts/glue-iceberg-table-with-orphan-deletion-custom.json
new file mode 100644
index 0000000..721859c
--- /dev/null
+++ b/test/fixtures/shortcuts/glue-iceberg-table-with-orphan-deletion-custom.json
@@ -0,0 +1,74 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Metadata": {},
+ "Parameters": {},
+ "Rules": {},
+ "Mappings": {},
+ "Conditions": {},
+ "Resources": {
+ "OrphanFileDeletionRole": {
+ "Type": "AWS::IAM::Role",
+ "Properties": {
+ "AssumeRolePolicyDocument": {}
+ }
+ },
+ "MyTable": {
+ "Type": "AWS::Glue::Table",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "Name": "my_table",
+ "OpenTableFormatInput": {
+ "IcebergInput": {
+ "MetadataOperation": "CREATE",
+ "Version": "2",
+ "IcebergTableInput": {
+ "Location": "s3://fake/location",
+ "Schema": {
+ "Type": "struct",
+ "Fields": [
+ {
+ "Name": "column",
+ "Type": "string",
+ "Id": 1,
+ "Required": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "MyTableOrphanFileDeletionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "orphan_file_deletion",
+ "TableOptimizerConfiguration": {
+ "RoleArn": {
+ "Fn::GetAtt": [
+ "OrphanFileDeletionRole",
+ "Arn"
+ ]
+ },
+ "Enabled": true,
+ "OrphanFileDeletionConfiguration": {
+ "IcebergConfiguration": {
+ "OrphanFileRetentionPeriodInDays": 7,
+ "Location": "s3://fake/location/subdir"
+ }
+ }
+ }
+ }
+ }
+ },
+ "Outputs": {}
+}
\ No newline at end of file
diff --git a/test/fixtures/shortcuts/glue-iceberg-table-with-orphan-deletion-defaults.json b/test/fixtures/shortcuts/glue-iceberg-table-with-orphan-deletion-defaults.json
new file mode 100644
index 0000000..d02f089
--- /dev/null
+++ b/test/fixtures/shortcuts/glue-iceberg-table-with-orphan-deletion-defaults.json
@@ -0,0 +1,62 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Metadata": {},
+ "Parameters": {},
+ "Rules": {},
+ "Mappings": {},
+ "Conditions": {},
+ "Resources": {
+ "MyTable": {
+ "Type": "AWS::Glue::Table",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "Name": "my_table",
+ "OpenTableFormatInput": {
+ "IcebergInput": {
+ "MetadataOperation": "CREATE",
+ "Version": "2",
+ "IcebergTableInput": {
+ "Location": "s3://fake/location",
+ "Schema": {
+ "Type": "struct",
+ "Fields": [
+ {
+ "Name": "column",
+ "Type": "string",
+ "Id": 1,
+ "Required": true
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "MyTableOrphanFileDeletionOptimizer": {
+ "Type": "AWS::Glue::TableOptimizer",
+ "DependsOn": "MyTable",
+ "Properties": {
+ "CatalogId": {
+ "Ref": "AWS::AccountId"
+ },
+ "DatabaseName": "my_database",
+ "TableName": "my_table",
+ "Type": "orphan_file_deletion",
+ "TableOptimizerConfiguration": {
+ "RoleArn": "arn:aws:iam::123456789012:role/OrphanFileDeletionRole",
+ "Enabled": true,
+ "OrphanFileDeletionConfiguration": {
+ "IcebergConfiguration": {
+ "OrphanFileRetentionPeriodInDays": 3
+ }
+ }
+ }
+ }
+ }
+ },
+ "Outputs": {}
+}
\ No newline at end of file
diff --git a/test/shortcuts.test.js b/test/shortcuts.test.js
index 09f36f6..c32b057 100644
--- a/test/shortcuts.test.js
+++ b/test/shortcuts.test.js
@@ -15,8 +15,13 @@ const noUndefined = (template) => JSON.parse(JSON.stringify(template));
describe('[shortcuts] fixture validation', () => {
// Runs cfn-lint, ignoring "warnings". Install via pip or Homebrew to run these
// tests locally.
- const cfnLint = (filepath) => new Promise((resolve, reject) => {
- cp.exec(`cfn-lint ${filepath} --ignore-checks W`, (err, stdout) => {
+ const cfnLint = (filepath, filename) => new Promise((resolve, reject) => {
+ // Ignore E3003 (missing TableInput) and E3002 (unexpected properties) for Iceberg tables only
+ // cfn-lint doesn't yet support OpenTableFormatInput (Iceberg table format)
+ const isIcebergTable = filename.includes('glue-iceberg-table');
+ const ignoreChecks = isIcebergTable ? 'W,E3003,E3002' : 'W';
+
+ cp.execFile('cfn-lint', [filepath, '--ignore-checks', ignoreChecks], (err, stdout) => {
if (err) return reject(new Error(stdout));
return resolve();
});
@@ -28,7 +33,7 @@ describe('[shortcuts] fixture validation', () => {
test.each(toValidate)('%s fixture passes validation', async (filename) => {
await Promise.all([
- cfnLint(path.join(__dirname, 'fixtures', 'shortcuts', filename)),
+ cfnLint(path.join(__dirname, 'fixtures', 'shortcuts', filename), filename),
sleep(1000)
]);
});
@@ -1246,6 +1251,292 @@ describe('[shortcuts] glue parquet table', () => {
});
});
+describe('[shortcuts] glue iceberg table', () => {
+ test('throws without options', () => {
+ expect(() => new cf.shortcuts.GlueIcebergTable()).toThrow('Options required');
+ });
+
+ test('throws without required parameters', () => {
+ expect(() => new cf.shortcuts.GlueIcebergTable({})).toThrow(/You must provide a LogicalName, Name, DatabaseName, Location, and Schema/);
+ });
+
+ test('expected resources generated with defaults', () => {
+ const db = new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location'
+ });
+
+ const template = cf.merge(db);
+ if (update) fixtures.update('glue-iceberg-table-defaults', template);
+ expect(noUndefined(template)).toEqual(fixtures.get('glue-iceberg-table-defaults'));
+ });
+
+ test('expected resources generated without defaults', () => {
+ const db = new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ CatalogId: '1234',
+ Location: 's3://fake/location',
+ IcebergVersion: '2'
+ });
+
+ const template = cf.merge(db);
+ if (update) fixtures.update('glue-iceberg-table-no-defaults', template);
+ expect(noUndefined(template)).toEqual(fixtures.get('glue-iceberg-table-no-defaults'));
+ });
+
+ test('throws when EnableOptimizer is true but OptimizerRoleArn is missing', () => {
+ expect(() => new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableOptimizer: true
+ })).toThrow(/You must provide an OptimizerRoleArn when EnableOptimizer is true/);
+ });
+
+ test('expected resources generated with optimizer using default retention settings', () => {
+ const db = new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableOptimizer: true,
+ OptimizerRoleArn: 'arn:aws:iam::123456789012:role/OptimizerRole'
+ });
+
+ const template = cf.merge(db);
+ if (update) fixtures.update('glue-iceberg-table-with-optimizer-defaults', template);
+ expect(noUndefined(template)).toEqual(fixtures.get('glue-iceberg-table-with-optimizer-defaults'));
+ });
+
+ test('expected resources generated with optimizer using custom retention settings', () => {
+ const db = new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableOptimizer: true,
+ OptimizerRoleArn: cf.getAtt('OptimizerRole', 'Arn'),
+ SnapshotRetentionPeriodInDays: 7,
+ NumberOfSnapshotsToRetain: 3,
+ CleanExpiredFiles: false
+ });
+
+ const template = cf.merge(
+ { Resources: { OptimizerRole: { Type: 'AWS::IAM::Role', Properties: { AssumeRolePolicyDocument: {} } } } },
+ db
+ );
+ if (update) fixtures.update('glue-iceberg-table-with-optimizer-custom', template);
+ expect(noUndefined(template)).toEqual(fixtures.get('glue-iceberg-table-with-optimizer-custom'));
+ });
+
+ test('throws when EnableCompaction is true but CompactionRoleArn is missing', () => {
+ expect(() => new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableCompaction: true
+ })).toThrow(/You must provide a CompactionRoleArn when EnableCompaction is true/);
+ });
+
+ test('expected resources generated with compaction using default settings', () => {
+ const db = new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableCompaction: true,
+ CompactionRoleArn: 'arn:aws:iam::123456789012:role/CompactionRole'
+ });
+
+ const template = cf.merge(db);
+ if (update) fixtures.update('glue-iceberg-table-with-compaction-defaults', template);
+ expect(noUndefined(template)).toEqual(fixtures.get('glue-iceberg-table-with-compaction-defaults'));
+ });
+
+ test('expected resources generated with compaction using custom settings', () => {
+ const db = new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableCompaction: true,
+ CompactionRoleArn: cf.getAtt('CompactionRole', 'Arn')
+ });
+
+ const template = cf.merge(
+ { Resources: { CompactionRole: { Type: 'AWS::IAM::Role', Properties: { AssumeRolePolicyDocument: {} } } } },
+ db
+ );
+ if (update) fixtures.update('glue-iceberg-table-with-compaction-custom', template);
+ expect(noUndefined(template)).toEqual(fixtures.get('glue-iceberg-table-with-compaction-custom'));
+ });
+
+ test('expected resources generated with both retention and compaction optimizers', () => {
+ const db = new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableOptimizer: true,
+ OptimizerRoleArn: 'arn:aws:iam::123456789012:role/RetentionRole',
+ EnableCompaction: true,
+ CompactionRoleArn: 'arn:aws:iam::123456789012:role/CompactionRole'
+ });
+
+ const template = cf.merge(db);
+ if (update) fixtures.update('glue-iceberg-table-with-both-optimizers', template);
+ expect(noUndefined(template)).toEqual(fixtures.get('glue-iceberg-table-with-both-optimizers'));
+ });
+
+ test('throws when EnableOrphanFileDeletion is true but OrphanFileDeletionRoleArn is missing', () => {
+ expect(() => new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableOrphanFileDeletion: true
+ })).toThrow(/You must provide an OrphanFileDeletionRoleArn when EnableOrphanFileDeletion is true/);
+ });
+
+ test('expected resources generated with orphan file deletion using default settings', () => {
+ const db = new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableOrphanFileDeletion: true,
+ OrphanFileDeletionRoleArn: 'arn:aws:iam::123456789012:role/OrphanFileDeletionRole'
+ });
+
+ const template = cf.merge(db);
+ if (update) fixtures.update('glue-iceberg-table-with-orphan-deletion-defaults', template);
+ expect(noUndefined(template)).toEqual(fixtures.get('glue-iceberg-table-with-orphan-deletion-defaults'));
+ });
+
+ test('expected resources generated with orphan file deletion using custom settings', () => {
+ const db = new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableOrphanFileDeletion: true,
+ OrphanFileDeletionRoleArn: cf.getAtt('OrphanFileDeletionRole', 'Arn'),
+ OrphanFileRetentionPeriodInDays: 7,
+ OrphanFileDeletionLocation: 's3://fake/location/subdir'
+ });
+
+ const template = cf.merge(
+ { Resources: { OrphanFileDeletionRole: { Type: 'AWS::IAM::Role', Properties: { AssumeRolePolicyDocument: {} } } } },
+ db
+ );
+ if (update) fixtures.update('glue-iceberg-table-with-orphan-deletion-custom', template);
+ expect(noUndefined(template)).toEqual(fixtures.get('glue-iceberg-table-with-orphan-deletion-custom'));
+ });
+
+ test('expected resources generated with all three optimizers using same role', () => {
+ const db = new cf.shortcuts.GlueIcebergTable({
+ LogicalName: 'MyTable',
+ DatabaseName: 'my_database',
+ Name: 'my_table',
+ Schema: {
+ Type: 'struct',
+ Fields: [
+ { Name: 'column', Type: 'string', Id: 1, Required: true }
+ ]
+ },
+ Location: 's3://fake/location',
+ EnableOptimizer: true,
+ OptimizerRoleArn: 'arn:aws:iam::123456789012:role/SharedRole',
+ EnableCompaction: true,
+ CompactionRoleArn: 'arn:aws:iam::123456789012:role/SharedRole',
+ EnableOrphanFileDeletion: true,
+ OrphanFileDeletionRoleArn: 'arn:aws:iam::123456789012:role/SharedRole'
+ });
+
+ const template = cf.merge(db);
+ if (update) fixtures.update('glue-iceberg-table-with-all-optimizers', template);
+ expect(noUndefined(template)).toEqual(fixtures.get('glue-iceberg-table-with-all-optimizers'));
+ });
+});
+
describe('[shortcuts] glue view', () => {
test('throws without options', () => {
expect(() => new cf.shortcuts.GluePrestoView()).toThrow('Options required');