livemark 0.28.1 → 0.28.3
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/build/actions/config/load.js +16 -15
- package/build/actions/config/load.unit.js +13 -1
- package/build/commands/start.js +31 -8
- package/build/content-collections.js +2 -2
- package/build/helpers/local-imports.d.ts +2 -0
- package/build/helpers/local-imports.js +20 -0
- package/build/helpers/local-imports.unit.d.ts +1 -0
- package/build/helpers/local-imports.unit.js +25 -0
- package/build/helpers/toc.d.ts +1 -1
- package/build/helpers/toc.js +29 -31
- package/build/helpers/toc.unit.js +23 -1
- package/build/index.d.ts +1 -0
- package/build/index.js +2 -1
- package/build/index.unit.d.ts +1 -0
- package/build/index.unit.js +16 -0
- package/build/models/config.d.ts +2 -0
- package/build/models/config.js +2 -1
- package/build/plugins/vite-livemark.js +72 -6
- package/package.json +3 -2
- package/skills/livemark-configuration/SKILL.md +1 -1
- package/skills/livemark-customization/SKILL.md +1 -1
- package/source/actions/config/load.ts +15 -6
- package/source/actions/config/load.unit.ts +17 -0
- package/source/commands/start.ts +24 -0
- package/source/content-collections.ts +1 -1
- package/source/helpers/local-imports.ts +19 -0
- package/source/helpers/local-imports.unit.ts +36 -0
- package/source/helpers/toc.ts +29 -29
- package/source/helpers/toc.unit.ts +27 -0
- package/source/index.ts +1 -0
- package/source/index.unit.ts +18 -0
- package/source/models/config.ts +1 -0
- package/source/plugins/vite-livemark.ts +72 -6
- package/source/styles/markdown.css +5 -0
package/build/models/config.js
CHANGED
|
@@ -57,6 +57,7 @@ export const WebsiteConfig = UserConfig.pick({
|
|
|
57
57
|
export const SystemConfig = z.object({
|
|
58
58
|
root: z.string(),
|
|
59
59
|
configPath: z.string(),
|
|
60
|
+
configDependencies: z.array(z.string()).default([]),
|
|
60
61
|
});
|
|
61
62
|
export const Config = UserConfig.merge(SystemConfig);
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL21vZGVscy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQXNCMUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDMUQsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDM0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDOUQsQ0FBQyxDQUFBO0FBS0YsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ2pDLE9BQU8sRUFB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UUFBUSxFQUFFO0NBQzVCLENBQUMsQ0FBQTtBQU1GLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ3ZCLENBQUMsQ0FBQTtBQWNGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHR5cGUgeyBDb25maWdFbnYsIFVzZXJDb25maWcgYXMgVml0ZVVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgeyBMaW5rIH0gZnJvbSBcIi4vbGluay50c1wiXG5pbXBvcnQgeyBQYXRjaCB9IGZyb20gXCIuL3BhdGNoLnRzXCJcbmltcG9ydCB7IFNlY3Rpb24gfSBmcm9tIFwiLi9zZWN0aW9uLnRzXCJcbmltcG9ydCB7IENvZGVUaGVtZURhcmssIENvZGVUaGVtZUxpZ2h0IH0gZnJvbSBcIi4vdGhlbWUudHNcIlxuXG4vKiogRXNjYXBlIGhhdGNoIGZvciBhcmJpdHJhcnkgVml0ZSBjb25maWcg4oCUIGFjY2VwdHMgZWl0aGVyIGEgY29uZmlnXG4gKiAgb2JqZWN0IChzaW1wbGUgb3ZlcnJpZGVzKSBvciBhIGZ1bmN0aW9uIGZvcm0gKGAoZW52KSA9PiBjb25maWdgLFxuICogIG1hdGNoaW5nIFZpdGUncyBvd24gYGRlZmluZUNvbmZpZ2ApLiBNZXJnZWQgb24gdG9wIG9mIGxpdmVtYXJrJ3NcbiAqICBkZWZhdWx0cyB2aWEgYG1lcmdlQ29uZmlnYCwgc28gcGx1Z2luIGFycmF5cyBjb25jYXRlbmF0ZSwgZGVmaW5lc1xuICogIG1lcmdlLCBldGMuIFVzZSB0aGlzIGZvciBkZXBsb3ltZW50LXRhcmdldCB0d2Vha3MgKGUuZy4gQ0YgV29ya2Vyc1xuICogIHZpYSBgZW52aXJvbm1lbnRzLnNzci5yZXNvbHZlLmNvbmRpdGlvbnM6IFtcIndvcmtlcmRcIiwgLi4uXWApLiAqL1xuZXhwb3J0IHR5cGUgVml0ZU92ZXJyaWRlID1cbiAgfCBWaXRlVXNlckNvbmZpZ1xuICB8ICgoZW52OiBDb25maWdFbnYpID0+IFZpdGVVc2VyQ29uZmlnIHwgUHJvbWlzZTxWaXRlVXNlckNvbmZpZz4pXG5cbi8qKiBTdWItcGF0aCBtb3VudC4gU3RyaW5nIGZvcm0gaXMgdXNlZCBhcy1pczsgZnVuY3Rpb24gZm9ybSBpcyBjYWxsZWRcbiAqICB3aXRoIFZpdGUncyBgY29tbWFuZGAgKGBcInNlcnZlXCJgIGluIGRldiwgYFwiYnVpbGRcImAgaW4gcHJvZHVjdGlvbikgc29cbiAqICB0aGUgdXNlciBjYW4gYnJhbmNoICh0eXBpY2FsIGNhc2U6IHNlcnZlIGF0IGAvYCBpbiBkZXYgYnV0IGF0XG4gKiAgYC9yZXBvL2AgaW4gcHJvZHVjdGlvbiBmb3IgR2l0SHViIFBhZ2VzKS4gVGhlIGJ1aWxkIHBpcGVsaW5lXG4gKiAgcmVzb2x2ZXMgaXQgdG8gYSBzdHJpbmcgYmVmb3JlIGFueSBydW50aW1lIHNlZXMgaXQuICovXG5leHBvcnQgdHlwZSBCYXNlID0gc3RyaW5nIHwgKChjb21tYW5kOiBcImJ1aWxkXCIgfCBcInNlcnZlXCIpID0+IHN0cmluZyB8IHVuZGVmaW5lZClcblxuLyoqIEV4dHJhIHNpdGUtd2lkZSBgPGhlYWQ+YCB0YWdzLCBhcHBlbmRlZCBhZnRlciBMaXZlbWFyaydzIGRlZmF1bHRzLiBBIG1ldGEgdGFnXG4gKiAgc2hhcmluZyBhIGRlZmF1bHQncyBgbmFtZWAgb3IgYHByb3BlcnR5YCByZXBsYWNlcyBpdC4gKi9cbmV4cG9ydCB0eXBlIEhlYWQgPSB6LmluZmVyPHR5cGVvZiBIZWFkPlxuZXhwb3J0IGNvbnN0IEhlYWQgPSB6Lm9iamVjdCh7XG4gIG1ldGE6IHouYXJyYXkoei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkpLm9wdGlvbmFsKCksXG4gIGxpbmtzOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpKS5vcHRpb25hbCgpLFxuICBzY3JpcHRzOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpKS5vcHRpb25hbCgpLFxufSlcblxuLyoqIEhvdyBhdXRvbWF0ZWQgc3lzdGVtcyBtYXkgdXNlIHRoZSBzaXRlJ3MgY29udGVudCwgcHVibGlzaGVkIGFzIGFcbiAqICBgQ29udGVudC1TaWduYWxgIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBgcm9ib3RzLnR4dGAuICovXG5leHBvcnQgdHlwZSBDb250ZW50U2lnbmFscyA9IHouaW5mZXI8dHlwZW9mIENvbnRlbnRTaWduYWxzPlxuZXhwb3J0IGNvbnN0IENvbnRlbnRTaWduYWxzID0gei5vYmplY3Qoe1xuICBzZWFyY2g6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG4gIGFpSW5wdXQ6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG4gIGFpVHJhaW46IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG59KVxuXG4vKipcbiAqIFVzZXItcHJvdmlkZWQgY29uZmlndXJhdGlvbiBmb3IgTGl2ZW1hcmsuXG4gKlxuICogYHZpdGVgIGFuZCBgYmFzZWAgYXJlIGxpZnRlZCBmcm9tIGB1bmtub3duYCB0byB0aGVpciBwdWJsaWMgdHlwZXMgc29cbiAqIGBkZWZpbmVDb25maWdgIHNob3dzIHRoZSByaWdodCBzaGFwZSBpbiBlZGl0b3JzLiBVc2UgdGhpcyB0eXBlIGZvclxuICogdGhlIGlucHV0IHRvIGBkZWZpbmVDb25maWdgIOKAlCBpdCBrZWVwcyBkZWZhdWx0ZWQgZmllbGRzIG9wdGlvbmFsXG4gKiAoYmVjYXVzZSB6b2QgaW5wdXQg4omgIG91dHB1dCBmb3IgZmllbGRzIHdpdGggYC5kZWZhdWx0KClgKS5cbiAqL1xuZXhwb3J0IHR5cGUgVXNlckNvbmZpZyA9IE9taXQ8ei5pbnB1dDx0eXBlb2YgVXNlckNvbmZpZz4sIFwidml0ZVwiIHwgXCJiYXNlXCI+ICYge1xuICB2aXRlPzogVml0ZU92ZXJyaWRlXG4gIGJhc2U/OiBCYXNlXG59XG5leHBvcnQgY29uc3QgVXNlckNvbmZpZyA9IHoub2JqZWN0KHtcbiAgc2l0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAvLyBTdG9yZWQgYXMgYHVua25vd25gIGluIHRoZSBzY2hlbWEgKHpvZCBjYW4ndCB0eXBlIGEgZnVuY3Rpb24gYW5kXG4gIC8vIHN0cmluZyB1bmlvbiBtZWFuaW5nZnVsbHkpOyB0aGUgcHVibGljIFR5cGVTY3JpcHQgc3VyZmFjZSBhYm92ZVxuICAvLyBsaWZ0cyBpdCBiYWNrIHRvIGBCYXNlYCBmb3IgZWRpdG9yIHN1cHBvcnQuIFRoZSBidWlsZCBwaXBlbGluZVxuICAvLyByZXNvbHZlcyBpdCB2aWEgYHJlc29sdmVCYXNlKClgIGJlZm9yZSBhbnkgcnVudGltZSBjb25zdW1lciBzZWVzXG4gIC8vIGl0LCBzbyB0aGUgcnVudGltZSBgV2Vic2l0ZUNvbmZpZy5iYXNlYCBpcyBzdHJpY3RseSBgc3RyaW5nYC5cbiAgYmFzZTogei51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgZmF2aWNvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBsb2dvOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHRpdGxlOiB6LnN0cmluZygpLmRlZmF1bHQoXCJMaXZlbWFya1wiKSxcbiAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkuZGVmYXVsdChcIk1hcmtkb3duIHNpdGUgZ2VuZXJhdG9yXCIpLFxuICBiYW5uZXI6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgaW5jbHVkZTogei51bmlvbihbei5zdHJpbmcoKSwgei5hcnJheSh6LnN0cmluZygpKV0pLmRlZmF1bHQoXCIqKi8qLm1kXCIpLFxuICBleGNsdWRlOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSkub3B0aW9uYWwoKSxcbiAgY29kZVRoZW1lTGlnaHQ6IENvZGVUaGVtZUxpZ2h0LmRlZmF1bHQoXCJjYXRwcHVjY2luLWxhdHRlXCIpLFxuICBjb2RlVGhlbWVEYXJrOiBDb2RlVGhlbWVEYXJrLmRlZmF1bHQoXCJjYXRwcHVjY2luLW1vY2hhXCIpLFxuICBsaW5rczogei5hcnJheShMaW5rKS5vcHRpb25hbCgpLFxuICBzZWN0aW9uczogei5hcnJheShTZWN0aW9uKS5vcHRpb25hbCgpLFxuICBwYXRjaGVzOiB6LmFycmF5KFBhdGNoKS5vcHRpb25hbCgpLFxuICBoZWFkOiBIZWFkLm9wdGlvbmFsKCksXG4gIGNvbnRlbnRTaWduYWxzOiBDb250ZW50U2lnbmFscy5wcmVmYXVsdCh7fSksXG4gIHNraWxsczogei51bmlvbihbei5zdHJpbmcoKSwgei5hcnJheSh6LnN0cmluZygpKV0pLm9wdGlvbmFsKCksXG4gIC8vIFN0b3JlZCBhcyBgdW5rbm93bmAgaW4gdGhlIHNjaGVtYSAoem9kIGNhbid0IHR5cGUgYSBWaXRlIFVzZXJDb25maWdcbiAgLy8gb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgb25lIG1lYW5pbmdmdWxseSk7IHRoZSBwdWJsaWMgVHlwZVNjcmlwdFxuICAvLyBzdXJmYWNlIGFib3ZlIGxpZnRzIGl0IGJhY2sgdG8gVml0ZU92ZXJyaWRlIGZvciBlZGl0b3Igc3VwcG9ydC5cbiAgdml0ZTogei51bmtub3duKCkub3B0aW9uYWwoKSxcbn0pXG5cbi8qKiBXZWJzaXRlIGNvbmZpZ3VyYXRpb24gaW5qZWN0ZWQgYXQgYnVpbGQgdGltZSB2aWEgVml0ZSBkZWZpbmUuXG4gKiAgYGJhc2VgIGlzIHN0cmljdGx5IGEgc3RyaW5nIGhlcmUg4oCUIHRoZSBidWlsZCBwaXBlbGluZSBoYXMgYWxyZWFkeVxuICogIHJlc29sdmVkIGFueSBmdW5jdGlvbiBmb3JtIHZpYSBgcmVzb2x2ZUJhc2UoKWAuICovXG5leHBvcnQgdHlwZSBXZWJzaXRlQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgV2Vic2l0ZUNvbmZpZz5cbmV4cG9ydCBjb25zdCBXZWJzaXRlQ29uZmlnID0gVXNlckNvbmZpZy5waWNrKHtcbiAgdGl0bGU6IHRydWUsXG4gIGRlc2NyaXB0aW9uOiB0cnVlLFxuICBzaXRlOiB0cnVlLFxuICBmYXZpY29uOiB0cnVlLFxuICBsb2dvOiB0cnVlLFxuICBiYW5uZXI6IHRydWUsXG4gIGxpbmtzOiB0cnVlLFxuICBzZWN0aW9uczogdHJ1ZSxcbiAgaGVhZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIGJhc2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pXG5cbi8qKlxuICogU3lzdGVtLWNvbXB1dGVkIGNvbmZpZ3VyYXRpb24gZGVyaXZlZCBmcm9tIHRoZSBjb25maWcgZmlsZSBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgU3lzdGVtQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgU3lzdGVtQ29uZmlnPlxuZXhwb3J0IGNvbnN0IFN5c3RlbUNvbmZpZyA9IHoub2JqZWN0KHtcbiAgcm9vdDogei5zdHJpbmcoKSxcbiAgY29uZmlnUGF0aDogei5zdHJpbmcoKSxcbn0pXG5cbi8qKlxuICogRnVsbHkgcmVzb2x2ZWQgTGl2ZW1hcmsgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBgdml0ZWAgc3RheXMgYHVua25vd25gIGJlY2F1c2UgdGhhdCdzIHdoYXQgdGhlIHJ1bnRpbWUgc2NoZW1hXG4gKiBwcm9kdWNlcyDigJQgY29uc3VtZXItZmFjaW5nIHR5cGluZyBoYXBwZW5zIHZpYSB7QGxpbmsgVXNlckNvbmZpZ30gc29cbiAqIGBkZWZpbmVDb25maWdgIHNob3dzIHRoZSByaWdodCBzaGFwZSBpbiBlZGl0b3JzLiBgYmFzZWAgaXMgbGlmdGVkIHRvXG4gKiBgc3RyaW5nIHwgdW5kZWZpbmVkYCBiZWNhdXNlIGBsb2FkQ29uZmlnKClgIHJlc29sdmVzIGFueSBmdW5jdGlvblxuICogZm9ybSB2aWEgYHJlc29sdmVCYXNlKClgIGJlZm9yZSByZXR1cm5pbmcuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZyA9IE9taXQ8ei5pbmZlcjx0eXBlb2YgQ29uZmlnPiwgXCJiYXNlXCI+ICYge1xuICBiYXNlPzogc3RyaW5nXG59XG5leHBvcnQgY29uc3QgQ29uZmlnID0gVXNlckNvbmZpZy5tZXJnZShTeXN0ZW1Db25maWcpXG4iXX0=
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL21vZGVscy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQXNCMUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDMUQsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDM0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDOUQsQ0FBQyxDQUFBO0FBS0YsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ2pDLE9BQU8sRUFB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UUFBUSxFQUFFO0NBQzVCLENBQUMsQ0FBQTtBQU1GLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ3RCLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztDQUNwRCxDQUFDLENBQUE7QUFjRixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB0eXBlIHsgQ29uZmlnRW52LCBVc2VyQ29uZmlnIGFzIFZpdGVVc2VyQ29uZmlnIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHsgTGluayB9IGZyb20gXCIuL2xpbmsudHNcIlxuaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwiLi9wYXRjaC50c1wiXG5pbXBvcnQgeyBTZWN0aW9uIH0gZnJvbSBcIi4vc2VjdGlvbi50c1wiXG5pbXBvcnQgeyBDb2RlVGhlbWVEYXJrLCBDb2RlVGhlbWVMaWdodCB9IGZyb20gXCIuL3RoZW1lLnRzXCJcblxuLyoqIEVzY2FwZSBoYXRjaCBmb3IgYXJiaXRyYXJ5IFZpdGUgY29uZmlnIOKAlCBhY2NlcHRzIGVpdGhlciBhIGNvbmZpZ1xuICogIG9iamVjdCAoc2ltcGxlIG92ZXJyaWRlcykgb3IgYSBmdW5jdGlvbiBmb3JtIChgKGVudikgPT4gY29uZmlnYCxcbiAqICBtYXRjaGluZyBWaXRlJ3Mgb3duIGBkZWZpbmVDb25maWdgKS4gTWVyZ2VkIG9uIHRvcCBvZiBsaXZlbWFyaydzXG4gKiAgZGVmYXVsdHMgdmlhIGBtZXJnZUNvbmZpZ2AsIHNvIHBsdWdpbiBhcnJheXMgY29uY2F0ZW5hdGUsIGRlZmluZXNcbiAqICBtZXJnZSwgZXRjLiBVc2UgdGhpcyBmb3IgZGVwbG95bWVudC10YXJnZXQgdHdlYWtzIChlLmcuIENGIFdvcmtlcnNcbiAqICB2aWEgYGVudmlyb25tZW50cy5zc3IucmVzb2x2ZS5jb25kaXRpb25zOiBbXCJ3b3JrZXJkXCIsIC4uLl1gKS4gKi9cbmV4cG9ydCB0eXBlIFZpdGVPdmVycmlkZSA9XG4gIHwgVml0ZVVzZXJDb25maWdcbiAgfCAoKGVudjogQ29uZmlnRW52KSA9PiBWaXRlVXNlckNvbmZpZyB8IFByb21pc2U8Vml0ZVVzZXJDb25maWc+KVxuXG4vKiogU3ViLXBhdGggbW91bnQuIFN0cmluZyBmb3JtIGlzIHVzZWQgYXMtaXM7IGZ1bmN0aW9uIGZvcm0gaXMgY2FsbGVkXG4gKiAgd2l0aCBWaXRlJ3MgYGNvbW1hbmRgIChgXCJzZXJ2ZVwiYCBpbiBkZXYsIGBcImJ1aWxkXCJgIGluIHByb2R1Y3Rpb24pIHNvXG4gKiAgdGhlIHVzZXIgY2FuIGJyYW5jaCAodHlwaWNhbCBjYXNlOiBzZXJ2ZSBhdCBgL2AgaW4gZGV2IGJ1dCBhdFxuICogIGAvcmVwby9gIGluIHByb2R1Y3Rpb24gZm9yIEdpdEh1YiBQYWdlcykuIFRoZSBidWlsZCBwaXBlbGluZVxuICogIHJlc29sdmVzIGl0IHRvIGEgc3RyaW5nIGJlZm9yZSBhbnkgcnVudGltZSBzZWVzIGl0LiAqL1xuZXhwb3J0IHR5cGUgQmFzZSA9IHN0cmluZyB8ICgoY29tbWFuZDogXCJidWlsZFwiIHwgXCJzZXJ2ZVwiKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpXG5cbi8qKiBFeHRyYSBzaXRlLXdpZGUgYDxoZWFkPmAgdGFncywgYXBwZW5kZWQgYWZ0ZXIgTGl2ZW1hcmsncyBkZWZhdWx0cy4gQSBtZXRhIHRhZ1xuICogIHNoYXJpbmcgYSBkZWZhdWx0J3MgYG5hbWVgIG9yIGBwcm9wZXJ0eWAgcmVwbGFjZXMgaXQuICovXG5leHBvcnQgdHlwZSBIZWFkID0gei5pbmZlcjx0eXBlb2YgSGVhZD5cbmV4cG9ydCBjb25zdCBIZWFkID0gei5vYmplY3Qoe1xuICBtZXRhOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpKS5vcHRpb25hbCgpLFxuICBsaW5rczogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKSkub3B0aW9uYWwoKSxcbiAgc2NyaXB0czogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKSkub3B0aW9uYWwoKSxcbn0pXG5cbi8qKiBIb3cgYXV0b21hdGVkIHN5c3RlbXMgbWF5IHVzZSB0aGUgc2l0ZSdzIGNvbnRlbnQsIHB1Ymxpc2hlZCBhcyBhXG4gKiAgYENvbnRlbnQtU2lnbmFsYCBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgYHJvYm90cy50eHRgLiAqL1xuZXhwb3J0IHR5cGUgQ29udGVudFNpZ25hbHMgPSB6LmluZmVyPHR5cGVvZiBDb250ZW50U2lnbmFscz5cbmV4cG9ydCBjb25zdCBDb250ZW50U2lnbmFscyA9IHoub2JqZWN0KHtcbiAgc2VhcmNoOiB6LmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxuICBhaUlucHV0OiB6LmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxuICBhaVRyYWluOiB6LmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxufSlcblxuLyoqXG4gKiBVc2VyLXByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gZm9yIExpdmVtYXJrLlxuICpcbiAqIGB2aXRlYCBhbmQgYGJhc2VgIGFyZSBsaWZ0ZWQgZnJvbSBgdW5rbm93bmAgdG8gdGhlaXIgcHVibGljIHR5cGVzIHNvXG4gKiBgZGVmaW5lQ29uZmlnYCBzaG93cyB0aGUgcmlnaHQgc2hhcGUgaW4gZWRpdG9ycy4gVXNlIHRoaXMgdHlwZSBmb3JcbiAqIHRoZSBpbnB1dCB0byBgZGVmaW5lQ29uZmlnYCDigJQgaXQga2VlcHMgZGVmYXVsdGVkIGZpZWxkcyBvcHRpb25hbFxuICogKGJlY2F1c2Ugem9kIGlucHV0IOKJoCBvdXRwdXQgZm9yIGZpZWxkcyB3aXRoIGAuZGVmYXVsdCgpYCkuXG4gKi9cbmV4cG9ydCB0eXBlIFVzZXJDb25maWcgPSBPbWl0PHouaW5wdXQ8dHlwZW9mIFVzZXJDb25maWc+LCBcInZpdGVcIiB8IFwiYmFzZVwiPiAmIHtcbiAgdml0ZT86IFZpdGVPdmVycmlkZVxuICBiYXNlPzogQmFzZVxufVxuZXhwb3J0IGNvbnN0IFVzZXJDb25maWcgPSB6Lm9iamVjdCh7XG4gIHNpdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgLy8gU3RvcmVkIGFzIGB1bmtub3duYCBpbiB0aGUgc2NoZW1hICh6b2QgY2FuJ3QgdHlwZSBhIGZ1bmN0aW9uIGFuZFxuICAvLyBzdHJpbmcgdW5pb24gbWVhbmluZ2Z1bGx5KTsgdGhlIHB1YmxpYyBUeXBlU2NyaXB0IHN1cmZhY2UgYWJvdmVcbiAgLy8gbGlmdHMgaXQgYmFjayB0byBgQmFzZWAgZm9yIGVkaXRvciBzdXBwb3J0LiBUaGUgYnVpbGQgcGlwZWxpbmVcbiAgLy8gcmVzb2x2ZXMgaXQgdmlhIGByZXNvbHZlQmFzZSgpYCBiZWZvcmUgYW55IHJ1bnRpbWUgY29uc3VtZXIgc2Vlc1xuICAvLyBpdCwgc28gdGhlIHJ1bnRpbWUgYFdlYnNpdGVDb25maWcuYmFzZWAgaXMgc3RyaWN0bHkgYHN0cmluZ2AuXG4gIGJhc2U6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG4gIGZhdmljb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbG9nbzogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0aXRsZTogei5zdHJpbmcoKS5kZWZhdWx0KFwiTGl2ZW1hcmtcIiksXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLmRlZmF1bHQoXCJNYXJrZG93biBzaXRlIGdlbmVyYXRvclwiKSxcbiAgYmFubmVyOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGluY2x1ZGU6IHoudW5pb24oW3ouc3RyaW5nKCksIHouYXJyYXkoei5zdHJpbmcoKSldKS5kZWZhdWx0KFwiKiovKi5tZFwiKSxcbiAgZXhjbHVkZTogei51bmlvbihbei5zdHJpbmcoKSwgei5hcnJheSh6LnN0cmluZygpKV0pLm9wdGlvbmFsKCksXG4gIGNvZGVUaGVtZUxpZ2h0OiBDb2RlVGhlbWVMaWdodC5kZWZhdWx0KFwiY2F0cHB1Y2Npbi1sYXR0ZVwiKSxcbiAgY29kZVRoZW1lRGFyazogQ29kZVRoZW1lRGFyay5kZWZhdWx0KFwiY2F0cHB1Y2Npbi1tb2NoYVwiKSxcbiAgbGlua3M6IHouYXJyYXkoTGluaykub3B0aW9uYWwoKSxcbiAgc2VjdGlvbnM6IHouYXJyYXkoU2VjdGlvbikub3B0aW9uYWwoKSxcbiAgcGF0Y2hlczogei5hcnJheShQYXRjaCkub3B0aW9uYWwoKSxcbiAgaGVhZDogSGVhZC5vcHRpb25hbCgpLFxuICBjb250ZW50U2lnbmFsczogQ29udGVudFNpZ25hbHMucHJlZmF1bHQoe30pLFxuICBza2lsbHM6IHoudW5pb24oW3ouc3RyaW5nKCksIHouYXJyYXkoei5zdHJpbmcoKSldKS5vcHRpb25hbCgpLFxuICAvLyBTdG9yZWQgYXMgYHVua25vd25gIGluIHRoZSBzY2hlbWEgKHpvZCBjYW4ndCB0eXBlIGEgVml0ZSBVc2VyQ29uZmlnXG4gIC8vIG9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIG9uZSBtZWFuaW5nZnVsbHkpOyB0aGUgcHVibGljIFR5cGVTY3JpcHRcbiAgLy8gc3VyZmFjZSBhYm92ZSBsaWZ0cyBpdCBiYWNrIHRvIFZpdGVPdmVycmlkZSBmb3IgZWRpdG9yIHN1cHBvcnQuXG4gIHZpdGU6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG59KVxuXG4vKiogV2Vic2l0ZSBjb25maWd1cmF0aW9uIGluamVjdGVkIGF0IGJ1aWxkIHRpbWUgdmlhIFZpdGUgZGVmaW5lLlxuICogIGBiYXNlYCBpcyBzdHJpY3RseSBhIHN0cmluZyBoZXJlIOKAlCB0aGUgYnVpbGQgcGlwZWxpbmUgaGFzIGFscmVhZHlcbiAqICByZXNvbHZlZCBhbnkgZnVuY3Rpb24gZm9ybSB2aWEgYHJlc29sdmVCYXNlKClgLiAqL1xuZXhwb3J0IHR5cGUgV2Vic2l0ZUNvbmZpZyA9IHouaW5mZXI8dHlwZW9mIFdlYnNpdGVDb25maWc+XG5leHBvcnQgY29uc3QgV2Vic2l0ZUNvbmZpZyA9IFVzZXJDb25maWcucGljayh7XG4gIHRpdGxlOiB0cnVlLFxuICBkZXNjcmlwdGlvbjogdHJ1ZSxcbiAgc2l0ZTogdHJ1ZSxcbiAgZmF2aWNvbjogdHJ1ZSxcbiAgbG9nbzogdHJ1ZSxcbiAgYmFubmVyOiB0cnVlLFxuICBsaW5rczogdHJ1ZSxcbiAgc2VjdGlvbnM6IHRydWUsXG4gIGhlYWQ6IHRydWUsXG59KS5leHRlbmQoe1xuICBiYXNlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KVxuXG4vKipcbiAqIFN5c3RlbS1jb21wdXRlZCBjb25maWd1cmF0aW9uIGRlcml2ZWQgZnJvbSB0aGUgY29uZmlnIGZpbGUgbG9jYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFN5c3RlbUNvbmZpZyA9IHouaW5mZXI8dHlwZW9mIFN5c3RlbUNvbmZpZz5cbmV4cG9ydCBjb25zdCBTeXN0ZW1Db25maWcgPSB6Lm9iamVjdCh7XG4gIHJvb3Q6IHouc3RyaW5nKCksXG4gIGNvbmZpZ1BhdGg6IHouc3RyaW5nKCksXG4gIGNvbmZpZ0RlcGVuZGVuY2llczogei5hcnJheSh6LnN0cmluZygpKS5kZWZhdWx0KFtdKSxcbn0pXG5cbi8qKlxuICogRnVsbHkgcmVzb2x2ZWQgTGl2ZW1hcmsgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBgdml0ZWAgc3RheXMgYHVua25vd25gIGJlY2F1c2UgdGhhdCdzIHdoYXQgdGhlIHJ1bnRpbWUgc2NoZW1hXG4gKiBwcm9kdWNlcyDigJQgY29uc3VtZXItZmFjaW5nIHR5cGluZyBoYXBwZW5zIHZpYSB7QGxpbmsgVXNlckNvbmZpZ30gc29cbiAqIGBkZWZpbmVDb25maWdgIHNob3dzIHRoZSByaWdodCBzaGFwZSBpbiBlZGl0b3JzLiBgYmFzZWAgaXMgbGlmdGVkIHRvXG4gKiBgc3RyaW5nIHwgdW5kZWZpbmVkYCBiZWNhdXNlIGBsb2FkQ29uZmlnKClgIHJlc29sdmVzIGFueSBmdW5jdGlvblxuICogZm9ybSB2aWEgYHJlc29sdmVCYXNlKClgIGJlZm9yZSByZXR1cm5pbmcuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZyA9IE9taXQ8ei5pbmZlcjx0eXBlb2YgQ29uZmlnPiwgXCJiYXNlXCI+ICYge1xuICBiYXNlPzogc3RyaW5nXG59XG5leHBvcnQgY29uc3QgQ29uZmlnID0gVXNlckNvbmZpZy5tZXJnZShTeXN0ZW1Db25maWcpXG4iXX0=
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { cpSync, existsSync, rmSync, statSync } from "node:fs";
|
|
2
|
-
import { join, sep } from "node:path";
|
|
1
|
+
import { cpSync, existsSync, readFileSync, rmSync, statSync } from "node:fs";
|
|
2
|
+
import { dirname, join, sep } from "node:path";
|
|
3
3
|
import { mergeConfig } from "vite";
|
|
4
4
|
import packageJson from "../../package.json" with { type: "json" };
|
|
5
5
|
import { buildTarget } from "../actions/target/build.js";
|
|
6
|
+
import { collectLocalImports } from "../helpers/local-imports.js";
|
|
6
7
|
import { renderInlineMarkdown } from "../helpers/render-inline-markdown.js";
|
|
7
8
|
import { excludeTailwindSources } from "../helpers/tailwind-sources.js";
|
|
8
9
|
import { resolveTargetExport } from "../helpers/target-export.js";
|
|
@@ -10,6 +11,13 @@ import { WebsiteConfig } from "../models/config.js";
|
|
|
10
11
|
import { ESCAPABLE_FILES, ESCAPABLE_FOLDERS } from "../settings.js";
|
|
11
12
|
const SOURCE_DIR = join(import.meta.dirname, "..");
|
|
12
13
|
const IS_INSTALLED = SOURCE_DIR.includes(`${sep}node_modules${sep}`);
|
|
14
|
+
const LOCKFILES = [
|
|
15
|
+
"pnpm-lock.yaml",
|
|
16
|
+
"package-lock.json",
|
|
17
|
+
"yarn.lock",
|
|
18
|
+
"bun.lock",
|
|
19
|
+
"bun.lockb",
|
|
20
|
+
];
|
|
13
21
|
/** Single virtual module exposing livemark's runtime values to consumer
|
|
14
22
|
* override files via named exports:
|
|
15
23
|
*
|
|
@@ -95,18 +103,30 @@ export function livemark(opts) {
|
|
|
95
103
|
].join("\n");
|
|
96
104
|
},
|
|
97
105
|
configureServer(server) {
|
|
106
|
+
// Vite restarts only for its own config's imports; the project config's
|
|
107
|
+
// imports and, in livemark's own dev, the content-collections config's
|
|
108
|
+
// imports need it too. A restart rebuilds the target, so no sync is lost.
|
|
109
|
+
const restartFiles = new Set([
|
|
110
|
+
opts.config.configPath,
|
|
111
|
+
...opts.config.configDependencies,
|
|
112
|
+
...(IS_INSTALLED
|
|
113
|
+
? []
|
|
114
|
+
: collectLocalImports(join(SOURCE_DIR, "content-collections.ts"))),
|
|
115
|
+
]);
|
|
98
116
|
// Vite watches only its root (the target); the files the target is
|
|
99
117
|
// copied from join its watcher here. `.livemark/` always exists
|
|
100
118
|
// because the target lives inside it.
|
|
101
|
-
server.watcher.add([
|
|
102
|
-
if (
|
|
119
|
+
server.watcher.add([...restartFiles, overridesRoot]);
|
|
120
|
+
if (IS_INSTALLED)
|
|
121
|
+
watchInstalledVersion(server, opts.config.root);
|
|
122
|
+
else
|
|
103
123
|
server.watcher.add(SOURCE_DIR);
|
|
104
124
|
server.watcher.on("change", file => onChange(file, "change"));
|
|
105
125
|
server.watcher.on("add", file => onChange(file, "add"));
|
|
106
126
|
server.watcher.on("unlink", file => onChange(file, "unlink"));
|
|
107
127
|
server.watcher.on("unlinkDir", file => onChange(file, "unlink"));
|
|
108
128
|
function onChange(file, kind) {
|
|
109
|
-
if (file
|
|
129
|
+
if (restartFiles.has(file)) {
|
|
110
130
|
server.restart();
|
|
111
131
|
return;
|
|
112
132
|
}
|
|
@@ -177,6 +197,52 @@ function syncSource(hit, kind, targetDir, overridesRoot) {
|
|
|
177
197
|
if (existsSync(source))
|
|
178
198
|
cpSync(source, dest, { recursive: true, force: true });
|
|
179
199
|
}
|
|
200
|
+
// A running server keeps the livemark it started with: an in-process restart cannot
|
|
201
|
+
// reload the package's own modules, so an upgrade is reported instead.
|
|
202
|
+
function watchInstalledVersion(server, root) {
|
|
203
|
+
const packageDir = findInstalledPackageDir(root);
|
|
204
|
+
if (!packageDir)
|
|
205
|
+
return;
|
|
206
|
+
// Vite's watcher ignores node_modules, so the lockfile is what signals an install.
|
|
207
|
+
const projectDir = dirname(dirname(packageDir));
|
|
208
|
+
const manifest = join(packageDir, "package.json");
|
|
209
|
+
const watched = LOCKFILES.map(name => join(projectDir, name));
|
|
210
|
+
server.watcher.add(watched);
|
|
211
|
+
let timer;
|
|
212
|
+
server.watcher.on("all", (_, file) => {
|
|
213
|
+
if (!watched.includes(file))
|
|
214
|
+
return;
|
|
215
|
+
clearTimeout(timer);
|
|
216
|
+
// Let the package manager finish relinking after it writes the lockfile.
|
|
217
|
+
timer = setTimeout(reportUpgrade, 1000);
|
|
218
|
+
});
|
|
219
|
+
function reportUpgrade() {
|
|
220
|
+
const version = readPackageVersion(manifest);
|
|
221
|
+
if (!version || version === packageJson.version)
|
|
222
|
+
return;
|
|
223
|
+
server.config.logger.warn(`livemark ${packageJson.version} → ${version} installed; restart the dev server to use it`, { timestamp: true });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function findInstalledPackageDir(root) {
|
|
227
|
+
for (let dir = root;; dir = dirname(dir)) {
|
|
228
|
+
const packageDir = join(dir, "node_modules", packageJson.name);
|
|
229
|
+
if (existsSync(packageDir))
|
|
230
|
+
return packageDir;
|
|
231
|
+
if (dirname(dir) === dir)
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function readPackageVersion(manifest) {
|
|
236
|
+
try {
|
|
237
|
+
const parsed = JSON.parse(readFileSync(manifest, "utf8"));
|
|
238
|
+
return isObject(parsed) && typeof parsed.version === "string"
|
|
239
|
+
? parsed.version
|
|
240
|
+
: undefined;
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
180
246
|
/** Resolve livemark.config.ts's `vite` field — either a config object
|
|
181
247
|
* or a function `(env) => config` (matching Vite's own `defineConfig`).
|
|
182
248
|
* Schema stores it as `unknown`; typing for the consumer's editor
|
|
@@ -193,4 +259,4 @@ async function resolveViteOverride(vite, env) {
|
|
|
193
259
|
function isObject(v) {
|
|
194
260
|
return v !== null && typeof v === "object";
|
|
195
261
|
}
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ2xDLE9BQU8sV0FBVyxNQUFNLG9CQUFvQixDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFBO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUMzRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUVqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBTW5FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDbEQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBRXBFOzs7Ozs7Ozs7Ozs7NkJBWTZCO0FBQzdCLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFBO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQTtBQUU3Qzs7OzttRUFJbUU7QUFDbkUs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cUNBR3FDO0FBQ3JDLEtBQUssVUFBVSxtQkFBbUIsQ0FDaEMsSUFBYSxFQUNiLEdBQWM7SUFFZCxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ3RCLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQzFELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUN6QyxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ3JDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxDQUFVO0lBQzFCLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUE7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNwU3luYywgZXhpc3RzU3luYywgcm1TeW5jLCBzdGF0U3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4sIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHR5cGUgeyBDb25maWdFbnYsIFBsdWdpbiwgVXNlckNvbmZpZyBhcyBWaXRlVXNlckNvbmZpZyB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCB7IG1lcmdlQ29uZmlnIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHBhY2thZ2VKc29uIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfVxuaW1wb3J0IHsgYnVpbGRUYXJnZXQgfSBmcm9tIFwiLi4vYWN0aW9ucy90YXJnZXQvYnVpbGQudHNcIlxuaW1wb3J0IHsgcmVuZGVySW5saW5lTWFya2Rvd24gfSBmcm9tIFwiLi4vaGVscGVycy9yZW5kZXItaW5saW5lLW1hcmtkb3duLnRzXCJcbmltcG9ydCB7IGV4Y2x1ZGVUYWlsd2luZFNvdXJjZXMgfSBmcm9tIFwiLi4vaGVscGVycy90YWlsd2luZC1zb3VyY2VzLnRzXCJcbmltcG9ydCB7IHJlc29sdmVUYXJnZXRFeHBvcnQgfSBmcm9tIFwiLi4vaGVscGVycy90YXJnZXQtZXhwb3J0LnRzXCJcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgV2Vic2l0ZUNvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlnLnRzXCJcbmltcG9ydCB7IEVTQ0FQQUJMRV9GSUxFUywgRVNDQVBBQkxFX0ZPTERFUlMgfSBmcm9tIFwiLi4vc2V0dGluZ3MudHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExpdmVtYXJrT3B0aW9ucyB7XG4gIGNvbmZpZzogQ29uZmlnXG59XG5cbmNvbnN0IFNPVVJDRV9ESVIgPSBqb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIilcbmNvbnN0IElTX0lOU1RBTExFRCA9IFNPVVJDRV9ESVIuaW5jbHVkZXMoYCR7c2VwfW5vZGVfbW9kdWxlcyR7c2VwfWApXG5cbi8qKiBTaW5nbGUgdmlydHVhbCBtb2R1bGUgZXhwb3NpbmcgbGl2ZW1hcmsncyBydW50aW1lIHZhbHVlcyB0byBjb25zdW1lclxuICogIG92ZXJyaWRlIGZpbGVzIHZpYSBuYW1lZCBleHBvcnRzOlxuICpcbiAqICAgICAgaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuICpcbiAqICBDdXJyZW50bHkgZXhwb3J0cyBgY29uZmlnYCAodmFsaWRhdGVkIGBXZWJzaXRlQ29uZmlnYCkgYW5kIGBiYW5uZXJIdG1sYFxuICogIChgY29uZmlnLmJhbm5lcmAgcmVuZGVyZWQgZnJvbSBpbmxpbmUgTWFya2Rvd24gYXQgYnVpbGQgdGltZSk7IGZ1dHVyZVxuICogIGFkZGl0aW9ucyAoZS5nLiBgYXJ0aWNsZXNgLCBgc2VjdGlvbnNgKSBsYW5kIGhlcmUgYXMgbmV3IG5hbWVkXG4gKiAgZXhwb3J0cyB3aXRob3V0IGNvbnN1bWVycyBjaGFuZ2luZyB0aGVpciBpbXBvcnQgc3RhdGVtZW50cy5cbiAqXG4gKiAgVGhlIGBcXDBgIHByZWZpeCBvbiB0aGUgcmVzb2x2ZWQgaWQgaXMgVml0ZSdzIGNvbnZlbnRpb24gdG8gc2lnbmFsXG4gKiAgXCJ0aGlzIGlzIGEgdmlydHVhbCBtb2R1bGUg4oCUIG5vIG90aGVyIHBsdWdpbiBzaG91bGQgdHJ5IHRvIHJlc29sdmVcbiAqICBvciBsb2FkIGl0IGZyb20gZGlza1wiLiAqL1xuY29uc3QgVklSVFVBTF9JRCA9IFwibGl2ZW1hcms6dmlydHVhbFwiXG5jb25zdCBWSVJUVUFMX1JFU09MVkVEX0lEID0gYFxcMCR7VklSVFVBTF9JRH1gXG5cbi8qKiBPd25zIHRoZSBwcm9qZWN0J3MgYC5saXZlbWFyay8udGFyZ2V0L2AgbW91bnQ6IHN5bnRoZXNpemVzIGl0IHZpYVxuICogIGBidWlsZFRhcmdldCgpYCwgcmV0dXJucyB0aGUgVml0ZSBjb25maWcgdGhhdCBhbmNob3JzIHRoZXJlLCBhbmRcbiAqICBjb3BpZXMgYC5saXZlbWFyay9gIGVkaXRzIChwbHVzIGxpdmVtYXJrJ3MgYHNvdXJjZS9gIGluIGl0cyBvd24gZGV2KVxuICogIGludG8gdGhlIHRhcmdldC4gVml0ZSB3YXRjaGVzIHRoZSB0YXJnZXQgbmF0aXZlbHksIHNvIGl0cyBvd24gSE1SXG4gKiAgZGVjaWRlcyBiZXR3ZWVuIEZhc3QgUmVmcmVzaCwgQ1NTIHVwZGF0ZXMgYW5kIGEgcGFnZSByZWxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gbGl2ZW1hcmsob3B0czogTGl2ZW1hcmtPcHRpb25zKTogUGx1Z2luIHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IGpvaW4ob3B0cy5jb25maWcucm9vdCwgXCIubGl2ZW1hcmtcIilcbiAgY29uc3Qgb3V0RGlyID0gam9pbihvdmVycmlkZXNSb290LCBcImJ1aWxkXCIpXG4gIGxldCB0YXJnZXREaXIgPSBcIlwiXG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJsaXZlbWFya1wiLFxuICAgIGVuZm9yY2U6IFwicHJlXCIsXG4gICAgYXN5bmMgY29uZmlnKF8sIGVudikge1xuICAgICAgdGFyZ2V0RGlyID0gYnVpbGRUYXJnZXQoe1xuICAgICAgICBjb25maWdQYXRoOiBvcHRzLmNvbmZpZy5jb25maWdQYXRoLFxuICAgICAgICBzb3VyY2VEaXI6IFNPVVJDRV9ESVIsXG4gICAgICB9KVxuICAgICAgY29uc3QgYmFzZTogVml0ZVVzZXJDb25maWcgPSB7XG4gICAgICAgIHJvb3Q6IHRhcmdldERpcixcbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgYDxyb290Pi9ub2RlX21vZHVsZXMvLnZpdGVgIHdvdWxkIGxhbmQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBkZXBlbmRlbmN5IGxpbmssIGkuZS4gaW4gbGl2ZW1hcmsncyBzaGFyZWQgaW5zdGFsbC5cbiAgICAgICAgY2FjaGVEaXI6IGpvaW4odGFyZ2V0RGlyLCBcIi52aXRlXCIpLFxuICAgICAgICAvLyBNb3VudCBldmVyeXRoaW5nIChhc3NldCBVUkxzLCBtb2R1bGVwcmVsb2FkcywgZGV2IHNlcnZlcikgdW5kZXJcbiAgICAgICAgLy8gYGNvbmZpZy5iYXNlYCBzbyB0aGUgc2FtZSBidWlsZCB3b3JrcyBhdCByb290IG9yIGF0IGEgc3ViLXBhdGhcbiAgICAgICAgLy8gKGUuZy4gR2l0SHViIFBhZ2VzIGBodHRwczovL3VzZXIuZ2l0aHViLmlvL3JlcG8vYCkuIFRoZSByb3V0ZXJcbiAgICAgICAgLy8gYW5kIGFzc2V0LXBhdGggcmVzb2x2ZXIgbWlycm9yIHRoaXMgYXQgcnVudGltZS5cbiAgICAgICAgYmFzZTogb3B0cy5jb25maWcuYmFzZSA/IGAke29wdHMuY29uZmlnLmJhc2V9L2AgOiBcIi9cIixcbiAgICAgICAgLy8gb3V0RGlyIGxpdmVzIG91dHNpZGUgdGhlIHRhcmdldCByb290LCBzbyBWaXRlJ3MgcmVmdXNhbCB0b1xuICAgICAgICAvLyBlbXB0eSBvdXQtb2Ytcm9vdCBkaXJlY3RvcmllcyBuZWVkcyBgZW1wdHlPdXREaXJgLlxuICAgICAgICBidWlsZDogeyBvdXREaXIsIGVtcHR5T3V0RGlyOiB0cnVlIH0sXG4gICAgICAgIHJlc29sdmU6IHsgZGVkdXBlOiBbXCJyZWFjdFwiLCBcInJlYWN0LWRvbVwiXSB9LFxuICAgICAgICAvLyBGb3IgdGhlIFNTUiBidWlsZCBvbmx5LCBpbmxpbmUgZXZlcnkgbm9kZV9tb2R1bGVzIGRlcCBpbnRvXG4gICAgICAgIC8vIHNlcnZlci5qcy4gVGhlIHByZXJlbmRlciBzdGVwICh3aGljaCBydW5zIHNlcnZlci5qcyB3aXRoXG4gICAgICAgIC8vIE5vZGUpIHdhbGtzIG5vZGVfbW9kdWxlcyBmcm9tIHRoZSBidWlsZC8gZGlyIGFuZCBjYW4ndCByZWFjaFxuICAgICAgICAvLyBwYWNrYWdlcyBidXJpZWQgaW4gcG5wbSdzIGAucG5wbS8qL25vZGVfbW9kdWxlcy9gIChlLmcuXG4gICAgICAgIC8vIFRhblN0YWNrLWludGVybmFsIGFsaWFzZXMgbGlrZSBgaDMtdjJgKS4gU2VsZi1jb250YWluZWRcbiAgICAgICAgLy8gYnVuZGxlIGJ5cGFzc2VzIHRoZSBpc3N1ZS4gRGV2IFNTUiBrZWVwcyBleHRlcm5hbHMgKGZhc3RlcikuXG4gICAgICAgIC4uLihlbnYuY29tbWFuZCA9PT0gXCJidWlsZFwiICYmIHtcbiAgICAgICAgICBlbnZpcm9ubWVudHM6IHsgc3NyOiB7IHJlc29sdmU6IHsgbm9FeHRlcm5hbDogdHJ1ZSB9IH0gfSxcbiAgICAgICAgfSksXG4gICAgICB9XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGF3YWl0IHJlc29sdmVWaXRlT3ZlcnJpZGUob3B0cy5jb25maWcudml0ZSwgZW52KVxuICAgICAgcmV0dXJuIG92ZXJyaWRlID8gbWVyZ2VDb25maWcoYmFzZSwgb3ZlcnJpZGUpIDogYmFzZVxuICAgIH0sXG4gICAgLy8gSGVyZSwgbm90IGluIGBzdHlsZXMvZ2VuZXJhbC5jc3NgLCBzbyBhbiBlc2NhcGVkIHN0eWxlc2hlZXQga2VlcHMgaXQuIFdvcmtzIG9ubHlcbiAgICAvLyB3aGlsZSB0aGlzIHBsdWdpbiBwcmVjZWRlcyBgdGFpbHdpbmQoKWA6IGJvdGggYXJlIGBwcmVgLCBzbyBhcnJheSBvcmRlciBkZWNpZGVzLlxuICAgIHRyYW5zZm9ybToge1xuICAgICAgZmlsdGVyOiB7IGlkOiAvXFwuY3NzKFxcP3wkKS8gfSxcbiAgICAgIGhhbmRsZXIoY3NzKSB7XG4gICAgICAgIHJldHVybiBleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSlcbiAgICAgIH0sXG4gICAgfSxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmIChpZCA9PT0gVklSVFVBTF9JRCkgcmV0dXJuIFZJUlRVQUxfUkVTT0xWRURfSURcbiAgICAgIHJldHVybiByZXNvbHZlVGFyZ2V0RXhwb3J0KHsgaWQsIHRhcmdldERpciwgZXhwb3J0czogcGFja2FnZUpzb24uZXhwb3J0cyB9KSA/PyBudWxsXG4gICAgfSxcbiAgICBsb2FkKGlkKSB7XG4gICAgICBpZiAoaWQgIT09IFZJUlRVQUxfUkVTT0xWRURfSUQpIHJldHVybiBudWxsXG4gICAgICBjb25zdCBjb25maWcgPSBXZWJzaXRlQ29uZmlnLnBhcnNlKG9wdHMuY29uZmlnKVxuICAgICAgY29uc3QgYmFubmVySHRtbCA9IGNvbmZpZy5iYW5uZXJcbiAgICAgICAgPyByZW5kZXJJbmxpbmVNYXJrZG93bihjb25maWcuYmFubmVyLCBjb25maWcuYmFzZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGBleHBvcnQgY29uc3QgY29uZmlnID0gJHtKU09OLnN0cmluZ2lmeShjb25maWcpfWAsXG4gICAgICAgIGBleHBvcnQgY29uc3QgYmFubmVySHRtbCA9ICR7SlNPTi5zdHJpbmdpZnkoYmFubmVySHRtbCl9YCxcbiAgICAgIF0uam9pbihcIlxcblwiKVxuICAgIH0sXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgLy8gVml0ZSB3YXRjaGVzIG9ubHkgaXRzIHJvb3QgKHRoZSB0YXJnZXQpOyB0aGUgZmlsZXMgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gY29waWVkIGZyb20gam9pbiBpdHMgd2F0Y2hlciBoZXJlLiBgLmxpdmVtYXJrL2AgYWx3YXlzIGV4aXN0c1xuICAgICAgLy8gYmVjYXVzZSB0aGUgdGFyZ2V0IGxpdmVzIGluc2lkZSBpdC5cbiAgICAgIHNlcnZlci53YXRjaGVyLmFkZChbb3B0cy5jb25maWcuY29uZmlnUGF0aCwgb3ZlcnJpZGVzUm9vdF0pXG4gICAgICBpZiAoIUlTX0lOU1RBTExFRCkgc2VydmVyLndhdGNoZXIuYWRkKFNPVVJDRV9ESVIpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcImNoYW5nZVwiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwiY2hhbmdlXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJhZGRcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcImFkZFwiKSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwidW5saW5rXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJ1bmxpbmtcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcInVubGlua0RpclwiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwidW5saW5rXCIpKVxuXG4gICAgICBmdW5jdGlvbiBvbkNoYW5nZShmaWxlOiBzdHJpbmcsIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIikge1xuICAgICAgICBpZiAoZmlsZSA9PT0gb3B0cy5jb25maWcuY29uZmlnUGF0aCkge1xuICAgICAgICAgIHNlcnZlci5yZXN0YXJ0KClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNXaXRoaW4oZmlsZSwgdGFyZ2V0RGlyKSB8fCBpc1dpdGhpbihmaWxlLCBvdXREaXIpKSByZXR1cm5cbiAgICAgICAgY29uc3Qgb3ZlcmxheUhpdCA9IG1hdGNoUGF0aChmaWxlLCBvdmVycmlkZXNSb290KVxuICAgICAgICBpZiAob3ZlcmxheUhpdCkge1xuICAgICAgICAgIHN5bmNPdmVybGF5KG92ZXJsYXlIaXQsIGtpbmQsIHRhcmdldERpciwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VIaXQgPSBtYXRjaFBhdGgoZmlsZSwgU09VUkNFX0RJUilcbiAgICAgICAgaWYgKHNvdXJjZUhpdCAmJiAhc291cmNlSGl0LnJlbC5pbmNsdWRlcyhcInJvdXRlVHJlZS5nZW4udHNcIikpIHtcbiAgICAgICAgICBzeW5jU291cmNlKHNvdXJjZUhpdCwga2luZCwgdGFyZ2V0RGlyLCBvdmVycmlkZXNSb290KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuXG5pbnRlcmZhY2UgSGl0IHtcbiAgcmVsOiBzdHJpbmdcbiAgY2F0ZWdvcnk6IFwiZm9sZGVyXCIgfCBcImZpbGVcIiB8IG51bGxcbn1cblxuZnVuY3Rpb24gbWF0Y2hQYXRoKGZpbGU6IHN0cmluZywgcm9vdDogc3RyaW5nKTogSGl0IHwgbnVsbCB7XG4gIGlmICghaXNXaXRoaW4oZmlsZSwgcm9vdCkgfHwgZmlsZSA9PT0gcm9vdCkgcmV0dXJuIG51bGxcbiAgY29uc3QgcmVsID0gZmlsZS5zbGljZShyb290Lmxlbmd0aCArIHNlcC5sZW5ndGgpXG4gIHJldHVybiB7IHJlbCwgY2F0ZWdvcnk6IGNsYXNzaWZ5KHJlbCkgfVxufVxuXG5mdW5jdGlvbiBpc1dpdGhpbihmaWxlOiBzdHJpbmcsIGRpcjogc3RyaW5nKSB7XG4gIHJldHVybiBmaWxlID09PSBkaXIgfHwgZmlsZS5zdGFydHNXaXRoKGAke2Rpcn0ke3NlcH1gKVxufVxuXG5mdW5jdGlvbiBjbGFzc2lmeShyZWw6IHN0cmluZyk6IFwiZm9sZGVyXCIgfCBcImZpbGVcIiB8IG51bGwge1xuICBjb25zdCBbaGVhZF0gPSByZWwuc3BsaXQoc2VwKVxuICBpZiAoaGVhZCAmJiBFU0NBUEFCTEVfRk9MREVSUy5pbmNsdWRlcyhoZWFkKSkgcmV0dXJuIFwiZm9sZGVyXCJcbiAgaWYgKEVTQ0FQQUJMRV9GSUxFUy5pbmNsdWRlcyhyZWwpKSByZXR1cm4gXCJmaWxlXCJcbiAgLy8gTm9uLWVzY2FwYWJsZSBzb3VyY2UgZmlsZXMgc3RpbGwgbmVlZCB0byBmbG93IGludG8gdGFyZ2V0IGR1cmluZ1xuICAvLyBsaXZlbWFyaydzIG93biBkZXYg4oCUIHRoZSB1c2VyIGlzIGVkaXRpbmcgdGhlIGNhbm9uaWNhbCBzb3VyY2UuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHN5bmNPdmVybGF5KFxuICBoaXQ6IEhpdCxcbiAga2luZDogXCJjaGFuZ2VcIiB8IFwiYWRkXCIgfCBcInVubGlua1wiLFxuICB0YXJnZXREaXI6IHN0cmluZyxcbiAgb3ZlcnJpZGVzUm9vdDogc3RyaW5nLFxuKSB7XG4gIGlmICghaGl0LmNhdGVnb3J5KSByZXR1cm5cbiAgY29uc3QgZGVzdCA9IGpvaW4odGFyZ2V0RGlyLCBoaXQucmVsKVxuICBjb25zdCBzb3VyY2UgPSBqb2luKFNPVVJDRV9ESVIsIGhpdC5yZWwpXG4gIGlmIChraW5kID09PSBcInVubGlua1wiKSB7XG4gICAgLy8gQ29weSBhIGZpbGUncyBkZWZhdWx0IG92ZXIgdGhlIGVzY2FwZSBpbiBvbmUgd3JpdGU6IGFuIHVubGluayB0aGVuXG4gICAgLy8gYW4gYWRkIHJlYWNoZXMgVml0ZSBhcyB0d28gZXZlbnRzIGFuZCBjb3N0cyBhIHBhZ2UgcmVsb2FkLlxuICAgIGlmICghZXhpc3RzU3luYyhzb3VyY2UpIHx8IHN0YXRTeW5jKHNvdXJjZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcm1TeW5jKGRlc3QsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgICBpZiAoZXhpc3RzU3luYyhzb3VyY2UpKSBjcFN5bmMoc291cmNlLCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBvdmVybGF5ID0gam9pbihvdmVycmlkZXNSb290LCBoaXQucmVsKVxuICBpZiAoZXhpc3RzU3luYyhvdmVybGF5KSkgY3BTeW5jKG92ZXJsYXksIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxufVxuXG5mdW5jdGlvbiBzeW5jU291cmNlKFxuICBoaXQ6IEhpdCxcbiAga2luZDogXCJjaGFuZ2VcIiB8IFwiYWRkXCIgfCBcInVubGlua1wiLFxuICB0YXJnZXREaXI6IHN0cmluZyxcbiAgb3ZlcnJpZGVzUm9vdDogc3RyaW5nLFxuKSB7XG4gIC8vIElmIHRoZSBjb25zdW1lciBoYXMgYW4gb3ZlcmxheSBmb3IgdGhpcyBmaWxlIChhbmQgaXQncyBlc2NhcGFibGUpLFxuICAvLyB0aGUgb3ZlcmxheSB3aW5zIOKAlCBpZ25vcmUgc291cmNlIGNoYW5nZXMuXG4gIGlmIChoaXQuY2F0ZWdvcnkgJiYgZXhpc3RzU3luYyhqb2luKG92ZXJyaWRlc1Jvb3QsIGhpdC5yZWwpKSkgcmV0dXJuXG4gIGNvbnN0IGRlc3QgPSBqb2luKHRhcmdldERpciwgaGl0LnJlbClcbiAgY29uc3Qgc291cmNlID0gam9pbihTT1VSQ0VfRElSLCBoaXQucmVsKVxuICBpZiAoa2luZCA9PT0gXCJ1bmxpbmtcIikge1xuICAgIHJtU3luYyhkZXN0LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZXhpc3RzU3luYyhzb3VyY2UpKSBjcFN5bmMoc291cmNlLCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxuLyoqIFJlc29sdmUgbGl2ZW1hcmsuY29uZmlnLnRzJ3MgYHZpdGVgIGZpZWxkIOKAlCBlaXRoZXIgYSBjb25maWcgb2JqZWN0XG4gKiAgb3IgYSBmdW5jdGlvbiBgKGVudikgPT4gY29uZmlnYCAobWF0Y2hpbmcgVml0ZSdzIG93biBgZGVmaW5lQ29uZmlnYCkuXG4gKiAgU2NoZW1hIHN0b3JlcyBpdCBhcyBgdW5rbm93bmA7IHR5cGluZyBmb3IgdGhlIGNvbnN1bWVyJ3MgZWRpdG9yXG4gKiAgbGl2ZXMgb24ge0BsaW5rIFZpdGVPdmVycmlkZX0uICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVml0ZU92ZXJyaWRlKFxuICB2aXRlOiB1bmtub3duLFxuICBlbnY6IENvbmZpZ0Vudixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPiB7XG4gIGlmICghdml0ZSkgcmV0dXJuIG51bGxcbiAgaWYgKHR5cGVvZiB2aXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBSZWZsZWN0LmFwcGx5KHZpdGUsIHVuZGVmaW5lZCwgW2Vudl0pXG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBudWxsXG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KHZpdGUpID8gdml0ZSA6IG51bGxcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxufVxuIl19
|
|
262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRTlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEMsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBRWpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFNbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUNsRCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDcEUsTUFBTSxTQUFTLEdBQUc7SUFDaEIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixXQUFX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SUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDbEUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFDM0QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQ2hCLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDZixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7O3FDQUdxQztBQUNyQyxLQUFLLFVBQVUsbUJBQW1CLENBQ2hDLElBQWEsRUFDYixHQUFjO0lBRWQsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUN0QixJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUMxRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDekMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNyQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVTtJQUMxQixPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcFN5bmMsIGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCBzdGF0U3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHR5cGUgeyBDb25maWdFbnYsIFBsdWdpbiwgVXNlckNvbmZpZyBhcyBWaXRlVXNlckNvbmZpZywgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCB7IG1lcmdlQ29uZmlnIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHBhY2thZ2VKc29uIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfVxuaW1wb3J0IHsgYnVpbGRUYXJnZXQgfSBmcm9tIFwiLi4vYWN0aW9ucy90YXJnZXQvYnVpbGQudHNcIlxuaW1wb3J0IHsgY29sbGVjdExvY2FsSW1wb3J0cyB9IGZyb20gXCIuLi9oZWxwZXJzL2xvY2FsLWltcG9ydHMudHNcIlxuaW1wb3J0IHsgcmVuZGVySW5saW5lTWFya2Rvd24gfSBmcm9tIFwiLi4vaGVscGVycy9yZW5kZXItaW5saW5lLW1hcmtkb3duLnRzXCJcbmltcG9ydCB7IGV4Y2x1ZGVUYWlsd2luZFNvdXJjZXMgfSBmcm9tIFwiLi4vaGVscGVycy90YWlsd2luZC1zb3VyY2VzLnRzXCJcbmltcG9ydCB7IHJlc29sdmVUYXJnZXRFeHBvcnQgfSBmcm9tIFwiLi4vaGVscGVycy90YXJnZXQtZXhwb3J0LnRzXCJcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgV2Vic2l0ZUNvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlnLnRzXCJcbmltcG9ydCB7IEVTQ0FQQUJMRV9GSUxFUywgRVNDQVBBQkxFX0ZPTERFUlMgfSBmcm9tIFwiLi4vc2V0dGluZ3MudHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExpdmVtYXJrT3B0aW9ucyB7XG4gIGNvbmZpZzogQ29uZmlnXG59XG5cbmNvbnN0IFNPVVJDRV9ESVIgPSBqb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIilcbmNvbnN0IElTX0lOU1RBTExFRCA9IFNPVVJDRV9ESVIuaW5jbHVkZXMoYCR7c2VwfW5vZGVfbW9kdWxlcyR7c2VwfWApXG5jb25zdCBMT0NLRklMRVMgPSBbXG4gIFwicG5wbS1sb2NrLnlhbWxcIixcbiAgXCJwYWNrYWdlLWxvY2suanNvblwiLFxuICBcInlhcm4ubG9ja1wiLFxuICBcImJ1bi5sb2NrXCIsXG4gIFwiYnVuLmxvY2tiXCIsXG5dXG5cbi8qKiBTaW5nbGUgdmlydHVhbCBtb2R1bGUgZXhwb3NpbmcgbGl2ZW1hcmsncyBydW50aW1lIHZhbHVlcyB0byBjb25zdW1lclxuICogIG92ZXJyaWRlIGZpbGVzIHZpYSBuYW1lZCBleHBvcnRzOlxuICpcbiAqICAgICAgaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuICpcbiAqICBDdXJyZW50bHkgZXhwb3J0cyBgY29uZmlnYCAodmFsaWRhdGVkIGBXZWJzaXRlQ29uZmlnYCkgYW5kIGBiYW5uZXJIdG1sYFxuICogIChgY29uZmlnLmJhbm5lcmAgcmVuZGVyZWQgZnJvbSBpbmxpbmUgTWFya2Rvd24gYXQgYnVpbGQgdGltZSk7IGZ1dHVyZVxuICogIGFkZGl0aW9ucyAoZS5nLiBgYXJ0aWNsZXNgLCBgc2VjdGlvbnNgKSBsYW5kIGhlcmUgYXMgbmV3IG5hbWVkXG4gKiAgZXhwb3J0cyB3aXRob3V0IGNvbnN1bWVycyBjaGFuZ2luZyB0aGVpciBpbXBvcnQgc3RhdGVtZW50cy5cbiAqXG4gKiAgVGhlIGBcXDBgIHByZWZpeCBvbiB0aGUgcmVzb2x2ZWQgaWQgaXMgVml0ZSdzIGNvbnZlbnRpb24gdG8gc2lnbmFsXG4gKiAgXCJ0aGlzIGlzIGEgdmlydHVhbCBtb2R1bGUg4oCUIG5vIG90aGVyIHBsdWdpbiBzaG91bGQgdHJ5IHRvIHJlc29sdmVcbiAqICBvciBsb2FkIGl0IGZyb20gZGlza1wiLiAqL1xuY29uc3QgVklSVFVBTF9JRCA9IFwibGl2ZW1hcms6dmlydHVhbFwiXG5jb25zdCBWSVJUVUFMX1JFU09MVkVEX0lEID0gYFxcMCR7VklSVFVBTF9JRH1gXG5cbi8qKiBPd25zIHRoZSBwcm9qZWN0J3MgYC5saXZlbWFyay8udGFyZ2V0L2AgbW91bnQ6IHN5bnRoZXNpemVzIGl0IHZpYVxuICogIGBidWlsZFRhcmdldCgpYCwgcmV0dXJucyB0aGUgVml0ZSBjb25maWcgdGhhdCBhbmNob3JzIHRoZXJlLCBhbmRcbiAqICBjb3BpZXMgYC5saXZlbWFyay9gIGVkaXRzIChwbHVzIGxpdmVtYXJrJ3MgYHNvdXJjZS9gIGluIGl0cyBvd24gZGV2KVxuICogIGludG8gdGhlIHRhcmdldC4gVml0ZSB3YXRjaGVzIHRoZSB0YXJnZXQgbmF0aXZlbHksIHNvIGl0cyBvd24gSE1SXG4gKiAgZGVjaWRlcyBiZXR3ZWVuIEZhc3QgUmVmcmVzaCwgQ1NTIHVwZGF0ZXMgYW5kIGEgcGFnZSByZWxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gbGl2ZW1hcmsob3B0czogTGl2ZW1hcmtPcHRpb25zKTogUGx1Z2luIHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IGpvaW4ob3B0cy5jb25maWcucm9vdCwgXCIubGl2ZW1hcmtcIilcbiAgY29uc3Qgb3V0RGlyID0gam9pbihvdmVycmlkZXNSb290LCBcImJ1aWxkXCIpXG4gIGxldCB0YXJnZXREaXIgPSBcIlwiXG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJsaXZlbWFya1wiLFxuICAgIGVuZm9yY2U6IFwicHJlXCIsXG4gICAgYXN5bmMgY29uZmlnKF8sIGVudikge1xuICAgICAgdGFyZ2V0RGlyID0gYnVpbGRUYXJnZXQoe1xuICAgICAgICBjb25maWdQYXRoOiBvcHRzLmNvbmZpZy5jb25maWdQYXRoLFxuICAgICAgICBzb3VyY2VEaXI6IFNPVVJDRV9ESVIsXG4gICAgICB9KVxuICAgICAgY29uc3QgYmFzZTogVml0ZVVzZXJDb25maWcgPSB7XG4gICAgICAgIHJvb3Q6IHRhcmdldERpcixcbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgYDxyb290Pi9ub2RlX21vZHVsZXMvLnZpdGVgIHdvdWxkIGxhbmQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBkZXBlbmRlbmN5IGxpbmssIGkuZS4gaW4gbGl2ZW1hcmsncyBzaGFyZWQgaW5zdGFsbC5cbiAgICAgICAgY2FjaGVEaXI6IGpvaW4odGFyZ2V0RGlyLCBcIi52aXRlXCIpLFxuICAgICAgICAvLyBNb3VudCBldmVyeXRoaW5nIChhc3NldCBVUkxzLCBtb2R1bGVwcmVsb2FkcywgZGV2IHNlcnZlcikgdW5kZXJcbiAgICAgICAgLy8gYGNvbmZpZy5iYXNlYCBzbyB0aGUgc2FtZSBidWlsZCB3b3JrcyBhdCByb290IG9yIGF0IGEgc3ViLXBhdGhcbiAgICAgICAgLy8gKGUuZy4gR2l0SHViIFBhZ2VzIGBodHRwczovL3VzZXIuZ2l0aHViLmlvL3JlcG8vYCkuIFRoZSByb3V0ZXJcbiAgICAgICAgLy8gYW5kIGFzc2V0LXBhdGggcmVzb2x2ZXIgbWlycm9yIHRoaXMgYXQgcnVudGltZS5cbiAgICAgICAgYmFzZTogb3B0cy5jb25maWcuYmFzZSA/IGAke29wdHMuY29uZmlnLmJhc2V9L2AgOiBcIi9cIixcbiAgICAgICAgLy8gb3V0RGlyIGxpdmVzIG91dHNpZGUgdGhlIHRhcmdldCByb290LCBzbyBWaXRlJ3MgcmVmdXNhbCB0b1xuICAgICAgICAvLyBlbXB0eSBvdXQtb2Ytcm9vdCBkaXJlY3RvcmllcyBuZWVkcyBgZW1wdHlPdXREaXJgLlxuICAgICAgICBidWlsZDogeyBvdXREaXIsIGVtcHR5T3V0RGlyOiB0cnVlIH0sXG4gICAgICAgIHJlc29sdmU6IHsgZGVkdXBlOiBbXCJyZWFjdFwiLCBcInJlYWN0LWRvbVwiXSB9LFxuICAgICAgICAvLyBGb3IgdGhlIFNTUiBidWlsZCBvbmx5LCBpbmxpbmUgZXZlcnkgbm9kZV9tb2R1bGVzIGRlcCBpbnRvXG4gICAgICAgIC8vIHNlcnZlci5qcy4gVGhlIHByZXJlbmRlciBzdGVwICh3aGljaCBydW5zIHNlcnZlci5qcyB3aXRoXG4gICAgICAgIC8vIE5vZGUpIHdhbGtzIG5vZGVfbW9kdWxlcyBmcm9tIHRoZSBidWlsZC8gZGlyIGFuZCBjYW4ndCByZWFjaFxuICAgICAgICAvLyBwYWNrYWdlcyBidXJpZWQgaW4gcG5wbSdzIGAucG5wbS8qL25vZGVfbW9kdWxlcy9gIChlLmcuXG4gICAgICAgIC8vIFRhblN0YWNrLWludGVybmFsIGFsaWFzZXMgbGlrZSBgaDMtdjJgKS4gU2VsZi1jb250YWluZWRcbiAgICAgICAgLy8gYnVuZGxlIGJ5cGFzc2VzIHRoZSBpc3N1ZS4gRGV2IFNTUiBrZWVwcyBleHRlcm5hbHMgKGZhc3RlcikuXG4gICAgICAgIC4uLihlbnYuY29tbWFuZCA9PT0gXCJidWlsZFwiICYmIHtcbiAgICAgICAgICBlbnZpcm9ubWVudHM6IHsgc3NyOiB7IHJlc29sdmU6IHsgbm9FeHRlcm5hbDogdHJ1ZSB9IH0gfSxcbiAgICAgICAgfSksXG4gICAgICB9XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGF3YWl0IHJlc29sdmVWaXRlT3ZlcnJpZGUob3B0cy5jb25maWcudml0ZSwgZW52KVxuICAgICAgcmV0dXJuIG92ZXJyaWRlID8gbWVyZ2VDb25maWcoYmFzZSwgb3ZlcnJpZGUpIDogYmFzZVxuICAgIH0sXG4gICAgLy8gSGVyZSwgbm90IGluIGBzdHlsZXMvZ2VuZXJhbC5jc3NgLCBzbyBhbiBlc2NhcGVkIHN0eWxlc2hlZXQga2VlcHMgaXQuIFdvcmtzIG9ubHlcbiAgICAvLyB3aGlsZSB0aGlzIHBsdWdpbiBwcmVjZWRlcyBgdGFpbHdpbmQoKWA6IGJvdGggYXJlIGBwcmVgLCBzbyBhcnJheSBvcmRlciBkZWNpZGVzLlxuICAgIHRyYW5zZm9ybToge1xuICAgICAgZmlsdGVyOiB7IGlkOiAvXFwuY3NzKFxcP3wkKS8gfSxcbiAgICAgIGhhbmRsZXIoY3NzKSB7XG4gICAgICAgIHJldHVybiBleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSlcbiAgICAgIH0sXG4gICAgfSxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmIChpZCA9PT0gVklSVFVBTF9JRCkgcmV0dXJuIFZJUlRVQUxfUkVTT0xWRURfSURcbiAgICAgIHJldHVybiByZXNvbHZlVGFyZ2V0RXhwb3J0KHsgaWQsIHRhcmdldERpciwgZXhwb3J0czogcGFja2FnZUpzb24uZXhwb3J0cyB9KSA/PyBudWxsXG4gICAgfSxcbiAgICBsb2FkKGlkKSB7XG4gICAgICBpZiAoaWQgIT09IFZJUlRVQUxfUkVTT0xWRURfSUQpIHJldHVybiBudWxsXG4gICAgICBjb25zdCBjb25maWcgPSBXZWJzaXRlQ29uZmlnLnBhcnNlKG9wdHMuY29uZmlnKVxuICAgICAgY29uc3QgYmFubmVySHRtbCA9IGNvbmZpZy5iYW5uZXJcbiAgICAgICAgPyByZW5kZXJJbmxpbmVNYXJrZG93bihjb25maWcuYmFubmVyLCBjb25maWcuYmFzZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGBleHBvcnQgY29uc3QgY29uZmlnID0gJHtKU09OLnN0cmluZ2lmeShjb25maWcpfWAsXG4gICAgICAgIGBleHBvcnQgY29uc3QgYmFubmVySHRtbCA9ICR7SlNPTi5zdHJpbmdpZnkoYmFubmVySHRtbCl9YCxcbiAgICAgIF0uam9pbihcIlxcblwiKVxuICAgIH0sXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgLy8gVml0ZSByZXN0YXJ0cyBvbmx5IGZvciBpdHMgb3duIGNvbmZpZydzIGltcG9ydHM7IHRoZSBwcm9qZWN0IGNvbmZpZydzXG4gICAgICAvLyBpbXBvcnRzIGFuZCwgaW4gbGl2ZW1hcmsncyBvd24gZGV2LCB0aGUgY29udGVudC1jb2xsZWN0aW9ucyBjb25maWcnc1xuICAgICAgLy8gaW1wb3J0cyBuZWVkIGl0IHRvby4gQSByZXN0YXJ0IHJlYnVpbGRzIHRoZSB0YXJnZXQsIHNvIG5vIHN5bmMgaXMgbG9zdC5cbiAgICAgIGNvbnN0IHJlc3RhcnRGaWxlcyA9IG5ldyBTZXQoW1xuICAgICAgICBvcHRzLmNvbmZpZy5jb25maWdQYXRoLFxuICAgICAgICAuLi5vcHRzLmNvbmZpZy5jb25maWdEZXBlbmRlbmNpZXMsXG4gICAgICAgIC4uLihJU19JTlNUQUxMRURcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBjb2xsZWN0TG9jYWxJbXBvcnRzKGpvaW4oU09VUkNFX0RJUiwgXCJjb250ZW50LWNvbGxlY3Rpb25zLnRzXCIpKSksXG4gICAgICBdKVxuICAgICAgLy8gVml0ZSB3YXRjaGVzIG9ubHkgaXRzIHJvb3QgKHRoZSB0YXJnZXQpOyB0aGUgZmlsZXMgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gY29waWVkIGZyb20gam9pbiBpdHMgd2F0Y2hlciBoZXJlLiBgLmxpdmVtYXJrL2AgYWx3YXlzIGV4aXN0c1xuICAgICAgLy8gYmVjYXVzZSB0aGUgdGFyZ2V0IGxpdmVzIGluc2lkZSBpdC5cbiAgICAgIHNlcnZlci53YXRjaGVyLmFkZChbLi4ucmVzdGFydEZpbGVzLCBvdmVycmlkZXNSb290XSlcbiAgICAgIGlmIChJU19JTlNUQUxMRUQpIHdhdGNoSW5zdGFsbGVkVmVyc2lvbihzZXJ2ZXIsIG9wdHMuY29uZmlnLnJvb3QpXG4gICAgICBlbHNlIHNlcnZlci53YXRjaGVyLmFkZChTT1VSQ0VfRElSKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJjaGFuZ2VcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcImNoYW5nZVwiKSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiYWRkXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJhZGRcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcInVubGlua1wiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwidW5saW5rXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJ1bmxpbmtEaXJcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcInVubGlua1wiKSlcblxuICAgICAgZnVuY3Rpb24gb25DaGFuZ2UoZmlsZTogc3RyaW5nLCBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIpIHtcbiAgICAgICAgaWYgKHJlc3RhcnRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBzZXJ2ZXIucmVzdGFydCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzV2l0aGluKGZpbGUsIHRhcmdldERpcikgfHwgaXNXaXRoaW4oZmlsZSwgb3V0RGlyKSkgcmV0dXJuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlIaXQgPSBtYXRjaFBhdGgoZmlsZSwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgaWYgKG92ZXJsYXlIaXQpIHtcbiAgICAgICAgICBzeW5jT3ZlcmxheShvdmVybGF5SGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlSGl0ID0gbWF0Y2hQYXRoKGZpbGUsIFNPVVJDRV9ESVIpXG4gICAgICAgIGlmIChzb3VyY2VIaXQgJiYgIXNvdXJjZUhpdC5yZWwuaW5jbHVkZXMoXCJyb3V0ZVRyZWUuZ2VuLnRzXCIpKSB7XG4gICAgICAgICAgc3luY1NvdXJjZShzb3VyY2VIaXQsIGtpbmQsIHRhcmdldERpciwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn1cblxuaW50ZXJmYWNlIEhpdCB7XG4gIHJlbDogc3RyaW5nXG4gIGNhdGVnb3J5OiBcImZvbGRlclwiIHwgXCJmaWxlXCIgfCBudWxsXG59XG5cbmZ1bmN0aW9uIG1hdGNoUGF0aChmaWxlOiBzdHJpbmcsIHJvb3Q6IHN0cmluZyk6IEhpdCB8IG51bGwge1xuICBpZiAoIWlzV2l0aGluKGZpbGUsIHJvb3QpIHx8IGZpbGUgPT09IHJvb3QpIHJldHVybiBudWxsXG4gIGNvbnN0IHJlbCA9IGZpbGUuc2xpY2Uocm9vdC5sZW5ndGggKyBzZXAubGVuZ3RoKVxuICByZXR1cm4geyByZWwsIGNhdGVnb3J5OiBjbGFzc2lmeShyZWwpIH1cbn1cblxuZnVuY3Rpb24gaXNXaXRoaW4oZmlsZTogc3RyaW5nLCBkaXI6IHN0cmluZykge1xuICByZXR1cm4gZmlsZSA9PT0gZGlyIHx8IGZpbGUuc3RhcnRzV2l0aChgJHtkaXJ9JHtzZXB9YClcbn1cblxuZnVuY3Rpb24gY2xhc3NpZnkocmVsOiBzdHJpbmcpOiBcImZvbGRlclwiIHwgXCJmaWxlXCIgfCBudWxsIHtcbiAgY29uc3QgW2hlYWRdID0gcmVsLnNwbGl0KHNlcClcbiAgaWYgKGhlYWQgJiYgRVNDQVBBQkxFX0ZPTERFUlMuaW5jbHVkZXMoaGVhZCkpIHJldHVybiBcImZvbGRlclwiXG4gIGlmIChFU0NBUEFCTEVfRklMRVMuaW5jbHVkZXMocmVsKSkgcmV0dXJuIFwiZmlsZVwiXG4gIC8vIE5vbi1lc2NhcGFibGUgc291cmNlIGZpbGVzIHN0aWxsIG5lZWQgdG8gZmxvdyBpbnRvIHRhcmdldCBkdXJpbmdcbiAgLy8gbGl2ZW1hcmsncyBvd24gZGV2IOKAlCB0aGUgdXNlciBpcyBlZGl0aW5nIHRoZSBjYW5vbmljYWwgc291cmNlLlxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBzeW5jT3ZlcmxheShcbiAgaGl0OiBIaXQsXG4gIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIixcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyxcbikge1xuICBpZiAoIWhpdC5jYXRlZ29yeSkgcmV0dXJuXG4gIGNvbnN0IGRlc3QgPSBqb2luKHRhcmdldERpciwgaGl0LnJlbClcbiAgY29uc3Qgc291cmNlID0gam9pbihTT1VSQ0VfRElSLCBoaXQucmVsKVxuICBpZiAoa2luZCA9PT0gXCJ1bmxpbmtcIikge1xuICAgIC8vIENvcHkgYSBmaWxlJ3MgZGVmYXVsdCBvdmVyIHRoZSBlc2NhcGUgaW4gb25lIHdyaXRlOiBhbiB1bmxpbmsgdGhlblxuICAgIC8vIGFuIGFkZCByZWFjaGVzIFZpdGUgYXMgdHdvIGV2ZW50cyBhbmQgY29zdHMgYSBwYWdlIHJlbG9hZC5cbiAgICBpZiAoIWV4aXN0c1N5bmMoc291cmNlKSB8fCBzdGF0U3luYyhzb3VyY2UpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJtU3luYyhkZXN0LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICB9XG4gICAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSkgY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qgb3ZlcmxheSA9IGpvaW4ob3ZlcnJpZGVzUm9vdCwgaGl0LnJlbClcbiAgaWYgKGV4aXN0c1N5bmMob3ZlcmxheSkpIGNwU3luYyhvdmVybGF5LCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxuZnVuY3Rpb24gc3luY1NvdXJjZShcbiAgaGl0OiBIaXQsXG4gIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIixcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyxcbikge1xuICAvLyBJZiB0aGUgY29uc3VtZXIgaGFzIGFuIG92ZXJsYXkgZm9yIHRoaXMgZmlsZSAoYW5kIGl0J3MgZXNjYXBhYmxlKSxcbiAgLy8gdGhlIG92ZXJsYXkgd2lucyDigJQgaWdub3JlIHNvdXJjZSBjaGFuZ2VzLlxuICBpZiAoaGl0LmNhdGVnb3J5ICYmIGV4aXN0c1N5bmMoam9pbihvdmVycmlkZXNSb290LCBoaXQucmVsKSkpIHJldHVyblxuICBjb25zdCBkZXN0ID0gam9pbih0YXJnZXREaXIsIGhpdC5yZWwpXG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oU09VUkNFX0RJUiwgaGl0LnJlbClcbiAgaWYgKGtpbmQgPT09IFwidW5saW5rXCIpIHtcbiAgICBybVN5bmMoZGVzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSkgY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbi8vIEEgcnVubmluZyBzZXJ2ZXIga2VlcHMgdGhlIGxpdmVtYXJrIGl0IHN0YXJ0ZWQgd2l0aDogYW4gaW4tcHJvY2VzcyByZXN0YXJ0IGNhbm5vdFxuLy8gcmVsb2FkIHRoZSBwYWNrYWdlJ3Mgb3duIG1vZHVsZXMsIHNvIGFuIHVwZ3JhZGUgaXMgcmVwb3J0ZWQgaW5zdGVhZC5cbmZ1bmN0aW9uIHdhdGNoSW5zdGFsbGVkVmVyc2lvbihzZXJ2ZXI6IFZpdGVEZXZTZXJ2ZXIsIHJvb3Q6IHN0cmluZykge1xuICBjb25zdCBwYWNrYWdlRGlyID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdClcbiAgaWYgKCFwYWNrYWdlRGlyKSByZXR1cm5cbiAgLy8gVml0ZSdzIHdhdGNoZXIgaWdub3JlcyBub2RlX21vZHVsZXMsIHNvIHRoZSBsb2NrZmlsZSBpcyB3aGF0IHNpZ25hbHMgYW4gaW5zdGFsbC5cbiAgY29uc3QgcHJvamVjdERpciA9IGRpcm5hbWUoZGlybmFtZShwYWNrYWdlRGlyKSlcbiAgY29uc3QgbWFuaWZlc3QgPSBqb2luKHBhY2thZ2VEaXIsIFwicGFja2FnZS5qc29uXCIpXG4gIGNvbnN0IHdhdGNoZWQgPSBMT0NLRklMRVMubWFwKG5hbWUgPT4gam9pbihwcm9qZWN0RGlyLCBuYW1lKSlcbiAgc2VydmVyLndhdGNoZXIuYWRkKHdhdGNoZWQpXG4gIGxldCB0aW1lcjogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWRcbiAgc2VydmVyLndhdGNoZXIub24oXCJhbGxcIiwgKF8sIGZpbGUpID0+IHtcbiAgICBpZiAoIXdhdGNoZWQuaW5jbHVkZXMoZmlsZSkpIHJldHVyblxuICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAvLyBMZXQgdGhlIHBhY2thZ2UgbWFuYWdlciBmaW5pc2ggcmVsaW5raW5nIGFmdGVyIGl0IHdyaXRlcyB0aGUgbG9ja2ZpbGUuXG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KHJlcG9ydFVwZ3JhZGUsIDEwMDApXG4gIH0pXG5cbiAgZnVuY3Rpb24gcmVwb3J0VXBncmFkZSgpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVhZFBhY2thZ2VWZXJzaW9uKG1hbmlmZXN0KVxuICAgIGlmICghdmVyc2lvbiB8fCB2ZXJzaW9uID09PSBwYWNrYWdlSnNvbi52ZXJzaW9uKSByZXR1cm5cbiAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgYGxpdmVtYXJrICR7cGFja2FnZUpzb24udmVyc2lvbn0g4oaSICR7dmVyc2lvbn0gaW5zdGFsbGVkOyByZXN0YXJ0IHRoZSBkZXYgc2VydmVyIHRvIHVzZSBpdGAsXG4gICAgICB7IHRpbWVzdGFtcDogdHJ1ZSB9LFxuICAgIClcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290OiBzdHJpbmcpIHtcbiAgZm9yIChsZXQgZGlyID0gcm9vdDsgOyBkaXIgPSBkaXJuYW1lKGRpcikpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlyID0gam9pbihkaXIsIFwibm9kZV9tb2R1bGVzXCIsIHBhY2thZ2VKc29uLm5hbWUpXG4gICAgaWYgKGV4aXN0c1N5bmMocGFja2FnZURpcikpIHJldHVybiBwYWNrYWdlRGlyXG4gICAgaWYgKGRpcm5hbWUoZGlyKSA9PT0gZGlyKSByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VWZXJzaW9uKG1hbmlmZXN0OiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQ6IHVua25vd24gPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhtYW5pZmVzdCwgXCJ1dGY4XCIpKVxuICAgIHJldHVybiBpc09iamVjdChwYXJzZWQpICYmIHR5cGVvZiBwYXJzZWQudmVyc2lvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBwYXJzZWQudmVyc2lvblxuICAgICAgOiB1bmRlZmluZWRcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbi8qKiBSZXNvbHZlIGxpdmVtYXJrLmNvbmZpZy50cydzIGB2aXRlYCBmaWVsZCDigJQgZWl0aGVyIGEgY29uZmlnIG9iamVjdFxuICogIG9yIGEgZnVuY3Rpb24gYChlbnYpID0+IGNvbmZpZ2AgKG1hdGNoaW5nIFZpdGUncyBvd24gYGRlZmluZUNvbmZpZ2ApLlxuICogIFNjaGVtYSBzdG9yZXMgaXQgYXMgYHVua25vd25gOyB0eXBpbmcgZm9yIHRoZSBjb25zdW1lcidzIGVkaXRvclxuICogIGxpdmVzIG9uIHtAbGluayBWaXRlT3ZlcnJpZGV9LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZpdGVPdmVycmlkZShcbiAgdml0ZTogdW5rbm93bixcbiAgZW52OiBDb25maWdFbnYsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4ge1xuICBpZiAoIXZpdGUpIHJldHVybiBudWxsXG4gIGlmICh0eXBlb2Ygdml0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseSh2aXRlLCB1bmRlZmluZWQsIFtlbnZdKVxuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogbnVsbFxuICB9XG4gIHJldHVybiBpc09iamVjdCh2aXRlKSA/IHZpdGUgOiBudWxsXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHY6IHVua25vd24pOiB2IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livemark",
|
|
3
|
-
"version": "0.28.
|
|
3
|
+
"version": "0.28.3",
|
|
4
4
|
"description": "Livemark description",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Evgeny Karev",
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
"./components/*": "./source/components/*.tsx",
|
|
24
24
|
"./elements/*": "./source/elements/*.tsx",
|
|
25
25
|
"./hooks/*": "./source/hooks/*.ts",
|
|
26
|
-
"./styles/*": "./source/styles/*.css"
|
|
26
|
+
"./styles/*": "./source/styles/*.css",
|
|
27
|
+
"./env": "./source/env.d.ts"
|
|
27
28
|
},
|
|
28
29
|
"dependencies": {
|
|
29
30
|
"@base-ui/react": "1.9.0",
|
|
@@ -113,7 +113,7 @@ Any [Shiki theme](https://shiki.style/themes) name works. Defaults keep the catp
|
|
|
113
113
|
|
|
114
114
|
## Autoreload
|
|
115
115
|
|
|
116
|
-
The dev server watches `livemark.config.ts` and restarts on edit. No need to kill `npx livemark start` after tweaking the config.
|
|
116
|
+
The dev server watches `livemark.config.ts` and every local file it imports, and restarts on edit. No need to kill `npx livemark start` after tweaking the config. A broken config only pauses it: the error prints, and the next save retries. Upgrading `livemark` itself is the one change that needs a manual restart; the server prints a notice when it sees one.
|
|
117
117
|
|
|
118
118
|
## Verification
|
|
119
119
|
|
|
@@ -135,7 +135,7 @@ Add tags with the config `head` field (`livemark-configuration`); escape `head.t
|
|
|
135
135
|
|
|
136
136
|
## Verification
|
|
137
137
|
|
|
138
|
-
- The project's type check (e.g. `npx tsc --noEmit`) — confirms overrides typecheck.
|
|
138
|
+
- The project's type check (e.g. `npx tsc --noEmit`) — confirms overrides typecheck. `livemark:virtual` types load through `livemark.config.ts`'s import of `livemark`; a program without that file adds `/// <reference types="livemark/env" />`. Never hand-declare the module.
|
|
139
139
|
- `npx livemark build` — smoke-test the override lands in the bundle.
|
|
140
140
|
- Browser: load an article page with the dev server; custom Footer/Sidebar/etc. should render without a full reload.
|
|
141
141
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync } from "node:fs"
|
|
2
2
|
import { dirname, resolve } from "node:path"
|
|
3
|
-
import {
|
|
3
|
+
import { runnerImport } from "vite"
|
|
4
4
|
import type { Config, UserConfig } from "../../models/config.ts"
|
|
5
5
|
import { resolveBase } from "../../helpers/resolve-base.ts"
|
|
6
6
|
import { defineConfig } from "./define.ts"
|
|
@@ -38,11 +38,14 @@ export async function loadConfig(path?: string): Promise<Config> {
|
|
|
38
38
|
const explicit = path ?? cliPath
|
|
39
39
|
const resolved = resolve(explicit ?? "livemark.config.ts")
|
|
40
40
|
let input: UserConfig = {}
|
|
41
|
+
let configDependencies: string[] = []
|
|
41
42
|
if (existsSync(resolved)) {
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
input =
|
|
43
|
+
// Not `import()`: Node caches the files a config imports for the process lifetime,
|
|
44
|
+
// so a dev-server restart would keep their old contents.
|
|
45
|
+
const result = await runnerImport<{ default?: UserConfig }>(resolved)
|
|
46
|
+
input = result.module.default ?? {}
|
|
47
|
+
// Vite ids use `/` even on Windows, where the watcher reports `\` paths.
|
|
48
|
+
configDependencies = result.dependencies.map(dependency => resolve(dependency))
|
|
46
49
|
} else if (explicit) {
|
|
47
50
|
throw new Error(`Config file not found: ${resolved}`)
|
|
48
51
|
}
|
|
@@ -51,5 +54,11 @@ export async function loadConfig(path?: string): Promise<Config> {
|
|
|
51
54
|
// CLI verb. Downstream consumers (Vite plugin, content-collections,
|
|
52
55
|
// runtime) get a plain string|undefined and never see the function.
|
|
53
56
|
const base = resolveBase(validated.base, detectCommand())
|
|
54
|
-
return {
|
|
57
|
+
return {
|
|
58
|
+
...validated,
|
|
59
|
+
base,
|
|
60
|
+
root: dirname(resolved),
|
|
61
|
+
configPath: resolved,
|
|
62
|
+
configDependencies,
|
|
63
|
+
}
|
|
55
64
|
}
|
|
@@ -41,4 +41,21 @@ describe("loadConfig", () => {
|
|
|
41
41
|
expect(config.include).toBe("**/*.md")
|
|
42
42
|
expect(config.title).toBe("Livemark")
|
|
43
43
|
}))
|
|
44
|
+
|
|
45
|
+
it("should reload the files a config imports and list them as dependencies", () =>
|
|
46
|
+
temporaryDirectoryTask(async tmpDir => {
|
|
47
|
+
const configPath = join(tmpDir, "livemark.config.ts")
|
|
48
|
+
const titlePath = join(tmpDir, "title.ts")
|
|
49
|
+
fs.writeFileSync(
|
|
50
|
+
configPath,
|
|
51
|
+
'import { title } from "./title.ts"\nexport default { title }\n',
|
|
52
|
+
)
|
|
53
|
+
fs.writeFileSync(titlePath, 'export const title = "First"\n')
|
|
54
|
+
const first = await loadConfig(configPath)
|
|
55
|
+
fs.writeFileSync(titlePath, 'export const title = "Second"\n')
|
|
56
|
+
const second = await loadConfig(configPath)
|
|
57
|
+
expect(first.title).toBe("First")
|
|
58
|
+
expect(second.title).toBe("Second")
|
|
59
|
+
expect(second.configDependencies).toContain(titlePath)
|
|
60
|
+
}))
|
|
44
61
|
})
|
package/source/commands/start.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { watch } from "node:fs"
|
|
1
2
|
import { join } from "node:path"
|
|
2
3
|
import { Command } from "commander"
|
|
3
4
|
import { createServer } from "vite"
|
|
4
5
|
|
|
5
6
|
const configFile = join(import.meta.dirname, "..", "..", "source", "vite.config.ts")
|
|
7
|
+
const IGNORED_DIRS = /(^|[/\\])(node_modules|\.git|\.livemark)([/\\]|$)/
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Start a development server.
|
|
@@ -10,6 +12,13 @@ const configFile = join(import.meta.dirname, "..", "..", "source", "vite.config.
|
|
|
10
12
|
export const start = new Command("start")
|
|
11
13
|
.description("Start a live server")
|
|
12
14
|
.action(async () => {
|
|
15
|
+
await startServer()
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
// A broken config fails `createServer` before Vite's watcher exists, so without this
|
|
19
|
+
// the process exits and the fix has nobody to pick it up.
|
|
20
|
+
async function startServer() {
|
|
21
|
+
try {
|
|
13
22
|
const server = await createServer({
|
|
14
23
|
configFile,
|
|
15
24
|
server: { port: 8000, host: true },
|
|
@@ -17,4 +26,19 @@ export const start = new Command("start")
|
|
|
17
26
|
await server.listen()
|
|
18
27
|
server.printUrls()
|
|
19
28
|
server.bindCLIShortcuts({ print: true })
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error(error)
|
|
31
|
+
console.error("\nWaiting for a file change to retry…")
|
|
32
|
+
await waitForChange(process.cwd())
|
|
33
|
+
await startServer()
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function waitForChange(dir: string) {
|
|
38
|
+
return new Promise<void>(resolve => {
|
|
39
|
+
const watcher = watch(dir, { recursive: true, ignore: IGNORED_DIRS }, () => {
|
|
40
|
+
watcher.close()
|
|
41
|
+
resolve()
|
|
42
|
+
})
|
|
20
43
|
})
|
|
44
|
+
}
|
|
@@ -236,7 +236,7 @@ const articles = defineCollection({
|
|
|
236
236
|
],
|
|
237
237
|
},
|
|
238
238
|
)
|
|
239
|
-
const tocItems = extractToc(
|
|
239
|
+
const tocItems = extractToc(bodyContent)
|
|
240
240
|
const searchText = extractSearchText(content)
|
|
241
241
|
const lastUpdated = lastUpdatedByFile.get(doc._meta.filePath)
|
|
242
242
|
const image = doc.image
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs"
|
|
2
|
+
import { dirname, resolve } from "node:path"
|
|
3
|
+
|
|
4
|
+
// Enough for this repo's own source, which always imports by full relative path.
|
|
5
|
+
const RELATIVE_IMPORT = /(?:from|import)\s*["'](\.{1,2}\/[^"']+)["']/g
|
|
6
|
+
|
|
7
|
+
/** The module and every file it reaches through relative imports, as absolute paths. */
|
|
8
|
+
export function collectLocalImports(entry: string) {
|
|
9
|
+
const seen = new Set<string>()
|
|
10
|
+
const queue = [resolve(entry)]
|
|
11
|
+
for (const file of queue) {
|
|
12
|
+
if (seen.has(file) || !existsSync(file)) continue
|
|
13
|
+
seen.add(file)
|
|
14
|
+
for (const [, specifier] of readFileSync(file, "utf8").matchAll(RELATIVE_IMPORT)) {
|
|
15
|
+
if (specifier) queue.push(resolve(dirname(file), specifier))
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return [...seen]
|
|
19
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import fs from "node:fs"
|
|
2
|
+
import { join } from "node:path"
|
|
3
|
+
import { temporaryDirectoryTask } from "tempy"
|
|
4
|
+
import { describe, expect, it } from "vite-plus/test"
|
|
5
|
+
import { collectLocalImports } from "./local-imports.ts"
|
|
6
|
+
|
|
7
|
+
describe("collectLocalImports", () => {
|
|
8
|
+
it("should follow relative imports transitively and skip packages", () =>
|
|
9
|
+
temporaryDirectoryTask(tmpDir => {
|
|
10
|
+
fs.mkdirSync(join(tmpDir, "lib"))
|
|
11
|
+
fs.writeFileSync(
|
|
12
|
+
join(tmpDir, "entry.ts"),
|
|
13
|
+
'import { a } from "./lib/a.ts"\nimport { z } from "zod"\n',
|
|
14
|
+
)
|
|
15
|
+
fs.writeFileSync(
|
|
16
|
+
join(tmpDir, "lib", "a.ts"),
|
|
17
|
+
'import "../b.ts"\nexport const a = 1\n',
|
|
18
|
+
)
|
|
19
|
+
fs.writeFileSync(join(tmpDir, "b.ts"), 'export * from "./entry.ts"\n')
|
|
20
|
+
expect(collectLocalImports(join(tmpDir, "entry.ts")).sort()).toEqual(
|
|
21
|
+
[
|
|
22
|
+
join(tmpDir, "b.ts"),
|
|
23
|
+
join(tmpDir, "entry.ts"),
|
|
24
|
+
join(tmpDir, "lib", "a.ts"),
|
|
25
|
+
].sort(),
|
|
26
|
+
)
|
|
27
|
+
}))
|
|
28
|
+
|
|
29
|
+
it("should skip imports that do not resolve to a file", () =>
|
|
30
|
+
temporaryDirectoryTask(tmpDir => {
|
|
31
|
+
fs.writeFileSync(join(tmpDir, "entry.ts"), 'import "./missing.ts"\n')
|
|
32
|
+
expect(collectLocalImports(join(tmpDir, "entry.ts"))).toEqual([
|
|
33
|
+
join(tmpDir, "entry.ts"),
|
|
34
|
+
])
|
|
35
|
+
}))
|
|
36
|
+
})
|
package/source/helpers/toc.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import GithubSlugger from "github-slugger"
|
|
1
|
+
import GithubSlugger, { slug as slugOnce } from "github-slugger"
|
|
2
|
+
import type { Root } from "mdast"
|
|
3
|
+
import { toString } from "mdast-util-to-string"
|
|
4
|
+
import remarkGfm from "remark-gfm"
|
|
5
|
+
import remarkParse from "remark-parse"
|
|
6
|
+
import { unified } from "unified"
|
|
7
|
+
import { visit } from "unist-util-visit"
|
|
2
8
|
import type { TocItem } from "../models/toc.ts"
|
|
3
9
|
|
|
4
10
|
const CUSTOM_ID_PATTERN = /\s*\[#([^\]]+)\]\s*$/
|
|
@@ -6,41 +12,35 @@ const TOC_HIDDEN_PATTERN = /\s*\[!toc\]\s*$/
|
|
|
6
12
|
const TOC_ONLY_PATTERN = /\s*\[toc\]\s*$/
|
|
7
13
|
const STEP_PATTERN = /\s*\[step\]\s*$/
|
|
8
14
|
|
|
9
|
-
/** Extract TOC headings from
|
|
15
|
+
/** Extract TOC headings from markdown content, with ids matching the rendered headings */
|
|
10
16
|
export function extractToc(content: string): TocItem[] {
|
|
17
|
+
const tree: Root = unified().use(remarkParse).use(remarkGfm).parse(content)
|
|
11
18
|
const slugger = new GithubSlugger()
|
|
12
19
|
const items: TocItem[] = []
|
|
13
|
-
const headingRegex = /^(#{2,4})\s+(.+)$/
|
|
14
|
-
const lines = content.split("\n")
|
|
15
|
-
let inCodeBlock = false
|
|
16
20
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
// rehype-slug numbers duplicates across every rendered heading, so hidden, step and
|
|
22
|
+
// out-of-range headings advance the slugger; `[toc]` ones are never rendered, so do not
|
|
23
|
+
visit(tree, "heading", node => {
|
|
24
|
+
const lastChild = node.children.at(-1)
|
|
25
|
+
const marker = lastChild?.type === "text" ? lastChild.value : ""
|
|
26
|
+
const isTocOnly = TOC_ONLY_PATTERN.test(marker)
|
|
27
|
+
const isHidden = TOC_HIDDEN_PATTERN.test(marker) || STEP_PATTERN.test(marker)
|
|
28
|
+
const customId = CUSTOM_ID_PATTERN.exec(marker)?.[1]
|
|
29
|
+
|
|
30
|
+
if (lastChild?.type === "text") {
|
|
31
|
+
lastChild.value = marker
|
|
32
|
+
.replace(CUSTOM_ID_PATTERN, "")
|
|
33
|
+
.replace(TOC_ONLY_PATTERN, "")
|
|
34
|
+
.replace(TOC_HIDDEN_PATTERN, "")
|
|
35
|
+
.replace(STEP_PATTERN, "")
|
|
21
36
|
}
|
|
22
|
-
if (inCodeBlock) continue
|
|
23
37
|
|
|
24
|
-
const
|
|
25
|
-
|
|
38
|
+
const title = toString(node).trim()
|
|
39
|
+
const slug = customId ?? (isTocOnly ? slugOnce(title) : slugger.slug(title))
|
|
26
40
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (TOC_HIDDEN_PATTERN.test(rawTitle)) continue
|
|
31
|
-
if (STEP_PATTERN.test(rawTitle)) continue
|
|
32
|
-
|
|
33
|
-
const idMatch = CUSTOM_ID_PATTERN.exec(rawTitle)
|
|
34
|
-
const title = rawTitle
|
|
35
|
-
.replace(CUSTOM_ID_PATTERN, "")
|
|
36
|
-
.replace(TOC_ONLY_PATTERN, "")
|
|
37
|
-
.replace(STEP_PATTERN, "")
|
|
38
|
-
.replace(/\*\*(.+?)\*\*/g, "$1")
|
|
39
|
-
.replace(/`(.+?)`/g, "$1")
|
|
40
|
-
const slug = idMatch?.[1] ?? slugger.slug(title)
|
|
41
|
-
|
|
42
|
-
items.push({ url: `#${slug}`, title, depth })
|
|
43
|
-
}
|
|
41
|
+
if (isHidden || node.depth < 2 || node.depth > 4) return
|
|
42
|
+
items.push({ url: `#${slug}`, title, depth: node.depth })
|
|
43
|
+
})
|
|
44
44
|
|
|
45
45
|
return items
|
|
46
46
|
}
|
|
@@ -60,6 +60,33 @@ describe("extractToc", () => {
|
|
|
60
60
|
])
|
|
61
61
|
})
|
|
62
62
|
|
|
63
|
+
it("should render link and emphasis headings as plain text", () => {
|
|
64
|
+
const content =
|
|
65
|
+
"## [0.6.0](https://github.com/o/r/compare/v0.5.0...v0.6.0) (2026-10-20)\n\n" +
|
|
66
|
+
"### *Bug* ~~Fixes~~"
|
|
67
|
+
const toc = extractToc(content)
|
|
68
|
+
expect(toc).toEqual([
|
|
69
|
+
{ url: "#060-2026-10-20", title: "0.6.0 (2026-10-20)", depth: 2 },
|
|
70
|
+
{ url: "#bug-fixes", title: "Bug Fixes", depth: 3 },
|
|
71
|
+
])
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
it("should number duplicate slugs counting hidden and h1 headings", () => {
|
|
75
|
+
const content =
|
|
76
|
+
"# Features\n\n## Features [!toc]\n\n## Features\n\n### Features [step]\n\n## Features"
|
|
77
|
+
const toc = extractToc(content)
|
|
78
|
+
expect(toc).toEqual([
|
|
79
|
+
{ url: "#features-2", title: "Features", depth: 2 },
|
|
80
|
+
{ url: "#features-4", title: "Features", depth: 2 },
|
|
81
|
+
])
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
it("should ignore headings inside code fences", () => {
|
|
85
|
+
const content = "## Real\n\n```md\n## Fake\n```"
|
|
86
|
+
const toc = extractToc(content)
|
|
87
|
+
expect(toc).toEqual([{ url: "#real", title: "Real", depth: 2 }])
|
|
88
|
+
})
|
|
89
|
+
|
|
63
90
|
it("should include [toc] headings with annotation stripped from title", () => {
|
|
64
91
|
const content = "## Regular\n\n## TOC Only [toc]\n\n## Another"
|
|
65
92
|
const toc = extractToc(content)
|
package/source/index.ts
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs"
|
|
2
|
+
import { join } from "node:path"
|
|
3
|
+
import { describe, expect, it } from "vite-plus/test"
|
|
4
|
+
import packageJson from "../package.json" with { type: "json" }
|
|
5
|
+
|
|
6
|
+
const ROOT = join(import.meta.dirname, "..")
|
|
7
|
+
|
|
8
|
+
describe("consumer types", () => {
|
|
9
|
+
it("load livemark:virtual through the public entry", () => {
|
|
10
|
+
const index = readFileSync(join(ROOT, "source/index.ts"), "utf8")
|
|
11
|
+
expect(index).toContain('/// <reference types="livemark/env" preserve="true" />')
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
it("export the ambient declarations", () => {
|
|
15
|
+
expect(packageJson.exports["./env"]).toBe("./source/env.d.ts")
|
|
16
|
+
expect(existsSync(join(ROOT, packageJson.exports["./env"]))).toBe(true)
|
|
17
|
+
})
|
|
18
|
+
})
|