File size: 4,210 Bytes
048b1e8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html

.PHONY: generate
generate: ## Generate OpenAPI spec
	$(call print-target)
	pnpm --frozen-lockfile install
	pnpm generate
	# Replace inline filter definitions with $ref to common/definitions/aip_filters.yaml
	@AIP_REF="../../../../common/definitions/aip_filters.yaml#/components/schemas"; \
	FILE="packages/aip/output/definitions/metering-and-billing/v3/openapi.MeteringAndBilling.yaml"; \
	for schema in SortQuery BooleanFieldFilter NumericFieldFilter StringFieldFilter StringFieldFilterExact DateTimeFieldFilter LabelsFieldFilter; do \
		if yq -e ".components.schemas | has(\"$$schema\")" "$$FILE" > /dev/null 2>&1; then \
			REF_VAL="$$AIP_REF/$$schema" SCHEMA="$$schema" yq -i '.components.schemas[strenv(SCHEMA)] = {"$$ref": strenv(REF_VAL)}' "$$FILE"; \
		fi; \
	done
	# Prefix addon operationIds with `product-catalog-` for the v3 MeteringAndBilling output
	@FILE="packages/aip/output/definitions/metering-and-billing/v3/openapi.MeteringAndBilling.yaml"; \
	for op in list-addons create-addon update-addon get-addon delete-addon archive-addon publish-addon; do \
		new_op="$$(printf '%s' "$$op" | sed 's/-addon/-product-catalog-addon/')"; \
		OLD_OP="$$op" NEW_OP="$$new_op" yq -i '(.paths[][] | select(.operationId == strenv(OLD_OP)) | .operationId) = strenv(NEW_OP)' "$$FILE"; \
	done
	# Strip Go codegen vendor extensions from the v3 MeteringAndBilling output
	@FILE="packages/aip/output/definitions/metering-and-billing/v3/openapi.MeteringAndBilling.yaml"; \
	yq -i 'del(.. | select(has("x-go-type"))["x-go-type"], .. | select(has("x-go-type-import"))["x-go-type-import"])' "$$FILE"
	pnpm --filter @openmeter/api-spec-aip exec openapi bundle output/definitions/metering-and-billing/v3/openapi.OpenMeter.yaml -o ../../../v3/openapi.yaml
	cp packages/legacy/output/openapi.OpenMeter.yaml ../openapi.yaml
	cp packages/legacy/output/openapi.OpenMeterCloud.yaml ../openapi.cloud.yaml
	cp packages/aip/output/definitions/metering-and-billing/v3/openapi.Test.yaml ../v3/test/openapi.test.yaml

.PHONY: test
test: ## Run AIP TypeScript SDK and emitter tests
	$(call print-target)
	pnpm --frozen-lockfile install
	pnpm --filter @openmeter/api-spec-aip run test
	pnpm run test:sdk:coverage
	pnpm --filter @openmeter/typespec-typescript run check

.PHONY: publish-aip-sdk
publish-aip-sdk: ## Publish the AIP TypeScript SDK (@openmeter/client) to npm
	$(call print-target)
	@if [ -z "$$AIP_SDK_RELEASE_VERSION" ]; then \
		echo "ERROR: AIP_SDK_RELEASE_VERSION is required"; \
		echo "Usage: AIP_SDK_RELEASE_VERSION=1.2.3 make publish-aip-sdk [AIP_SDK_RELEASE_TAG=beta]"; \
		exit 1; \
	fi

	@if [ -z "$$AIP_SDK_RELEASE_TAG" ]; then \
		echo "ERROR: AIP_SDK_RELEASE_TAG is required"; \
		echo "Usage: AIP_SDK_RELEASE_VERSION=1.2.3 make publish-aip-sdk [AIP_SDK_RELEASE_TAG=beta]"; \
		exit 1; \
	fi

	pnpm --frozen-lockfile install

	cd packages/aip-client-javascript && \
		pnpm version "$${AIP_SDK_RELEASE_VERSION}" --no-git-tag-version && \
		node -e "const fs=require('node:fs');const p='src/lib/version.ts';const v=process.env.AIP_SDK_RELEASE_VERSION;const src=fs.readFileSync(p,'utf8');const out=src.replace(/SDK_VERSION = '[^']*'/, \"SDK_VERSION = '\" + v + \"'\");if(out===src){throw new Error('SDK_VERSION pattern not found in '+p)}fs.writeFileSync(p, out)" && \
		CACHE_BUSTER="$$(date --rfc-3339=seconds)" pnpm publish --no-git-checks --access public --tag "$${AIP_SDK_RELEASE_TAG}"
	@echo "✅ Published $${AIP_SDK_RELEASE_TAG} AIP TypeScript SDK (@openmeter/client) version $${AIP_SDK_RELEASE_VERSION} with tag $${AIP_SDK_RELEASE_TAG}"

.PHONY: lint
lint: ## Lint OpenAPI spec
	$(call print-target)
	pnpm --frozen-lockfile install
	pnpm lint

.PHONY: format
format: ## Format OpenAPI spec
	$(call print-target)
	pnpm --frozen-lockfile install
	pnpm format

.PHONY: help
.DEFAULT_GOAL := help
help:
	@grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

# Variable outputting/exporting rules
var-%: ; @echo $($*)
varexport-%: ; @echo $*=$($*)

define print-target
    @printf "Executing target: \033[36m$@\033[0m\n"
endef