@quadnix/octo 0.0.30 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +117 -8
- package/dist/app.type.d.ts +277 -19
- package/dist/app.type.js +80 -9
- package/dist/app.type.js.map +1 -1
- package/dist/decorators/action.decorator.d.ts +10 -6
- package/dist/decorators/action.decorator.js +19 -6
- package/dist/decorators/action.decorator.js.map +1 -1
- package/dist/decorators/anchor.decorator.d.ts +12 -5
- package/dist/decorators/anchor.decorator.js +12 -5
- package/dist/decorators/anchor.decorator.js.map +1 -1
- package/dist/decorators/enable-hook.decorator.d.ts +1 -1
- package/dist/decorators/enable-hook.decorator.js +1 -1
- package/dist/decorators/factory.decorator.d.ts +18 -34
- package/dist/decorators/factory.decorator.js +18 -34
- package/dist/decorators/factory.decorator.js.map +1 -1
- package/dist/decorators/model.decorator.d.ts +4 -6
- package/dist/decorators/model.decorator.js +2 -7
- package/dist/decorators/model.decorator.js.map +1 -1
- package/dist/decorators/module.decorator.d.ts +16 -10
- package/dist/decorators/module.decorator.js +16 -10
- package/dist/decorators/module.decorator.js.map +1 -1
- package/dist/decorators/on-event.decorator.d.ts +7 -2
- package/dist/decorators/on-event.decorator.js +5 -0
- package/dist/decorators/on-event.decorator.js.map +1 -1
- package/dist/decorators/resource.decorator.d.ts +50 -1
- package/dist/decorators/resource.decorator.js +38 -1
- package/dist/decorators/resource.decorator.js.map +1 -1
- package/dist/decorators/validate.decorator.d.ts +15 -1
- package/dist/decorators/validate.decorator.js +15 -1
- package/dist/decorators/validate.decorator.js.map +1 -1
- package/dist/errors/container.error.d.ts +18 -0
- package/dist/errors/container.error.js +18 -0
- package/dist/errors/container.error.js.map +1 -1
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.js +1 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/module.error.d.ts +6 -0
- package/dist/errors/module.error.js +6 -0
- package/dist/errors/module.error.js.map +1 -1
- package/dist/errors/node.error.d.ts +56 -0
- package/dist/errors/node.error.js +56 -0
- package/dist/errors/node.error.js.map +1 -1
- package/dist/errors/schema.error.d.ts +14 -1
- package/dist/errors/schema.error.js +11 -1
- package/dist/errors/schema.error.js.map +1 -1
- package/dist/errors/terraform.error.d.ts +20 -0
- package/dist/errors/terraform.error.js +24 -0
- package/dist/errors/terraform.error.js.map +1 -0
- package/dist/errors/transaction.error.d.ts +93 -2
- package/dist/errors/transaction.error.js +83 -0
- package/dist/errors/transaction.error.js.map +1 -1
- package/dist/events/action.event.d.ts +8 -4
- package/dist/events/action.event.js +2 -4
- package/dist/events/action.event.js.map +1 -1
- package/dist/events/command.event.d.ts +43 -0
- package/dist/events/command.event.js +33 -0
- package/dist/events/command.event.js.map +1 -0
- package/dist/events/event.model.d.ts +26 -8
- package/dist/events/event.model.js +15 -7
- package/dist/events/event.model.js.map +1 -1
- package/dist/events/hook/commit.hook.event.d.ts +1 -7
- package/dist/events/hook/commit.hook.event.js +0 -6
- package/dist/events/hook/commit.hook.event.js.map +1 -1
- package/dist/events/hook/hook.event.d.ts +1 -3
- package/dist/events/hook/hook.event.js +0 -2
- package/dist/events/hook/hook.event.js.map +1 -1
- package/dist/events/hook/model.hook.event.d.ts +1 -7
- package/dist/events/hook/model.hook.event.js +0 -6
- package/dist/events/hook/model.hook.event.js.map +1 -1
- package/dist/events/hook/resource.hook.event.d.ts +1 -7
- package/dist/events/hook/resource.hook.event.js +0 -6
- package/dist/events/hook/resource.hook.event.js.map +1 -1
- package/dist/events/index.d.ts +5 -0
- package/dist/events/index.js +5 -0
- package/dist/events/index.js.map +1 -1
- package/dist/events/mode-result.event.d.ts +57 -0
- package/dist/events/mode-result.event.js +24 -0
- package/dist/events/mode-result.event.js.map +1 -0
- package/dist/events/mode.event.d.ts +61 -0
- package/dist/events/mode.event.js +32 -0
- package/dist/events/mode.event.js.map +1 -0
- package/dist/events/module.event.d.ts +7 -5
- package/dist/events/module.event.js +3 -4
- package/dist/events/module.event.js.map +1 -1
- package/dist/events/registration.event.d.ts +19 -15
- package/dist/events/registration.event.js +18 -14
- package/dist/events/registration.event.js.map +1 -1
- package/dist/events/serialization.event.d.ts +16 -13
- package/dist/events/serialization.event.js +15 -12
- package/dist/events/serialization.event.js.map +1 -1
- package/dist/events/state.event.d.ts +102 -0
- package/dist/events/state.event.js +69 -0
- package/dist/events/state.event.js.map +1 -0
- package/dist/events/terraform.event.d.ts +78 -0
- package/dist/events/terraform.event.js +55 -0
- package/dist/events/terraform.event.js.map +1 -0
- package/dist/events/transaction.event.d.ts +3 -40
- package/dist/events/transaction.event.js +1 -29
- package/dist/events/transaction.event.js.map +1 -1
- package/dist/functions/container/container.d.ts +54 -13
- package/dist/functions/container/container.js +64 -19
- package/dist/functions/container/container.js.map +1 -1
- package/dist/functions/container/test-container.d.ts +43 -29
- package/dist/functions/container/test-container.js +71 -43
- package/dist/functions/container/test-container.js.map +1 -1
- package/dist/functions/dependency/dependency.d.ts +84 -23
- package/dist/functions/dependency/dependency.js +84 -14
- package/dist/functions/dependency/dependency.js.map +1 -1
- package/dist/functions/diff/aggregate-resource-actions.d.ts +19 -0
- package/dist/functions/diff/aggregate-resource-actions.js +41 -0
- package/dist/functions/diff/aggregate-resource-actions.js.map +1 -0
- package/dist/functions/diff/diff-metadata.d.ts +21 -3
- package/dist/functions/diff/diff-metadata.js +18 -0
- package/dist/functions/diff/diff-metadata.js.map +1 -1
- package/dist/functions/diff/diff.d.ts +68 -7
- package/dist/functions/diff/diff.js +44 -3
- package/dist/functions/diff/diff.js.map +1 -1
- package/dist/functions/hook/commit.hook.d.ts +16 -1
- package/dist/functions/hook/commit.hook.js +21 -6
- package/dist/functions/hook/commit.hook.js.map +1 -1
- package/dist/functions/hook/model-action.hook.d.ts +16 -1
- package/dist/functions/hook/model-action.hook.js +21 -6
- package/dist/functions/hook/model-action.hook.js.map +1 -1
- package/dist/functions/hook/resource-action.hook.d.ts +16 -1
- package/dist/functions/hook/resource-action.hook.js +21 -6
- package/dist/functions/hook/resource-action.hook.js.map +1 -1
- package/dist/functions/node/node-action.abstract.d.ts +23 -2
- package/dist/functions/node/node-action.abstract.js +22 -8
- package/dist/functions/node/node-action.abstract.js.map +1 -1
- package/dist/functions/node/node.abstract.d.ts +56 -5
- package/dist/functions/node/node.abstract.js +106 -22
- package/dist/functions/node/node.abstract.js.map +1 -1
- package/dist/functions/node/node.interface.d.ts +3 -1
- package/dist/functions/schema/schema.d.ts +7 -0
- package/dist/functions/schema/schema.js +10 -1
- package/dist/functions/schema/schema.js.map +1 -1
- package/dist/index.d.ts +12 -6
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/dist/index.type.d.ts +5 -0
- package/dist/index.type.js +2 -0
- package/dist/index.type.js.map +1 -0
- package/dist/main.d.ts +245 -14
- package/dist/main.js +377 -72
- package/dist/main.js.map +1 -1
- package/dist/models/account/account.model.d.ts +43 -7
- package/dist/models/account/account.model.js +56 -8
- package/dist/models/account/account.model.js.map +1 -1
- package/dist/models/account/account.schema.d.ts +13 -1
- package/dist/models/account/account.schema.js +12 -0
- package/dist/models/account/account.schema.js.map +1 -1
- package/dist/models/app/app.model.d.ts +13 -8
- package/dist/models/app/app.model.js +17 -32
- package/dist/models/app/app.model.js.map +1 -1
- package/dist/models/app/app.schema.d.ts +6 -0
- package/dist/models/app/app.schema.js +6 -0
- package/dist/models/app/app.schema.js.map +1 -1
- package/dist/models/deployment/deployment.model.d.ts +13 -1
- package/dist/models/deployment/deployment.model.js +16 -4
- package/dist/models/deployment/deployment.model.js.map +1 -1
- package/dist/models/deployment/deployment.schema.d.ts +6 -0
- package/dist/models/deployment/deployment.schema.js +6 -0
- package/dist/models/deployment/deployment.schema.js.map +1 -1
- package/dist/models/environment/environment.model.d.ts +15 -3
- package/dist/models/environment/environment.model.js +22 -10
- package/dist/models/environment/environment.model.js.map +1 -1
- package/dist/models/environment/environment.schema.d.ts +2 -0
- package/dist/models/environment/environment.schema.js +2 -0
- package/dist/models/environment/environment.schema.js.map +1 -1
- package/dist/models/execution/execution.model.d.ts +21 -3
- package/dist/models/execution/execution.model.js +47 -29
- package/dist/models/execution/execution.model.js.map +1 -1
- package/dist/models/execution/execution.schema.d.ts +11 -0
- package/dist/models/execution/execution.schema.js +11 -0
- package/dist/models/execution/execution.schema.js.map +1 -1
- package/dist/models/filesystem/filesystem.model.d.ts +27 -1
- package/dist/models/filesystem/filesystem.model.js +30 -4
- package/dist/models/filesystem/filesystem.model.js.map +1 -1
- package/dist/models/filesystem/filesystem.schema.d.ts +5 -0
- package/dist/models/filesystem/filesystem.schema.js +5 -0
- package/dist/models/filesystem/filesystem.schema.js.map +1 -1
- package/dist/models/image/image.model.d.ts +19 -5
- package/dist/models/image/image.model.js +25 -11
- package/dist/models/image/image.model.js.map +1 -1
- package/dist/models/image/image.schema.d.ts +8 -0
- package/dist/models/image/image.schema.js +8 -0
- package/dist/models/image/image.schema.js.map +1 -1
- package/dist/models/model-action.interface.d.ts +17 -4
- package/dist/models/model.abstract.d.ts +96 -1
- package/dist/models/model.abstract.js +107 -8
- package/dist/models/model.abstract.js.map +1 -1
- package/dist/models/model.interface.d.ts +3 -0
- package/dist/models/pipeline/pipeline.model.d.ts +14 -2
- package/dist/models/pipeline/pipeline.model.js +19 -7
- package/dist/models/pipeline/pipeline.model.js.map +1 -1
- package/dist/models/pipeline/pipeline.schema.d.ts +8 -0
- package/dist/models/pipeline/pipeline.schema.js +8 -0
- package/dist/models/pipeline/pipeline.schema.js.map +1 -1
- package/dist/models/region/region.model.d.ts +16 -1
- package/dist/models/region/region.model.js +19 -4
- package/dist/models/region/region.model.js.map +1 -1
- package/dist/models/region/region.schema.d.ts +6 -0
- package/dist/models/region/region.schema.js +6 -0
- package/dist/models/region/region.schema.js.map +1 -1
- package/dist/models/server/server.model.d.ts +15 -3
- package/dist/models/server/server.model.js +18 -6
- package/dist/models/server/server.model.js.map +1 -1
- package/dist/models/server/server.schema.d.ts +3 -1
- package/dist/models/server/server.schema.js +3 -1
- package/dist/models/server/server.schema.js.map +1 -1
- package/dist/models/service/service.model.d.ts +37 -6
- package/dist/models/service/service.model.js +65 -11
- package/dist/models/service/service.model.js.map +1 -1
- package/dist/models/service/service.schema.d.ts +48 -1
- package/dist/models/service/service.schema.js +56 -1
- package/dist/models/service/service.schema.js.map +1 -1
- package/dist/models/subnet/subnet.model.d.ts +27 -3
- package/dist/models/subnet/subnet.model.js +40 -16
- package/dist/models/subnet/subnet.model.js.map +1 -1
- package/dist/models/subnet/subnet.schema.d.ts +9 -0
- package/dist/models/subnet/subnet.schema.js +9 -0
- package/dist/models/subnet/subnet.schema.js.map +1 -1
- package/dist/modes/apply-transaction.d.ts +23 -0
- package/dist/modes/apply-transaction.js +25 -0
- package/dist/modes/apply-transaction.js.map +1 -0
- package/dist/modes/commit.mode.d.ts +54 -0
- package/dist/modes/commit.mode.js +235 -0
- package/dist/modes/commit.mode.js.map +1 -0
- package/dist/modes/generate.mode.d.ts +30 -0
- package/dist/modes/generate.mode.js +50 -0
- package/dist/modes/generate.mode.js.map +1 -0
- package/dist/modes/run-action.mode.d.ts +30 -0
- package/dist/modes/run-action.mode.js +140 -0
- package/dist/modes/run-action.mode.js.map +1 -0
- package/dist/modes/validate.mode.d.ts +186 -0
- package/dist/modes/validate.mode.js +558 -0
- package/dist/modes/validate.mode.js.map +1 -0
- package/dist/modules/module.abstract.d.ts +51 -0
- package/dist/modules/module.abstract.js +36 -0
- package/dist/modules/module.abstract.js.map +1 -1
- package/dist/modules/module.container.d.ts +43 -1
- package/dist/modules/module.container.js +77 -5
- package/dist/modules/module.container.js.map +1 -1
- package/dist/modules/test-module.container.d.ts +139 -25
- package/dist/modules/test-module.container.js +383 -199
- package/dist/modules/test-module.container.js.map +1 -1
- package/dist/overlays/anchor.abstract.d.ts +32 -1
- package/dist/overlays/anchor.abstract.js +42 -11
- package/dist/overlays/anchor.abstract.js.map +1 -1
- package/dist/overlays/anchor.schema.d.ts +21 -0
- package/dist/overlays/anchor.schema.js +21 -0
- package/dist/overlays/anchor.schema.js.map +1 -1
- package/dist/overlays/overlay-data.repository.d.ts +18 -0
- package/dist/overlays/overlay-data.repository.js +18 -0
- package/dist/overlays/overlay-data.repository.js.map +1 -1
- package/dist/overlays/overlay.abstract.d.ts +56 -1
- package/dist/overlays/overlay.abstract.js +79 -20
- package/dist/overlays/overlay.abstract.js.map +1 -1
- package/dist/overlays/overlay.schema.d.ts +20 -0
- package/dist/overlays/overlay.schema.js +20 -0
- package/dist/overlays/overlay.schema.js.map +1 -1
- package/dist/resources/resource-action.interface.d.ts +29 -3
- package/dist/resources/resource-data.repository.d.ts +63 -1
- package/dist/resources/resource-data.repository.js +94 -4
- package/dist/resources/resource-data.repository.js.map +1 -1
- package/dist/resources/resource.abstract.d.ts +163 -6
- package/dist/resources/resource.abstract.js +223 -59
- package/dist/resources/resource.abstract.js.map +1 -1
- package/dist/resources/resource.interface.d.ts +0 -2
- package/dist/resources/resource.schema.d.ts +39 -1
- package/dist/resources/resource.schema.js +38 -0
- package/dist/resources/resource.schema.js.map +1 -1
- package/dist/resources/terraform-resource.abstract.d.ts +44 -0
- package/dist/resources/terraform-resource.abstract.js +45 -0
- package/dist/resources/terraform-resource.abstract.js.map +1 -0
- package/dist/services/event/event.service.d.ts +32 -5
- package/dist/services/event/event.service.js +58 -16
- package/dist/services/event/event.service.js.map +1 -1
- package/dist/services/input/input.service.d.ts +82 -5
- package/dist/services/input/input.service.js +143 -12
- package/dist/services/input/input.service.js.map +1 -1
- package/dist/services/schema-translation/schema-translation.service.d.ts +9 -0
- package/dist/services/schema-translation/schema-translation.service.js +9 -0
- package/dist/services/schema-translation/schema-translation.service.js.map +1 -1
- package/dist/services/serialization/model/model-serialization.service.d.ts +25 -3
- package/dist/services/serialization/model/model-serialization.service.js +113 -62
- package/dist/services/serialization/model/model-serialization.service.js.map +1 -1
- package/dist/services/serialization/resource/resource-serialization.service.d.ts +36 -6
- package/dist/services/serialization/resource/resource-serialization.service.js +77 -28
- package/dist/services/serialization/resource/resource-serialization.service.js.map +1 -1
- package/dist/services/state-management/local.state-provider.d.ts +67 -4
- package/dist/services/state-management/local.state-provider.js +168 -41
- package/dist/services/state-management/local.state-provider.js.map +1 -1
- package/dist/services/state-management/remote.state-provider.d.ts +216 -0
- package/dist/services/state-management/remote.state-provider.js +645 -0
- package/dist/services/state-management/remote.state-provider.js.map +1 -0
- package/dist/services/state-management/state-management.service.d.ts +195 -17
- package/dist/services/state-management/state-management.service.js +259 -10
- package/dist/services/state-management/state-management.service.js.map +1 -1
- package/dist/services/state-management/state-provider.interface.d.ts +98 -3
- package/dist/services/state-management/state-provider.interface.js +14 -1
- package/dist/services/state-management/state-provider.interface.js.map +1 -1
- package/dist/services/state-management/terraform-state.service.d.ts +99 -0
- package/dist/services/state-management/terraform-state.service.js +197 -0
- package/dist/services/state-management/terraform-state.service.js.map +1 -0
- package/dist/services/state-management/test.state-provider.d.ts +42 -4
- package/dist/services/state-management/test.state-provider.js +77 -25
- package/dist/services/state-management/test.state-provider.js.map +1 -1
- package/dist/services/terraform/terraform.service.d.ts +480 -0
- package/dist/services/terraform/terraform.service.js +1082 -0
- package/dist/services/terraform/terraform.service.js.map +1 -0
- package/dist/services/terraform/terraform.type.d.ts +387 -0
- package/dist/services/terraform/terraform.type.js +579 -0
- package/dist/services/terraform/terraform.type.js.map +1 -0
- package/dist/services/transaction/transaction.service.d.ts +110 -10
- package/dist/services/transaction/transaction.service.js +570 -251
- package/dist/services/transaction/transaction.service.js.map +1 -1
- package/dist/services/validation/validation.service.d.ts +15 -3
- package/dist/services/validation/validation.service.js +12 -0
- package/dist/services/validation/validation.service.js.map +1 -1
- package/dist/utilities/array/array.utility.d.ts +3 -0
- package/dist/utilities/array/array.utility.js +3 -0
- package/dist/utilities/array/array.utility.js.map +1 -1
- package/dist/{functions → utilities}/diff/diff.utility.d.ts +19 -3
- package/dist/{functions → utilities}/diff/diff.utility.js +57 -41
- package/dist/utilities/diff/diff.utility.js.map +1 -0
- package/dist/utilities/file/file.utility.d.ts +16 -2
- package/dist/utilities/file/file.utility.js +23 -61
- package/dist/utilities/file/file.utility.js.map +1 -1
- package/dist/utilities/hcl/hcl.utility.d.ts +128 -0
- package/dist/utilities/hcl/hcl.utility.js +402 -0
- package/dist/utilities/hcl/hcl.utility.js.map +1 -0
- package/dist/utilities/http/http.utility.d.ts +57 -0
- package/dist/utilities/http/http.utility.js +98 -0
- package/dist/utilities/http/http.utility.js.map +1 -0
- package/dist/utilities/node/node.utility.d.ts +3 -0
- package/dist/utilities/node/node.utility.js +3 -0
- package/dist/utilities/node/node.utility.js.map +1 -1
- package/dist/utilities/object/object.utility.d.ts +12 -0
- package/dist/utilities/object/object.utility.js +12 -0
- package/dist/utilities/object/object.utility.js.map +1 -1
- package/dist/utilities/project/project.utility.d.ts +28 -0
- package/dist/utilities/project/project.utility.js +35 -0
- package/dist/utilities/project/project.utility.js.map +1 -0
- package/dist/utilities/string/string.utility.d.ts +41 -0
- package/dist/utilities/string/string.utility.js +65 -0
- package/dist/utilities/string/string.utility.js.map +1 -0
- package/dist/utilities/terraform/terraform.utility.d.ts +276 -0
- package/dist/utilities/terraform/terraform.utility.js +623 -0
- package/dist/utilities/terraform/terraform.utility.js.map +1 -0
- package/dist/utilities/test-helpers/test-classes.d.ts +36 -30
- package/dist/utilities/test-helpers/test-classes.js +38 -39
- package/dist/utilities/test-helpers/test-classes.js.map +1 -1
- package/dist/utilities/test-helpers/test-models.d.ts +8 -1
- package/dist/utilities/test-helpers/test-models.js +37 -12
- package/dist/utilities/test-helpers/test-models.js.map +1 -1
- package/dist/utilities/test-helpers/test-modes.d.ts +315 -0
- package/dist/utilities/test-helpers/test-modes.js +486 -0
- package/dist/utilities/test-helpers/test-modes.js.map +1 -0
- package/dist/utilities/test-helpers/test-modules.d.ts +47 -0
- package/dist/utilities/test-helpers/test-modules.js +85 -0
- package/dist/utilities/test-helpers/test-modules.js.map +1 -0
- package/dist/utilities/test-helpers/test-overlays.d.ts +20 -2
- package/dist/utilities/test-helpers/test-overlays.js +56 -6
- package/dist/utilities/test-helpers/test-overlays.js.map +1 -1
- package/dist/utilities/test-helpers/test-resources.d.ts +23 -3
- package/dist/utilities/test-helpers/test-resources.js +83 -23
- package/dist/utilities/test-helpers/test-resources.js.map +1 -1
- package/dist/utilities/validation/validation.utility.d.ts +24 -0
- package/dist/utilities/validation/validation.utility.js +24 -0
- package/dist/utilities/validation/validation.utility.js.map +1 -1
- package/package.json +12 -6
- package/dist/functions/diff/diff.utility.js.map +0 -1
- package/dist/services/capture/capture.service.d.ts +0 -19
- package/dist/services/capture/capture.service.js +0 -43
- package/dist/services/capture/capture.service.js.map +0 -1
- package/dist/services/state-management/local-encryption.state-provider.d.ts +0 -20
- package/dist/services/state-management/local-encryption.state-provider.js +0 -90
- package/dist/services/state-management/local-encryption.state-provider.js.map +0 -1
- package/dist/utilities/cidr/cidr.utility.d.ts +0 -10
- package/dist/utilities/cidr/cidr.utility.js +0 -51
- package/dist/utilities/cidr/cidr.utility.js.map +0 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { TerraformService } from '../../services/terraform/terraform.service.js';
|
|
2
|
+
/**
|
|
3
|
+
* One parsed HCL block: each attribute by name, and each nested block by its type. An attribute holding
|
|
4
|
+
* a quoted string is unquoted; any other value (a number, a list, a reference, a `jsonencode(...)` call)
|
|
5
|
+
* is kept as the HCL text it was rendered as. A nested block repeated in its parent (two `ingress`
|
|
6
|
+
* blocks) is an array.
|
|
7
|
+
*
|
|
8
|
+
* @group Utilities/Hcl
|
|
9
|
+
*/
|
|
10
|
+
export type HclBlock = {
|
|
11
|
+
[key: string]: string | HclBlock | HclBlock[];
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Reads, serializes and diffs the terraform octo renders.
|
|
15
|
+
*
|
|
16
|
+
* The render format is octo-owned and regular: `# <moduleId>/<file>` section headers, and top-level
|
|
17
|
+
* blocks that start on a line with no indent. So everything here is plain string work, needing no external
|
|
18
|
+
* HCL parser or diff library. {@link parse} reads the blocks a module test asserts on,
|
|
19
|
+
* {@link serialize} flattens a render into one string, {@link unifiedDiff} is the generic line-diff
|
|
20
|
+
* engine, and {@link diffBlocks} layers octo's block structure on top of it.
|
|
21
|
+
*
|
|
22
|
+
* @group Utilities/Hcl
|
|
23
|
+
*/
|
|
24
|
+
export declare class HclUtility {
|
|
25
|
+
/**
|
|
26
|
+
* The `# <moduleId>/<file>` line {@link serialize} puts before each file.
|
|
27
|
+
*
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
private static readonly SECTION_HEADER;
|
|
31
|
+
/**
|
|
32
|
+
* Diffs two {@link serialize} renders at the block level. A block is identified by its header line,
|
|
33
|
+
* and blocks sharing a header (one `provider "aws"` per alias) by their first body line too, so a
|
|
34
|
+
* body change reads as `~` (a line-level {@link unifiedDiff} of what changed inside the block),
|
|
35
|
+
* not as an unrelated add + remove. An added block shows its full new body, a removed block its full
|
|
36
|
+
* old body — symmetric, with nothing trimmed away. The `+`/`-`/`~` vocabulary mirrors the
|
|
37
|
+
* `digestDiffs` digest, tagged with `moduleId/file`. Returns `'<no changes>'` when nothing moved.
|
|
38
|
+
*/
|
|
39
|
+
static diffBlocks(previous: string, current: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Reads the `resource` and `data` blocks of rendered terraform, keyed by their terraform address:
|
|
42
|
+
* `<type>.<name>` for a resource, `data.<type>.<name>` for a data source. It takes one file's text or
|
|
43
|
+
* a whole {@link serialize} render, such as the `hclRender` a module test gets back, since resource
|
|
44
|
+
* and data addresses are unique across an app.
|
|
45
|
+
*
|
|
46
|
+
* It reads octo's own render format, not arbitrary HCL: one attribute or block per line, and a value
|
|
47
|
+
* spanning lines only inside brackets.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* const { resource } = HclUtility.parse(hclRender);
|
|
52
|
+
* expect(Object.keys(resource)).toContain('aws_vpc.vpc-region-475bfa');
|
|
53
|
+
* expect(resource['aws_vpc.vpc-region-475bfa'].cidr_block).toBe('10.0.0.0/16');
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
static parse(hcl: string): {
|
|
57
|
+
data: Record<string, HclBlock>;
|
|
58
|
+
resource: Record<string, HclBlock>;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Flattens the rendered terragrunt folders into one snapshot-friendly string: folders sorted by
|
|
62
|
+
* module id, files in a stable order, each prefixed with a `# <moduleId>/<file>` header. An empty
|
|
63
|
+
* file shows a `<empty>` body, so the file is still visible in the snapshot rather than omitted.
|
|
64
|
+
*/
|
|
65
|
+
static serialize(moduleFiles: ReturnType<TerraformService['renderAllModules']>): string;
|
|
66
|
+
/**
|
|
67
|
+
* Produces a git-style unified line diff of two multi-line strings, collapsing unchanged regions
|
|
68
|
+
* to at most `contextLines` of surrounding context per change and emitting `@@ -a,c +b,c @@` hunk
|
|
69
|
+
* headers. Changed lines are tagged `- ` (only in `before`) and `+ ` (only in `after`); context
|
|
70
|
+
* lines are tagged with two spaces, so the markers line up. Pure plain text, no ANSI color, so it
|
|
71
|
+
* is safe to embed in a snapshot.
|
|
72
|
+
*
|
|
73
|
+
* Returns an empty string when the two inputs are identical.
|
|
74
|
+
*/
|
|
75
|
+
static unifiedDiff(before: string, after: string, { contextLines }?: {
|
|
76
|
+
contextLines?: number;
|
|
77
|
+
}): string;
|
|
78
|
+
/**
|
|
79
|
+
* How many brackets a line opens, less how many it closes, ignoring those inside quoted strings.
|
|
80
|
+
*
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
83
|
+
private static bracketDepth;
|
|
84
|
+
/**
|
|
85
|
+
* Builds the shortest edit script between two line arrays via the classic longest-common-subsequence
|
|
86
|
+
* DP. Quadratic in the number of lines, which is fine for the small blocks this serves. A removal is
|
|
87
|
+
* preferred over an addition on ties so a changed line reads as `-old` then `+new`.
|
|
88
|
+
*
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
private static diffLines;
|
|
92
|
+
/**
|
|
93
|
+
* Keys blocks by their header line (e.g. `resource "aws_vpc" "vpc-x" {`), adding the first body line
|
|
94
|
+
* for a header in `repeatedHeaders`, and an occurrence number for any key still taken.
|
|
95
|
+
*
|
|
96
|
+
* @internal
|
|
97
|
+
*/
|
|
98
|
+
private static keyBlocks;
|
|
99
|
+
/**
|
|
100
|
+
* Splits a {@link serialize} render into its top-level blocks, grouped by `moduleId/file`. Relies on
|
|
101
|
+
* octo's regular render format — `# <moduleId>/<file>` section headers, and a top-level block
|
|
102
|
+
* starting on a line with no indent that is not a closing bracket.
|
|
103
|
+
*
|
|
104
|
+
* @internal
|
|
105
|
+
*/
|
|
106
|
+
private static parseBlocks;
|
|
107
|
+
/**
|
|
108
|
+
* Parses the lines inside a block. An attribute whose value opens more brackets than it closes runs
|
|
109
|
+
* on to the line that closes them, and is kept as text; `key = {` on its own is an object, parsed
|
|
110
|
+
* like a nested block.
|
|
111
|
+
*
|
|
112
|
+
* @internal
|
|
113
|
+
*/
|
|
114
|
+
private static parseBody;
|
|
115
|
+
/**
|
|
116
|
+
* Returns the header lines that more than one of these blocks starts with.
|
|
117
|
+
*
|
|
118
|
+
* @internal
|
|
119
|
+
*/
|
|
120
|
+
private static repeatedHeaders;
|
|
121
|
+
/**
|
|
122
|
+
* Splits lines into top-level blocks, each trimmed. A block starts on a line with no indent that is not a
|
|
123
|
+
* closing bracket, so a blank line inside a block does not end it.
|
|
124
|
+
*
|
|
125
|
+
* @internal
|
|
126
|
+
*/
|
|
127
|
+
private static splitTopLevelBlocks;
|
|
128
|
+
}
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads, serializes and diffs the terraform octo renders.
|
|
3
|
+
*
|
|
4
|
+
* The render format is octo-owned and regular: `# <moduleId>/<file>` section headers, and top-level
|
|
5
|
+
* blocks that start on a line with no indent. So everything here is plain string work, needing no external
|
|
6
|
+
* HCL parser or diff library. {@link parse} reads the blocks a module test asserts on,
|
|
7
|
+
* {@link serialize} flattens a render into one string, {@link unifiedDiff} is the generic line-diff
|
|
8
|
+
* engine, and {@link diffBlocks} layers octo's block structure on top of it.
|
|
9
|
+
*
|
|
10
|
+
* @group Utilities/Hcl
|
|
11
|
+
*/
|
|
12
|
+
export class HclUtility {
|
|
13
|
+
/**
|
|
14
|
+
* The `# <moduleId>/<file>` line {@link serialize} puts before each file.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
static { this.SECTION_HEADER = /^# (.+\/.+\.(?:tf|hcl))$/; }
|
|
19
|
+
/**
|
|
20
|
+
* Diffs two {@link serialize} renders at the block level. A block is identified by its header line,
|
|
21
|
+
* and blocks sharing a header (one `provider "aws"` per alias) by their first body line too, so a
|
|
22
|
+
* body change reads as `~` (a line-level {@link unifiedDiff} of what changed inside the block),
|
|
23
|
+
* not as an unrelated add + remove. An added block shows its full new body, a removed block its full
|
|
24
|
+
* old body — symmetric, with nothing trimmed away. The `+`/`-`/`~` vocabulary mirrors the
|
|
25
|
+
* `digestDiffs` digest, tagged with `moduleId/file`. Returns `'<no changes>'` when nothing moved.
|
|
26
|
+
*/
|
|
27
|
+
static diffBlocks(previous, current) {
|
|
28
|
+
const previousSections = HclUtility.parseBlocks(previous);
|
|
29
|
+
const currentSections = HclUtility.parseBlocks(current);
|
|
30
|
+
const entries = [];
|
|
31
|
+
const keys = [...new Set([...previousSections.keys(), ...currentSections.keys()])].sort((a, b) => a.localeCompare(b));
|
|
32
|
+
for (const key of keys) {
|
|
33
|
+
const previousTexts = previousSections.get(key) ?? [];
|
|
34
|
+
const currentTexts = currentSections.get(key) ?? [];
|
|
35
|
+
// A header repeated on either side is keyed with its first body line on both sides.
|
|
36
|
+
const repeatedHeaders = new Set([
|
|
37
|
+
...HclUtility.repeatedHeaders(previousTexts),
|
|
38
|
+
...HclUtility.repeatedHeaders(currentTexts),
|
|
39
|
+
]);
|
|
40
|
+
const previousBlocks = HclUtility.keyBlocks(previousTexts, repeatedHeaders);
|
|
41
|
+
const currentBlocks = HclUtility.keyBlocks(currentTexts, repeatedHeaders);
|
|
42
|
+
const headers = [...new Set([...previousBlocks.keys(), ...currentBlocks.keys()])].sort((a, b) => a.localeCompare(b));
|
|
43
|
+
for (const header of headers) {
|
|
44
|
+
const before = previousBlocks.get(header);
|
|
45
|
+
const after = currentBlocks.get(header);
|
|
46
|
+
if (before === undefined) {
|
|
47
|
+
entries.push(`+ ${key}\n${after}`);
|
|
48
|
+
}
|
|
49
|
+
else if (after === undefined) {
|
|
50
|
+
entries.push(`- ${key}\n${before}`);
|
|
51
|
+
}
|
|
52
|
+
else if (before !== after) {
|
|
53
|
+
entries.push(`~ ${key} ${header}\n${HclUtility.unifiedDiff(before, after, { contextLines: 1 })}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return entries.length > 0 ? entries.join('\n\n') : '<no changes>';
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Reads the `resource` and `data` blocks of rendered terraform, keyed by their terraform address:
|
|
61
|
+
* `<type>.<name>` for a resource, `data.<type>.<name>` for a data source. It takes one file's text or
|
|
62
|
+
* a whole {@link serialize} render, such as the `hclRender` a module test gets back, since resource
|
|
63
|
+
* and data addresses are unique across an app.
|
|
64
|
+
*
|
|
65
|
+
* It reads octo's own render format, not arbitrary HCL: one attribute or block per line, and a value
|
|
66
|
+
* spanning lines only inside brackets.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* const { resource } = HclUtility.parse(hclRender);
|
|
71
|
+
* expect(Object.keys(resource)).toContain('aws_vpc.vpc-region-475bfa');
|
|
72
|
+
* expect(resource['aws_vpc.vpc-region-475bfa'].cidr_block).toBe('10.0.0.0/16');
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
static parse(hcl) {
|
|
76
|
+
const parsed = { data: {}, resource: {} };
|
|
77
|
+
const lines = hcl.split('\n').filter((line) => !HclUtility.SECTION_HEADER.test(line));
|
|
78
|
+
for (const block of HclUtility.splitTopLevelBlocks(lines)) {
|
|
79
|
+
const blockLines = block.split('\n');
|
|
80
|
+
const header = /^(data|resource) "([^"]+)" "([^"]+)" \{$/.exec(blockLines[0]);
|
|
81
|
+
if (!header) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const [, kind, type, name] = header;
|
|
85
|
+
const body = HclUtility.parseBody(blockLines.slice(1, -1));
|
|
86
|
+
if (kind === 'resource') {
|
|
87
|
+
parsed.resource[`${type}.${name}`] = body;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
parsed.data[`data.${type}.${name}`] = body;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return parsed;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Flattens the rendered terragrunt folders into one snapshot-friendly string: folders sorted by
|
|
97
|
+
* module id, files in a stable order, each prefixed with a `# <moduleId>/<file>` header. An empty
|
|
98
|
+
* file shows a `<empty>` body, so the file is still visible in the snapshot rather than omitted.
|
|
99
|
+
*/
|
|
100
|
+
static serialize(moduleFiles) {
|
|
101
|
+
const parts = [];
|
|
102
|
+
for (const moduleId of [...moduleFiles.keys()].sort((a, b) => a.localeCompare(b))) {
|
|
103
|
+
const files = moduleFiles.get(moduleId);
|
|
104
|
+
const entries = [
|
|
105
|
+
['main.tf', files.mainTf],
|
|
106
|
+
['outputs.tf', files.outputsTf],
|
|
107
|
+
['terragrunt.hcl', files.terragruntHcl],
|
|
108
|
+
['variables.tf', files.variablesTf],
|
|
109
|
+
];
|
|
110
|
+
for (const [name, content] of entries) {
|
|
111
|
+
const trimmed = content.trim();
|
|
112
|
+
parts.push(`# ${moduleId}/${name}\n${trimmed || '<empty>'}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return parts.join('\n\n');
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Produces a git-style unified line diff of two multi-line strings, collapsing unchanged regions
|
|
119
|
+
* to at most `contextLines` of surrounding context per change and emitting `@@ -a,c +b,c @@` hunk
|
|
120
|
+
* headers. Changed lines are tagged `- ` (only in `before`) and `+ ` (only in `after`); context
|
|
121
|
+
* lines are tagged with two spaces, so the markers line up. Pure plain text, no ANSI color, so it
|
|
122
|
+
* is safe to embed in a snapshot.
|
|
123
|
+
*
|
|
124
|
+
* Returns an empty string when the two inputs are identical.
|
|
125
|
+
*/
|
|
126
|
+
static unifiedDiff(before, after, { contextLines = 3 } = {}) {
|
|
127
|
+
const a = before.length === 0 ? [] : before.split('\n');
|
|
128
|
+
const b = after.length === 0 ? [] : after.split('\n');
|
|
129
|
+
const operations = HclUtility.diffLines(a, b);
|
|
130
|
+
if (operations.every((o) => o.type === 'common')) {
|
|
131
|
+
return '';
|
|
132
|
+
}
|
|
133
|
+
// An op is kept when it is itself a change, or within `contextLines` of one. Consecutive kept ops
|
|
134
|
+
// form a hunk; the runs of dropped ops between them are the collapsed unchanged regions.
|
|
135
|
+
const isKept = operations.map((_, index) => {
|
|
136
|
+
const from = Math.max(0, index - contextLines);
|
|
137
|
+
const to = Math.min(operations.length - 1, index + contextLines);
|
|
138
|
+
for (let k = from; k <= to; k++) {
|
|
139
|
+
if (operations[k].type !== 'common') {
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
});
|
|
145
|
+
const hunks = [];
|
|
146
|
+
let index = 0;
|
|
147
|
+
while (index < operations.length) {
|
|
148
|
+
if (!isKept[index]) {
|
|
149
|
+
index++;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const start = index;
|
|
153
|
+
while (index < operations.length && isKept[index]) {
|
|
154
|
+
index++;
|
|
155
|
+
}
|
|
156
|
+
const end = index; // exclusive.
|
|
157
|
+
let aCount = 0;
|
|
158
|
+
let bCount = 0;
|
|
159
|
+
const lines = [];
|
|
160
|
+
for (let k = start; k < end; k++) {
|
|
161
|
+
const op = operations[k];
|
|
162
|
+
if (op.type === 'common') {
|
|
163
|
+
aCount++;
|
|
164
|
+
bCount++;
|
|
165
|
+
lines.push(` ${op.text}`);
|
|
166
|
+
}
|
|
167
|
+
else if (op.type === 'remove') {
|
|
168
|
+
aCount++;
|
|
169
|
+
lines.push(`- ${op.text}`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
bCount++;
|
|
173
|
+
lines.push(`+ ${op.text}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// `aBefore`/`bBefore` count the lines consumed before this hunk, so the hunk starts on the next
|
|
177
|
+
// line. A hunk that adds or removes nothing on a side reports that side at the boundary line
|
|
178
|
+
// with a zero count, matching unified-diff convention.
|
|
179
|
+
const aBefore = operations.slice(0, start).filter((o) => o.type !== 'add').length;
|
|
180
|
+
const bBefore = operations.slice(0, start).filter((o) => o.type !== 'remove').length;
|
|
181
|
+
const aStart = aCount > 0 ? aBefore + 1 : aBefore;
|
|
182
|
+
const bStart = bCount > 0 ? bBefore + 1 : bBefore;
|
|
183
|
+
hunks.push(`@@ -${aStart},${aCount} +${bStart},${bCount} @@\n${lines.join('\n')}`);
|
|
184
|
+
}
|
|
185
|
+
return hunks.join('\n');
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* How many brackets a line opens, less how many it closes, ignoring those inside quoted strings.
|
|
189
|
+
*
|
|
190
|
+
* @internal
|
|
191
|
+
*/
|
|
192
|
+
static bracketDepth(line) {
|
|
193
|
+
let depth = 0;
|
|
194
|
+
let inString = false;
|
|
195
|
+
for (let index = 0; index < line.length; index++) {
|
|
196
|
+
const character = line[index];
|
|
197
|
+
if (inString) {
|
|
198
|
+
if (character === '\\') {
|
|
199
|
+
index++;
|
|
200
|
+
}
|
|
201
|
+
else if (character === '"') {
|
|
202
|
+
inString = false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else if (character === '"') {
|
|
206
|
+
inString = true;
|
|
207
|
+
}
|
|
208
|
+
else if ('([{'.includes(character)) {
|
|
209
|
+
depth++;
|
|
210
|
+
}
|
|
211
|
+
else if (')]}'.includes(character)) {
|
|
212
|
+
depth--;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return depth;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Builds the shortest edit script between two line arrays via the classic longest-common-subsequence
|
|
219
|
+
* DP. Quadratic in the number of lines, which is fine for the small blocks this serves. A removal is
|
|
220
|
+
* preferred over an addition on ties so a changed line reads as `-old` then `+new`.
|
|
221
|
+
*
|
|
222
|
+
* @internal
|
|
223
|
+
*/
|
|
224
|
+
static diffLines(a, b) {
|
|
225
|
+
const n = a.length;
|
|
226
|
+
const m = b.length;
|
|
227
|
+
const commonLength = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
|
|
228
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
229
|
+
for (let j = m - 1; j >= 0; j--) {
|
|
230
|
+
commonLength[i][j] =
|
|
231
|
+
a[i] === b[j] ? commonLength[i + 1][j + 1] + 1 : Math.max(commonLength[i + 1][j], commonLength[i][j + 1]);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const operations = [];
|
|
235
|
+
let i = 0;
|
|
236
|
+
let j = 0;
|
|
237
|
+
while (i < n && j < m) {
|
|
238
|
+
if (a[i] === b[j]) {
|
|
239
|
+
operations.push({ text: a[i], type: 'common' });
|
|
240
|
+
i++;
|
|
241
|
+
j++;
|
|
242
|
+
}
|
|
243
|
+
else if (commonLength[i + 1][j] >= commonLength[i][j + 1]) {
|
|
244
|
+
operations.push({ text: a[i], type: 'remove' });
|
|
245
|
+
i++;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
operations.push({ text: b[j], type: 'add' });
|
|
249
|
+
j++;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
while (i < n) {
|
|
253
|
+
operations.push({ text: a[i], type: 'remove' });
|
|
254
|
+
i++;
|
|
255
|
+
}
|
|
256
|
+
while (j < m) {
|
|
257
|
+
operations.push({ text: b[j], type: 'add' });
|
|
258
|
+
j++;
|
|
259
|
+
}
|
|
260
|
+
return operations;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Keys blocks by their header line (e.g. `resource "aws_vpc" "vpc-x" {`), adding the first body line
|
|
264
|
+
* for a header in `repeatedHeaders`, and an occurrence number for any key still taken.
|
|
265
|
+
*
|
|
266
|
+
* @internal
|
|
267
|
+
*/
|
|
268
|
+
static keyBlocks(texts, repeatedHeaders) {
|
|
269
|
+
const blocks = new Map();
|
|
270
|
+
for (const text of texts) {
|
|
271
|
+
const [header, firstBodyLine = ''] = text.split('\n');
|
|
272
|
+
const baseKey = repeatedHeaders.has(header) ? `${header} ${firstBodyLine.trim()}` : header;
|
|
273
|
+
let key = baseKey;
|
|
274
|
+
for (let occurrence = 2; blocks.has(key); occurrence++) {
|
|
275
|
+
key = `${baseKey} #${occurrence}`;
|
|
276
|
+
}
|
|
277
|
+
blocks.set(key, text);
|
|
278
|
+
}
|
|
279
|
+
return blocks;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Splits a {@link serialize} render into its top-level blocks, grouped by `moduleId/file`. Relies on
|
|
283
|
+
* octo's regular render format — `# <moduleId>/<file>` section headers, and a top-level block
|
|
284
|
+
* starting on a line with no indent that is not a closing bracket.
|
|
285
|
+
*
|
|
286
|
+
* @internal
|
|
287
|
+
*/
|
|
288
|
+
static parseBlocks(serialized) {
|
|
289
|
+
const sections = new Map();
|
|
290
|
+
if (!serialized) {
|
|
291
|
+
return sections;
|
|
292
|
+
}
|
|
293
|
+
let currentKey;
|
|
294
|
+
let buffer = [];
|
|
295
|
+
const flush = () => {
|
|
296
|
+
if (currentKey === undefined) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
sections.set(currentKey, HclUtility.splitTopLevelBlocks(buffer));
|
|
300
|
+
buffer = [];
|
|
301
|
+
};
|
|
302
|
+
for (const line of serialized.split('\n')) {
|
|
303
|
+
const header = HclUtility.SECTION_HEADER.exec(line);
|
|
304
|
+
if (header) {
|
|
305
|
+
flush();
|
|
306
|
+
currentKey = header[1];
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
buffer.push(line);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
flush();
|
|
313
|
+
return sections;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Parses the lines inside a block. An attribute whose value opens more brackets than it closes runs
|
|
317
|
+
* on to the line that closes them, and is kept as text; `key = {` on its own is an object, parsed
|
|
318
|
+
* like a nested block.
|
|
319
|
+
*
|
|
320
|
+
* @internal
|
|
321
|
+
*/
|
|
322
|
+
static parseBody(lines) {
|
|
323
|
+
const body = {};
|
|
324
|
+
// Finds the line closing the block or value opened on line `start`.
|
|
325
|
+
const closingLine = (start) => {
|
|
326
|
+
let depth = 0;
|
|
327
|
+
for (let index = start; index < lines.length; index++) {
|
|
328
|
+
depth += HclUtility.bracketDepth(lines[index]);
|
|
329
|
+
if (depth <= 0) {
|
|
330
|
+
return index;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return lines.length - 1;
|
|
334
|
+
};
|
|
335
|
+
let index = 0;
|
|
336
|
+
while (index < lines.length) {
|
|
337
|
+
const line = lines[index];
|
|
338
|
+
const attribute = /^\s*([\w-]+)\s*=\s*(.*)$/.exec(line);
|
|
339
|
+
if (attribute) {
|
|
340
|
+
const [, key, value] = attribute;
|
|
341
|
+
const end = closingLine(index);
|
|
342
|
+
if (value === '{') {
|
|
343
|
+
body[key] = HclUtility.parseBody(lines.slice(index + 1, end));
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
const text = [value, ...lines.slice(index + 1, end + 1)].join('\n').trim();
|
|
347
|
+
body[key] = /^"(?:[^"\\]|\\.)*"$/.test(text) ? text.slice(1, -1) : text;
|
|
348
|
+
}
|
|
349
|
+
index = end + 1;
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
const nestedBlock = /^\s*([\w-]+)(?:\s+"[^"]*")*\s*\{$/.exec(line);
|
|
353
|
+
if (nestedBlock) {
|
|
354
|
+
const [, key] = nestedBlock;
|
|
355
|
+
const end = closingLine(index);
|
|
356
|
+
const nested = HclUtility.parseBody(lines.slice(index + 1, end));
|
|
357
|
+
const existing = body[key];
|
|
358
|
+
if (existing === undefined) {
|
|
359
|
+
body[key] = nested;
|
|
360
|
+
}
|
|
361
|
+
else if (Array.isArray(existing)) {
|
|
362
|
+
existing.push(nested);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
body[key] = [existing, nested];
|
|
366
|
+
}
|
|
367
|
+
index = end + 1;
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
index++;
|
|
371
|
+
}
|
|
372
|
+
return body;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Returns the header lines that more than one of these blocks starts with.
|
|
376
|
+
*
|
|
377
|
+
* @internal
|
|
378
|
+
*/
|
|
379
|
+
static repeatedHeaders(texts) {
|
|
380
|
+
const headers = texts.map((t) => t.split('\n')[0]);
|
|
381
|
+
return headers.filter((h, index) => headers.indexOf(h) !== index);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Splits lines into top-level blocks, each trimmed. A block starts on a line with no indent that is not a
|
|
385
|
+
* closing bracket, so a blank line inside a block does not end it.
|
|
386
|
+
*
|
|
387
|
+
* @internal
|
|
388
|
+
*/
|
|
389
|
+
static splitTopLevelBlocks(lines) {
|
|
390
|
+
const blocks = [];
|
|
391
|
+
for (const line of lines) {
|
|
392
|
+
if (line.trim() && !/^[\s)\]}]/.test(line)) {
|
|
393
|
+
blocks.push([line]);
|
|
394
|
+
}
|
|
395
|
+
else if (blocks.length > 0) {
|
|
396
|
+
blocks[blocks.length - 1].push(line);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return blocks.map((block) => block.join('\n').trim());
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=hcl.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hcl.utility.js","sourceRoot":"","sources":["../../../src/utilities/hcl/hcl.utility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one place octo speaks HTTP.
|
|
3
|
+
*
|
|
4
|
+
* A response is handed back whatever its status, so the caller decides what a refusal means instead
|
|
5
|
+
* of catching one. Only a request that never reached a server throws.
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare class HttpUtility {
|
|
10
|
+
/**
|
|
11
|
+
* Downloads `url` into `filePath`, streaming it so its size is not bounded by memory. False when the
|
|
12
|
+
* server refused it or the download was cut short, which can leave part of the file behind.
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
* @throws {@link TransactionError} When the host could not be reached at all.
|
|
16
|
+
*/
|
|
17
|
+
static downloadToFile(url: string, filePath: string): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* What a refused request said went wrong, as one line. A service that answers a list - a failed
|
|
20
|
+
* validation usually does - is read as a sentence, and a body that is not JSON as its status.
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
static readErrorMessage(response: Response): Promise<string>;
|
|
25
|
+
/**
|
|
26
|
+
* A body may be a stream, which is sent as it is read rather than held in memory. A stream's length
|
|
27
|
+
* is unknown to fetch, so a server that needs one is given `Content-Length` in `headers`.
|
|
28
|
+
*
|
|
29
|
+
* @internal
|
|
30
|
+
* @throws {@link TransactionError} When the host could not be reached at all, which is a different
|
|
31
|
+
* thing from being refused by it and is the caller's to report differently.
|
|
32
|
+
*/
|
|
33
|
+
static send(url: string, { body, headers, method }?: {
|
|
34
|
+
body?: BodyInit;
|
|
35
|
+
headers?: Record<string, string>;
|
|
36
|
+
method?: string;
|
|
37
|
+
}): Promise<Response>;
|
|
38
|
+
/**
|
|
39
|
+
* {@link HttpUtility.send} with a JSON body, which is every request octo makes that carries one
|
|
40
|
+
* other than an upload.
|
|
41
|
+
*
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
static sendJson(url: string, { body, headers, method }?: {
|
|
45
|
+
body?: unknown;
|
|
46
|
+
headers?: Record<string, string>;
|
|
47
|
+
method?: string;
|
|
48
|
+
}): Promise<Response>;
|
|
49
|
+
/**
|
|
50
|
+
* PUTs the file at `filePath` to `url`, streaming it so its size is not bounded by memory, with its
|
|
51
|
+
* `Content-Length`, which a presigned URL is usually signed with.
|
|
52
|
+
*
|
|
53
|
+
* @internal
|
|
54
|
+
* @throws {@link TransactionError} When the host could not be reached at all.
|
|
55
|
+
*/
|
|
56
|
+
static uploadFile(url: string, filePath: string, headers?: Record<string, string>): Promise<Response>;
|
|
57
|
+
}
|