summaryrefslogtreecommitdiffstats
path: root/build/conf/ts/ts_library.conf
blob: c96190cb3fd4de6a2d288baad1a5fda737aa920d (plain) (blame)
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
_NOTS_TOOL_BUILD_LIBRARY_CMD=build-library
_TS_PACKAGE=no
_TS_BUILD_SCRIPT=
_TS_OUTPUTS_PARAM=
_TS_OUTPUTS=
_TS_OUTPUTS_JOINED=
_TS_GLOB_FILES=
_TS_MOD_NAME=

TS_LIBRARY_CMD_BASE=${NOTS_TOOL} ${NOTS_TOOL_BASE_ARGS} ${_NOTS_TOOL_BUILD_LIBRARY_CMD} ${NOTS_TOOL_BASIC_BUILDER_ARGS} \
    ${_TS_OUTPUTS_PARAM} ${_TS_OUTPUTS} \
    --exclude-globs ${_SET_TS_INPUTS_BASE_EXCLUDES} \
    ${hide:PEERS} \
    ${_NODE_MODULES_INOUTS} \
    ${hide;input=TEXT:_TS_GLOB_FILES} \
    ${hide;input:"ya.make"} \
    ${hide;input:"package.json"}

TS_LIBRARY_CMD=${_TS_PROJECT_SETUP_CMD} \
    && ${ADD_VCS_INFO_FILE_CMD} \
    && ${TS_LIBRARY_CMD_BASE} \
    --build-script ${_TS_BUILD_SCRIPT} \
    ${hide;kv:"pc magenta"} ${hide;kv:"p TS_LIB"}


### @usage: TS_LIBRARY([name])
###
### The TypeScript/JavaScript library module, compiles TypeScript sources to JavaScript using tsc.
### Build results are JavaScript files, typings and source mappings (depending on local tsconfig.json settings).
###
### Documentation: https://docs.yandex-team.ru/frontend-in-arcadia/references/TS_LIBRARY
###
### @example
###
###     TS_LIBRARY()
###
###     END()
###
multimodule TS_LIBRARY {
    module BUILD: _TS_BASE_UNIT {
        .CMD=$TS_LIBRARY_CMD
        .SEM=$_SEM_IGNORED
        .EPILOGUE=_TS_LIBRARY_EPILOGUE
        .PEERDIRSELF=TS_PREPARE_DEPS
        .ALIASES=TS_TEST=_FORBID_TS_TEST TS_BIOME=_FORBID_TS_BIOME TS_TYPECHECK=_FORBID_TS_TYPECHECK TS_STYLELINT=_FORBID_TS_STYLELINT TS_ESLINT_CONFIG=_FORBID_TS_ESLINT_CONFIG RUN_JAVASCRIPT_AFTER_BUILD=_FORBID_RUN_JAVASCRIPT_AFTER_BUILD TS_FILES=_FORBID_TS_FILES TS_FILES_GLOB=_FORBID_TS_FILES_GLOB TS_CONFIG=_FORBID_TS_CONFIG TS_NEXT_CONFIG=_FORBID_TS_NEXT_CONFIG TS_VITE_CONFIG=_FORBID_TS_VITE_CONFIG TS_WEBPACK_CONFIG=_FORBID_TS_WEBPACK_CONFIG TS_RSPACK_CONFIG=_FORBID_TS_RSPACK_CONFIG TS_NEXT_OUTPUT=_FORBID_TS_NEXT_OUTPUT TS_VITE_OUTPUT=_FORBID_TS_VITE_OUTPUT TS_WEBPACK_OUTPUT=_FORBID_TS_WEBPACK_OUTPUT TS_RSPACK_OUTPUT=_FORBID_TS_RSPACK_OUTPUT

        # by default multimodule overrides inherited MODULE_TAG to submodule name (BUILD in this case)
        # but we have to set it to TS for include processor to work
        SET(MODULE_TAG TS)

        SET(_TS_MOD_NAME TS_LIBRARY)

        DISABLE(TS_CONFIG_DEDUCE_OUT)

        SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS ${CURDIR}/package.json)
    }

    module TS_PREPARE_DEPS: _PREPARE_DEPS_BASE {
    }
}

macro TS_BUILD_SCRIPT(SCRIPT) {
    SET(_TS_BUILD_SCRIPT ${SCRIPT})
}

macro TS_BUILD_OUTPUTS(PATHS...) {
    SET(_TS_OUTPUTS_PARAM --outputs)
    SET(_TS_OUTPUTS ${PATHS})
    SET(_TS_OUTPUTS_JOINED ${join=|:PATHS})
}

macro _TS_LIBRARY_EPILOGUE() {
    _SET_TS_INPUTS()
    _SETUP_BUILD_ENV()
    _TS_LIBRARY_CONFIGURE()
    _TS_CHECK_CONFIGURE(TS_LIBRARY)
}

# Exclusions for TS_LIBRARY input files:
# - a.yaml: build system files, not needed for `node --run`
# - .npmrc: we don't want it to affect build
# - package.json: added separately via explicit input/output directives (line 13-14), needs to be copied earlier
# - pnpm-lock.yaml: BUILD depends not on it, but on files that PREPARE_DEPS prepares
_SET_TS_INPUTS_BASE_EXCLUDES=a.yaml .npmrc package.json pnpm-lock.yaml \
    output.tar \
    output.tar.uuid \
    workspace_node_modules.tar \
    ${TS_EXCLUDE_DIR_GLOB} \
    ${TS_GLOB_EXCLUDE_ADDITIONAL}

_SET_TS_INPUTS_EXCLUDES=\
    ${_SET_TS_INPUTS_BASE_EXCLUDES} \
    (${_TS_OUTPUTS_JOINED})/**/*

# tag:internal
macro _SET_TS_INPUTS() {
    _GLOB(_TS_GLOB_FILES **/* EXCLUDE ${_SET_TS_INPUTS_EXCLUDES} RESTRICTIONS MAX_MATCHES 10000 MAX_WATCH_DIRS 5000 SKIPPED_MIN_MATCHES 2000 SKIPPED_ERROR_PERCENT 90)
    _ESCAPE_SPACES(_TS_GLOB_FILES)
}



########################################################

macro _FORBID_TS_TEST(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} forbids to use {COLORS.cyan}TS_TEST{COLORS.reset} macro
    _L2 = You cannot describe unit-tests inside of {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset}
    _L3 = https://docs.yandex-team.ru/frontend-in-arcadia/index/quick-start#unit-tests-in-ts-library
    _TS_CONF_ERROR(\n$_L1\n$_L2\n$_L3)
}

macro _FORBID_TS_BIOME(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_BIOME{COLORS.reset} macro.
    _L2 = Use {COLORS.cyan}TS_LINT{COLORS.reset} instead
    _L3 = https://docs.yandex-team.ru/frontend-in-arcadia/references/macros#ts-lint
    _TS_CONF_ERROR(\n$_L1\n$_L2\n$_L3)
}

macro _FORBID_TS_TYPECHECK(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_TYPECHECK{COLORS.reset} macro.
    _L2 = Use {COLORS.cyan}TS_LINT{COLORS.reset} instead
    _L3 = https://docs.yandex-team.ru/frontend-in-arcadia/references/macros#ts-lint
    _TS_CONF_ERROR(\n$_L1\n$_L2\n$_L3)
}

macro _FORBID_TS_STYLELINT(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_STYLELINT{COLORS.reset} macro.
    _L2 = Use {COLORS.cyan}TS_LINT{COLORS.reset} instead
    _L3 = https://docs.yandex-team.ru/frontend-in-arcadia/references/macros#ts-lint
    _TS_CONF_ERROR(\n$_L1\n$_L2\n$_L3)
}

macro _FORBID_TS_ESLINT_CONFIG(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_ESLINT_CONFIG{COLORS.reset} macro.
    _L2 = Use {COLORS.cyan}TS_LINT{COLORS.reset} instead
    _L3 = https://docs.yandex-team.ru/frontend-in-arcadia/references/macros#ts-lint
    _TS_CONF_ERROR(\n$_L1\n$_L2\n$_L3)
}

macro _FORBID_RUN_JAVASCRIPT_AFTER_BUILD(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}RUN_JAVASCRIPT_AFTER_BUILD{COLORS.reset}
    _L2 = Write required script in package.json and use {COLORS.cyan}TS_BUILD_SCRIPT{COLORS.reset}
    _TS_CONF_ERROR(\n$_L1\n$_L2)
}

macro _FORBID_TS_FILES(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_FILES{COLORS.reset} macro
    _L2 = If you used it to mark files as inputs - just remove it, all files are inputs for {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset}
    _L3 = If you used it to mark files as outputs - write them in {COLORS.cyan}files{COLORS.reset} field in {COLORS.cyan}package.json{COLORS.reset}
    _TS_CONF_ERROR(\n$_L1\n$_L2\n$_L3)
}

macro _FORBID_TS_FILES_GLOB(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_FILES_GLOB{COLORS.reset} macro
    _L2 = If you used it to mark files as inputs - just remove it, all files are inputs for {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset}
    _L3 = If you used it to mark files as outputs - write them in {COLORS.cyan}files{COLORS.reset} field in {COLORS.cyan}package.json{COLORS.reset}
    _TS_CONF_ERROR(\n$_L1\n$_L2\n$_L3)
}

macro _FORBID_TS_CONFIG(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_CONFIG{COLORS.reset} macro
    _L2 = Set proper config path in build script in {COLORS.cyan}package.json{COLORS.reset}
    _TS_CONF_ERROR(\n$_L1\n$_L2)
}

macro _FORBID_TS_NEXT_CONFIG(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_NEXT_CONFIG{COLORS.reset} macro
    _L2 = Set proper config path in build script in {COLORS.cyan}package.json{COLORS.reset}
    _TS_CONF_ERROR(\n$_L1\n$_L2)
}

macro _FORBID_TS_VITE_CONFIG(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_VITE_CONFIG{COLORS.reset} macro
    _L2 = Set proper config path in build script in {COLORS.cyan}package.json{COLORS.reset}
    _TS_CONF_ERROR(\n$_L1\n$_L2)
}

macro _FORBID_TS_WEBPACK_CONFIG(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_WEBPACK_CONFIG{COLORS.reset} macro
    _L2 = Set proper config path in build script in {COLORS.cyan}package.json{COLORS.reset}
    _TS_CONF_ERROR(\n$_L1\n$_L2)
}

macro _FORBID_TS_RSPACK_CONFIG(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_RSPACK_CONFIG{COLORS.reset} macro
    _L2 = Set proper config path in build script in {COLORS.cyan}package.json{COLORS.reset}
    _TS_CONF_ERROR(\n$_L1\n$_L2)
}

macro _FORBID_TS_NEXT_OUTPUT(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_NEXT_OUTPUT{COLORS.reset} macro
    _L2 = Use {COLORS.cyan}TS_BUILD_OUTPUTS{COLORS.reset} instead
    _TS_CONF_ERROR(\n$_L1\n$_L2)
}

macro _FORBID_TS_VITE_OUTPUT(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_VITE_OUTPUT{COLORS.reset} macro
    _L2 = Use {COLORS.cyan}TS_BUILD_OUTPUTS{COLORS.reset} instead
    _TS_CONF_ERROR(\n$_L1\n$_L2)
}

macro _FORBID_TS_WEBPACK_OUTPUT(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_WEBPACK_OUTPUT{COLORS.reset} macro
    _L2 = Use {COLORS.cyan}TS_BUILD_OUTPUTS{COLORS.reset} instead
    _TS_CONF_ERROR(\n$_L1\n$_L2)
}

macro _FORBID_TS_RSPACK_OUTPUT(_p...) {
    _L1 = {COLORS.cyan}${_TS_MOD_NAME}{COLORS.reset} does not support {COLORS.cyan}TS_RSPACK_OUTPUT{COLORS.reset} macro
    _L2 = Use {COLORS.cyan}TS_BUILD_OUTPUTS{COLORS.reset} instead
    _TS_CONF_ERROR(\n$_L1\n$_L2)
}